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

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

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

branches/ripleygmg_from_3668/ripley/src/Brick.cpp revision 3762 by caltinay, Tue Jan 10 00:01:45 2012 UTC trunk/ripley/src/Brick.cpp revision 3806 by caltinay, Mon Feb 6 02:32:48 2012 UTC
# Line 1  Line 1 
1    
2  /*******************************************************  /*******************************************************
3  *  *
4  * Copyright (c) 2003-2011 by University of Queensland  * Copyright (c) 2003-2012 by University of Queensland
5  * Earth Systems Science Computational Center (ESSCC)  * Earth Systems Science Computational Center (ESSCC)
6  * http://www.uq.edu.au/esscc  * http://www.uq.edu.au/esscc
7  *  *
# Line 13  Line 13 
13    
14  #include <ripley/Brick.h>  #include <ripley/Brick.h>
15  extern "C" {  extern "C" {
16  #include "paso/SystemMatrix.h"  #include <paso/SystemMatrix.h>
17  }  }
18    
19  #if USE_SILO  #if USE_SILO
# Line 29  using namespace std; Line 29  using namespace std;
29    
30  namespace ripley {  namespace ripley {
31    
32  Brick::Brick(int n0, int n1, int n2, double l0, double l1, double l2, int d0,  Brick::Brick(int n0, int n1, int n2, double x0, double y0, double z0,
33               int d1, int d2) :               double x1, double y1, double z1, int d0, int d1, int d2) :
34      RipleyDomain(3),      RipleyDomain(3),
35      m_gNE0(n0),      m_gNE0(n0),
36      m_gNE1(n1),      m_gNE1(n1),
37      m_gNE2(n2),      m_gNE2(n2),
38      m_l0(l0),      m_x0(x0),
39      m_l1(l1),      m_y0(y0),
40      m_l2(l2),      m_z0(z0),
41        m_l0(x1-x0),
42        m_l1(y1-y0),
43        m_l2(z1-z0),
44      m_NX(d0),      m_NX(d0),
45      m_NY(d1),      m_NY(d1),
46      m_NZ(d2)      m_NZ(d2)
# Line 54  Brick::Brick(int n0, int n1, int n2, dou Line 57  Brick::Brick(int n0, int n1, int n2, dou
57          throw RipleyException("Too few elements for the number of ranks");          throw RipleyException("Too few elements for the number of ranks");
58    
59      // local number of elements (including overlap)      // local number of elements (including overlap)
60      m_NE0 = (m_NX>1 ? (n0+1)/m_NX : n0);      m_NE0 = m_ownNE0 = (m_NX>1 ? (n0+1)/m_NX : n0);
61      if (m_mpiInfo->rank%m_NX>0 && m_mpiInfo->rank%m_NX<m_NX-1)      if (m_mpiInfo->rank%m_NX>0 && m_mpiInfo->rank%m_NX<m_NX-1)
62          m_NE0++;          m_NE0++;
63      m_NE1 = (m_NY>1 ? (n1+1)/m_NY : n1);      else if (m_NX>1 && m_mpiInfo->rank%m_NX==m_NX-1)
64            m_ownNE0--;
65    
66        m_NE1 = m_ownNE1 = (m_NY>1 ? (n1+1)/m_NY : n1);
67      if (m_mpiInfo->rank%(m_NX*m_NY)/m_NX>0 && m_mpiInfo->rank%(m_NX*m_NY)/m_NX<m_NY-1)      if (m_mpiInfo->rank%(m_NX*m_NY)/m_NX>0 && m_mpiInfo->rank%(m_NX*m_NY)/m_NX<m_NY-1)
68          m_NE1++;          m_NE1++;
69      m_NE2 = (m_NZ>1 ? (n2+1)/m_NZ : n2);      else if (m_NY>1 && m_mpiInfo->rank%(m_NX*m_NY)/m_NX==m_NY-1)
70            m_ownNE1--;
71    
72        m_NE2 = m_ownNE2 = (m_NZ>1 ? (n2+1)/m_NZ : n2);
73      if (m_mpiInfo->rank/(m_NX*m_NY)>0 && m_mpiInfo->rank/(m_NX*m_NY)<m_NZ-1)      if (m_mpiInfo->rank/(m_NX*m_NY)>0 && m_mpiInfo->rank/(m_NX*m_NY)<m_NZ-1)
74          m_NE2++;          m_NE2++;
75        else if (m_NZ>1 && m_mpiInfo->rank/(m_NX*m_NY)==m_NZ-1)
76            m_ownNE2--;
77    
78      // local number of nodes      // local number of nodes
79      m_N0 = m_NE0+1;      m_N0 = m_NE0+1;
# Line 87  Brick::Brick(int n0, int n1, int n2, dou Line 98  Brick::Brick(int n0, int n1, int n2, dou
98    
99  Brick::~Brick()  Brick::~Brick()
100  {  {
101        Paso_SystemMatrixPattern_free(m_pattern);
102        Paso_Connector_free(m_connector);
103  }  }
104    
105  string Brick::getDescription() const  string Brick::getDescription() const
# Line 100  bool Brick::operator==(const AbstractDom Line 113  bool Brick::operator==(const AbstractDom
113      if (o) {      if (o) {
114          return (RipleyDomain::operator==(other) &&          return (RipleyDomain::operator==(other) &&
115                  m_gNE0==o->m_gNE0 && m_gNE1==o->m_gNE1 && m_gNE2==o->m_gNE2                  m_gNE0==o->m_gNE0 && m_gNE1==o->m_gNE1 && m_gNE2==o->m_gNE2
116                    && m_x0==o->m_x0 && m_y0==o->m_y0 && m_z0==o->m_z0
117                  && m_l0==o->m_l0 && m_l1==o->m_l1 && m_l2==o->m_l2                  && m_l0==o->m_l0 && m_l1==o->m_l1 && m_l2==o->m_l2
118                  && m_NX==o->m_NX && m_NY==o->m_NY && m_NZ==o->m_NZ);                  && m_NX==o->m_NX && m_NY==o->m_NY && m_NZ==o->m_NZ);
119      }      }
# Line 115  void Brick::dump(const string& fileName) Line 129  void Brick::dump(const string& fileName)
129          fn+=".silo";          fn+=".silo";
130      }      }
131    
     const int NUM_SILO_FILES = 1;  
     const char* blockDirFmt = "/block%04d";  
132      int driver=DB_HDF5;          int driver=DB_HDF5;    
133      string siloPath;      string siloPath;
134      DBfile* dbfile = NULL;      DBfile* dbfile = NULL;
135    
136  #ifdef ESYS_MPI  #ifdef ESYS_MPI
137      PMPIO_baton_t* baton = NULL;      PMPIO_baton_t* baton = NULL;
138        const int NUM_SILO_FILES = 1;
139        const char* blockDirFmt = "/block%04d";
140  #endif  #endif
141    
142      if (m_mpiInfo->size > 1) {      if (m_mpiInfo->size > 1) {
# Line 248  void Brick::dump(const string& fileName) Line 262  void Brick::dump(const string& fileName)
262      }      }
263    
264  #else // USE_SILO  #else // USE_SILO
265      throw RipleyException("dump(): no Silo support");      throw RipleyException("dump: no Silo support");
266  #endif  #endif
267  }  }
268    
# Line 272  const int* Brick::borrowSampleReferenceI Line 286  const int* Brick::borrowSampleReferenceI
286      }      }
287    
288      stringstream msg;      stringstream msg;
289      msg << "borrowSampleReferenceIDs() not implemented for function space type "      msg << "borrowSampleReferenceIDs: invalid function space type "<<fsType;
         << fsType;  
290      throw RipleyException(msg.str());      throw RipleyException(msg.str());
291  }  }
292    
# Line 327  bool Brick::ownSample(int fsType, index_ Line 340  bool Brick::ownSample(int fsType, index_
340      }      }
341    
342      stringstream msg;      stringstream msg;
343      msg << "ownSample() not implemented for "      msg << "ownSample: invalid function space type " << fsType;
         << functionSpaceTypeAsString(fsType);  
344      throw RipleyException(msg.str());      throw RipleyException(msg.str());
345  }  }
346    
 void Brick::setToGradient(escript::Data& out, const escript::Data& cIn) const  
 {  
     escript::Data& in = *const_cast<escript::Data*>(&cIn);  
     const dim_t numComp = in.getDataPointSize();  
     const double h0 = m_l0/m_gNE0;  
     const double h1 = m_l1/m_gNE1;  
     const double h2 = m_l1/m_gNE2;  
     const double C0 = .044658198738520451079;  
     const double C1 = .16666666666666666667;  
     const double C2 = .21132486540518711775;  
     const double C3 = .25;  
     const double C4 = .5;  
     const double C5 = .62200846792814621559;  
     const double C6 = .78867513459481288225;  
   
     if (out.getFunctionSpace().getTypeCode() == Elements) {  
         out.requireWrite();  
         /*** GENERATOR SNIP_GRAD_ELEMENTS TOP */  
 #pragma omp parallel for  
         for (index_t k2=0; k2 < m_NE2; ++k2) {  
             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,k2, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));  
                     for (index_t i=0; i < numComp; ++i) {  
                         const double V0=((f_100[i]-f_000[i])*C5 + (f_111[i]-f_011[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;  
                         const double V1=((f_110[i]-f_010[i])*C5 + (f_101[i]-f_001[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;  
                         const double V2=((f_101[i]-f_001[i])*C5 + (f_110[i]-f_010[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;  
                         const double V3=((f_111[i]-f_011[i])*C5 + (f_100[i]-f_000[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;  
                         const double V4=((f_010[i]-f_000[i])*C5 + (f_111[i]-f_101[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;  
                         const double V5=((f_110[i]-f_100[i])*C5 + (f_011[i]-f_001[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;  
                         const double V6=((f_011[i]-f_001[i])*C5 + (f_110[i]-f_100[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;  
                         const double V7=((f_111[i]-f_101[i])*C5 + (f_010[i]-f_000[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;  
                         const double V8=((f_001[i]-f_000[i])*C5 + (f_111[i]-f_110[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;  
                         const double V9=((f_101[i]-f_100[i])*C5 + (f_011[i]-f_010[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;  
                         const double V10=((f_011[i]-f_010[i])*C5 + (f_101[i]-f_100[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;  
                         const double V11=((f_111[i]-f_110[i])*C5 + (f_001[i]-f_000[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;  
                         o[INDEX3(i,0,0,numComp,3)] = V0;  
                         o[INDEX3(i,1,0,numComp,3)] = V4;  
                         o[INDEX3(i,2,0,numComp,3)] = V8;  
                         o[INDEX3(i,0,1,numComp,3)] = V0;  
                         o[INDEX3(i,1,1,numComp,3)] = V5;  
                         o[INDEX3(i,2,1,numComp,3)] = V9;  
                         o[INDEX3(i,0,2,numComp,3)] = V1;  
                         o[INDEX3(i,1,2,numComp,3)] = V4;  
                         o[INDEX3(i,2,2,numComp,3)] = V10;  
                         o[INDEX3(i,0,3,numComp,3)] = V1;  
                         o[INDEX3(i,1,3,numComp,3)] = V5;  
                         o[INDEX3(i,2,3,numComp,3)] = V11;  
                         o[INDEX3(i,0,4,numComp,3)] = V2;  
                         o[INDEX3(i,1,4,numComp,3)] = V6;  
                         o[INDEX3(i,2,4,numComp,3)] = V8;  
                         o[INDEX3(i,0,5,numComp,3)] = V2;  
                         o[INDEX3(i,1,5,numComp,3)] = V7;  
                         o[INDEX3(i,2,5,numComp,3)] = V9;  
                         o[INDEX3(i,0,6,numComp,3)] = V3;  
                         o[INDEX3(i,1,6,numComp,3)] = V6;  
                         o[INDEX3(i,2,6,numComp,3)] = V10;  
                         o[INDEX3(i,0,7,numComp,3)] = V3;  
                         o[INDEX3(i,1,7,numComp,3)] = V7;  
                         o[INDEX3(i,2,7,numComp,3)] = V11;  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k1 loop */  
         } /* end of k2 loop */  
         /* GENERATOR SNIP_GRAD_ELEMENTS BOTTOM */  
     } else if (out.getFunctionSpace().getTypeCode() == ReducedElements) {  
         out.requireWrite();  
         /*** GENERATOR SNIP_GRAD_REDUCED_ELEMENTS TOP */  
 #pragma omp parallel for  
         for (index_t k2=0; k2 < m_NE2; ++k2) {  
             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,k2, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_010[i]-f_011[i])*C3 / h0;  
                         o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_100[i]-f_101[i])*C3 / h1;  
                         o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]+f_101[i]+f_111[i]-f_000[i]-f_010[i]-f_100[i]-f_110[i])*C3 / h2;  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k1 loop */  
         } /* end of k2 loop */  
         /* GENERATOR SNIP_GRAD_REDUCED_ELEMENTS BOTTOM */  
     } else if (out.getFunctionSpace().getTypeCode() == FaceElements) {  
         out.requireWrite();  
         /*** GENERATOR SNIP_GRAD_FACES TOP */  
 #pragma omp parallel  
         {  
             if (m_faceOffset[0] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));  
                         const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));  
                         const register double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));  
                         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(1,k1+1,k2, m_N0,m_N1));  
                         const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));  
                         const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));  
                         const register double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));  
                         double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const double V0=((f_010[i]-f_000[i])*C6 + (f_011[i]-f_001[i])*C2) / h1;  
                             const double V1=((f_010[i]-f_000[i])*C2 + (f_011[i]-f_001[i])*C6) / h1;  
                             const double V2=((f_001[i]-f_000[i])*C6 + (f_010[i]-f_011[i])*C2) / h2;  
                             const double V3=((f_001[i]-f_000[i])*C2 + (f_011[i]-f_010[i])*C6) / h2;  
                             o[INDEX3(i,0,0,numComp,3)] = ((f_100[i]-f_000[i])*C5 + (f_111[i]-f_011[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = V0;  
                             o[INDEX3(i,2,0,numComp,3)] = V2;  
                             o[INDEX3(i,0,1,numComp,3)] = ((f_110[i]-f_010[i])*C5 + (f_101[i]-f_001[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;  
                             o[INDEX3(i,1,1,numComp,3)] = V0;  
                             o[INDEX3(i,2,1,numComp,3)] = V3;  
                             o[INDEX3(i,0,2,numComp,3)] = ((f_101[i]-f_001[i])*C5 + (f_110[i]-f_010[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;  
                             o[INDEX3(i,1,2,numComp,3)] = V1;  
                             o[INDEX3(i,2,2,numComp,3)] = V2;  
                             o[INDEX3(i,0,3,numComp,3)] = ((f_111[i]-f_011[i])*C5 + (f_100[i]-f_000[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;  
                             o[INDEX3(i,1,3,numComp,3)] = V1;  
                             o[INDEX3(i,2,3,numComp,3)] = V3;  
                         } /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             } /* end of face 0 */  
             if (m_faceOffset[1] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const register double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));  
                         const register double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));  
                         const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));  
                         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(m_N0-1,k1+1,k2, m_N0,m_N1));  
                         const register double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));  
                         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(m_N0-1,k1,k2, m_N0,m_N1));  
                         double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const double V0=((f_110[i]-f_100[i])*C6 + (f_111[i]-f_101[i])*C2) / h1;  
                             const double V1=((f_110[i]-f_100[i])*C2 + (f_111[i]-f_101[i])*C6) / h1;  
                             const double V2=((f_101[i]-f_100[i])*C6 + (f_111[i]-f_110[i])*C2) / h2;  
                             const double V3=((f_101[i]-f_100[i])*C2 + (f_111[i]-f_110[i])*C6) / h2;  
                             o[INDEX3(i,0,0,numComp,3)] = ((f_100[i]-f_000[i])*C5 + (f_111[i]-f_011[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = V0;  
                             o[INDEX3(i,2,0,numComp,3)] = V2;  
                             o[INDEX3(i,0,1,numComp,3)] = ((f_110[i]-f_010[i])*C5 + (f_101[i]-f_001[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;  
                             o[INDEX3(i,1,1,numComp,3)] = V0;  
                             o[INDEX3(i,2,1,numComp,3)] = V3;  
                             o[INDEX3(i,0,2,numComp,3)] = ((f_101[i]-f_001[i])*C5 + (f_110[i]-f_010[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;  
                             o[INDEX3(i,1,2,numComp,3)] = V1;  
                             o[INDEX3(i,2,2,numComp,3)] = V2;  
                             o[INDEX3(i,0,3,numComp,3)] = ((f_111[i]-f_011[i])*C5 + (f_100[i]-f_000[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;  
                             o[INDEX3(i,1,3,numComp,3)] = V1;  
                             o[INDEX3(i,2,3,numComp,3)] = V3;  
                         } /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             } /* end of face 1 */  
             if (m_faceOffset[2] > -1) {  
 #pragma omp for nowait  
                 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) {  
                             const double V0=((f_100[i]-f_000[i])*C6 + (f_101[i]-f_001[i])*C2) / h0;  
                             const double V1=((f_001[i]-f_000[i])*C6 + (f_101[i]-f_100[i])*C2) / h2;  
                             const double V2=((f_001[i]-f_000[i])*C2 + (f_101[i]-f_100[i])*C6) / h2;  
                             o[INDEX3(i,0,0,numComp,3)] = V0;  
                             o[INDEX3(i,1,0,numComp,3)] = ((f_010[i]-f_000[i])*C5 + (f_111[i]-f_101[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = V1;  
                             o[INDEX3(i,0,1,numComp,3)] = V0;  
                             o[INDEX3(i,1,1,numComp,3)] = ((f_110[i]-f_100[i])*C5 + (f_011[i]-f_001[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;  
                             o[INDEX3(i,2,1,numComp,3)] = V2;  
                             o[INDEX3(i,0,2,numComp,3)] = V0;  
                             o[INDEX3(i,1,2,numComp,3)] = ((f_011[i]-f_001[i])*C5 + (f_110[i]-f_100[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;  
                             o[INDEX3(i,2,2,numComp,3)] = V1;  
                             o[INDEX3(i,0,3,numComp,3)] = V0;  
                             o[INDEX3(i,1,3,numComp,3)] = ((f_111[i]-f_101[i])*C5 + (f_010[i]-f_000[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;  
                             o[INDEX3(i,2,3,numComp,3)] = V2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k2 loop */  
             } /* end of face 2 */  
             if (m_faceOffset[3] > -1) {  
 #pragma omp for nowait  
                 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) {  
                             const double V0=((f_110[i]-f_010[i])*C6 + (f_111[i]-f_011[i])*C2) / h0;  
                             const double V1=((f_110[i]-f_010[i])*C2 + (f_111[i]-f_011[i])*C6) / h0;  
                             const double V2=((f_011[i]-f_010[i])*C6 + (f_111[i]-f_110[i])*C2) / h2;  
                             const double V3=((f_011[i]-f_010[i])*C2 + (f_111[i]-f_110[i])*C6) / h2;  
                             o[INDEX3(i,0,0,numComp,3)] = V0;  
                             o[INDEX3(i,1,0,numComp,3)] = ((f_010[i]-f_000[i])*C5 + (f_111[i]-f_101[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = V2;  
                             o[INDEX3(i,0,1,numComp,3)] = V0;  
                             o[INDEX3(i,1,1,numComp,3)] = ((f_110[i]-f_100[i])*C5 + (f_011[i]-f_001[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;  
                             o[INDEX3(i,2,1,numComp,3)] = V3;  
                             o[INDEX3(i,0,2,numComp,3)] = V1;  
                             o[INDEX3(i,1,2,numComp,3)] = ((f_011[i]-f_001[i])*C5 + (f_110[i]-f_100[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;  
                             o[INDEX3(i,2,2,numComp,3)] = V2;  
                             o[INDEX3(i,0,3,numComp,3)] = V1;  
                             o[INDEX3(i,1,3,numComp,3)] = ((f_111[i]-f_101[i])*C5 + (f_010[i]-f_000[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;  
                             o[INDEX3(i,2,3,numComp,3)] = V3;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k2 loop */  
             } /* end of face 3 */  
             if (m_faceOffset[4] > -1) {  
 #pragma omp for nowait  
                 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) {  
                             const double V0=((f_100[i]-f_000[i])*C6 + (f_110[i]-f_010[i])*C2) / h0;  
                             const double V1=((f_100[i]-f_000[i])*C2 + (f_110[i]-f_010[i])*C6) / h0;  
                             const double V2=((f_010[i]-f_000[i])*C6 + (f_110[i]-f_100[i])*C2) / h1;  
                             const double V3=((f_010[i]-f_000[i])*C2 + (f_110[i]-f_100[i])*C6) / h1;  
                             o[INDEX3(i,0,0,numComp,3)] = V0;  
                             o[INDEX3(i,1,0,numComp,3)] = V2;  
                             o[INDEX3(i,2,0,numComp,3)] = ((f_001[i]-f_000[i])*C5 + (f_111[i]-f_110[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;  
                             o[INDEX3(i,0,1,numComp,3)] = V0;  
                             o[INDEX3(i,1,1,numComp,3)] = V3;  
                             o[INDEX3(i,2,1,numComp,3)] = ((f_101[i]-f_100[i])*C5 + (f_011[i]-f_010[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;  
                             o[INDEX3(i,0,2,numComp,3)] = V1;  
                             o[INDEX3(i,1,2,numComp,3)] = V2;  
                             o[INDEX3(i,2,2,numComp,3)] = ((f_011[i]-f_010[i])*C5 + (f_101[i]-f_100[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;  
                             o[INDEX3(i,0,3,numComp,3)] = V1;  
                             o[INDEX3(i,1,3,numComp,3)] = V3;  
                             o[INDEX3(i,2,3,numComp,3)] = ((f_111[i]-f_110[i])*C5 + (f_001[i]-f_000[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k1 loop */  
             } /* end of face 4 */  
             if (m_faceOffset[5] > -1) {  
 #pragma omp for nowait  
                 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) {  
                             const double V0=((f_101[i]-f_001[i])*C6 + (f_111[i]-f_011[i])*C2) / h0;  
                             const double V1=((f_101[i]-f_001[i])*C2 + (f_111[i]-f_011[i])*C6) / h0;  
                             const double V2=((f_011[i]-f_001[i])*C6 + (f_111[i]-f_101[i])*C2) / h1;  
                             const double V3=((f_011[i]-f_001[i])*C2 + (f_111[i]-f_101[i])*C6) / h1;  
                             o[INDEX3(i,0,0,numComp,3)] = V0;  
                             o[INDEX3(i,1,0,numComp,3)] = V2;  
                             o[INDEX3(i,2,0,numComp,3)] = ((f_001[i]-f_000[i])*C5 + (f_111[i]-f_110[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;  
                             o[INDEX3(i,0,1,numComp,3)] = V0;  
                             o[INDEX3(i,1,1,numComp,3)] = V3;  
                             o[INDEX3(i,2,1,numComp,3)] = ((f_011[i]-f_010[i])*C0 + (f_101[i]-f_100[i])*C5 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;  
                             o[INDEX3(i,0,2,numComp,3)] = V1;  
                             o[INDEX3(i,1,2,numComp,3)] = V2;  
                             o[INDEX3(i,2,2,numComp,3)] = ((f_011[i]-f_010[i])*C5 + (f_101[i]-f_100[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;  
                             o[INDEX3(i,0,3,numComp,3)] = V1;  
                             o[INDEX3(i,1,3,numComp,3)] = V3;  
                             o[INDEX3(i,2,3,numComp,3)] = ((f_001[i]-f_000[i])*C0 + (f_111[i]-f_110[i])*C5 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k1 loop */  
             } /* end of face 5 */  
         } // end of parallel section  
         /* GENERATOR SNIP_GRAD_FACES BOTTOM */  
     } else if (out.getFunctionSpace().getTypeCode() == ReducedFaceElements) {  
         out.requireWrite();  
         /*** GENERATOR SNIP_GRAD_REDUCED_FACES TOP */  
 #pragma omp parallel  
         {  
             if (m_faceOffset[0] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));  
                         const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));  
                         const register double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));  
                         const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));  
                         const register double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));  
                         const register double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));  
                         const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));  
                         const register double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));  
                         double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_010[i]-f_011[i])*C3 / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]-f_000[i]-f_001[i])*C4 / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]-f_000[i]-f_010[i])*C4 / h2;  
                         } /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             } /* end of face 0 */  
             if (m_faceOffset[1] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const register double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));  
                         const register double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));  
                         const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));  
                         const register double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));  
                         const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));  
                         const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));  
                         const register double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));  
                         const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));  
                         double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_010[i]-f_011[i])*C3 / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = (f_110[i]+f_111[i]-f_100[i]-f_101[i])*C4 / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = (f_101[i]+f_111[i]-f_100[i]-f_110[i])*C4 / h2;  
                         } /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             } /* end of face 1 */  
             if (m_faceOffset[2] > -1) {  
 #pragma omp for nowait  
                 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)] = (f_100[i]+f_101[i]-f_000[i]-f_001[i])*C4 / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_100[i]-f_101[i])*C3 / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_101[i]-f_000[i]-f_100[i])*C4 / h2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k2 loop */  
             } /* end of face 2 */  
             if (m_faceOffset[3] > -1) {  
 #pragma omp for nowait  
                 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)] = (f_110[i]+f_111[i]-f_010[i]-f_011[i])*C4 / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_100[i]-f_101[i])*C3 / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = (f_011[i]+f_111[i]-f_010[i]-f_110[i])*C4 / h2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k2 loop */  
             } /* end of face 3 */  
             if (m_faceOffset[4] > -1) {  
 #pragma omp for nowait  
                 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_100[i]+f_110[i]-f_000[i]-f_010[i])*C4 / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_110[i]-f_000[i]-f_100[i])*C4 / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]+f_101[i]+f_111[i]-f_000[i]-f_010[i]-f_100[i]-f_110[i])*C4 / h2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k1 loop */  
             } /* end of face 4 */  
             if (m_faceOffset[5] > -1) {  
 #pragma omp for nowait  
                 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)] = (f_101[i]+f_111[i]-f_001[i]-f_011[i])*C4 / h0;  
                             o[INDEX3(i,1,0,numComp,3)] = (f_011[i]+f_111[i]-f_001[i]-f_101[i])*C4 / h1;  
                             o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]+f_101[i]+f_111[i]-f_000[i]-f_010[i]-f_100[i]-f_110[i])*C3 / h2;  
                         } /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k1 loop */  
             } /* end of face 5 */  
         } // end of parallel section  
         /* GENERATOR SNIP_GRAD_REDUCED_FACES BOTTOM */  
     } else {  
         stringstream msg;  
         msg << "setToGradient() not implemented for "  
             << functionSpaceTypeAsString(out.getFunctionSpace().getTypeCode());  
         throw RipleyException(msg.str());  
     }  
 }  
   
 void Brick::setToIntegrals(vector<double>& integrals, const escript::Data& arg) const  
 {  
     escript::Data& in = *const_cast<escript::Data*>(&arg);  
     const dim_t numComp = in.getDataPointSize();  
     const double h0 = m_l0/m_gNE0;  
     const double h1 = m_l1/m_gNE1;  
     const double h2 = m_l2/m_gNE2;  
     if (arg.getFunctionSpace().getTypeCode() == Elements) {  
         const double w_0 = h0*h1*h2/8.;  
 #pragma omp parallel  
         {  
             vector<double> int_local(numComp, 0);  
 #pragma omp for nowait  
             for (index_t k2 = 0; k2 < m_NE2; ++k2) {  
                 for (index_t k1 = 0; k1 < m_NE1; ++k1) {  
                     for (index_t k0 = 0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(INDEX3(k0, k1, k2, m_NE0, m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             const register double f_4 = f[INDEX2(i,4,numComp)];  
                             const register double f_5 = f[INDEX2(i,5,numComp)];  
                             const register double f_6 = f[INDEX2(i,6,numComp)];  
                             const register double f_7 = f[INDEX2(i,7,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3+f_4+f_5+f_6+f_7)*w_0;  
                         }  /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k1 loop */  
             } /* end of k2 loop */  
   
 #pragma omp critical  
             for (index_t i=0; i<numComp; i++)  
                 integrals[i]+=int_local[i];  
         } // end of parallel section  
     } else if (arg.getFunctionSpace().getTypeCode() == ReducedElements) {  
         const double w_0 = h0*h1*h2;  
 #pragma omp parallel  
         {  
             vector<double> int_local(numComp, 0);  
 #pragma omp for nowait  
             for (index_t k2 = 0; k2 < m_NE2; ++k2) {  
                 for (index_t k1 = 0; k1 < m_NE1; ++k1) {  
                     for (index_t k0 = 0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(INDEX3(k0, k1, k2, m_NE0, m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_0;  
                         }  /* end of component loop i */  
                     } /* end of k0 loop */  
                 } /* end of k1 loop */  
             } /* end of k2 loop */  
   
 #pragma omp critical  
             for (index_t i=0; i<numComp; i++)  
                 integrals[i]+=int_local[i];  
         } // end of parallel section  
     } else if (arg.getFunctionSpace().getTypeCode() == FaceElements) {  
         const double w_0 = h1*h2/4.;  
         const double w_1 = h0*h2/4.;  
         const double w_2 = h0*h1/4.;  
 #pragma omp parallel  
         {  
             vector<double> int_local(numComp, 0);  
             if (m_faceOffset[0] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3)*w_0;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[1] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3)*w_0;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[2] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3)*w_1;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[3] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3)*w_1;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[4] > -1) {  
 #pragma omp for nowait  
                 for (index_t k1=0; k1 < m_NE1; ++k1) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3)*w_2;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[5] > -1) {  
 #pragma omp for nowait  
                 for (index_t k1=0; k1 < m_NE1; ++k1) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             const register double f_0 = f[INDEX2(i,0,numComp)];  
                             const register double f_1 = f[INDEX2(i,1,numComp)];  
                             const register double f_2 = f[INDEX2(i,2,numComp)];  
                             const register double f_3 = f[INDEX2(i,3,numComp)];  
                             int_local[i]+=(f_0+f_1+f_2+f_3)*w_2;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
 #pragma omp critical  
             for (index_t i=0; i<numComp; i++)  
                 integrals[i]+=int_local[i];  
         } // end of parallel section  
   
     } else if (arg.getFunctionSpace().getTypeCode() == ReducedFaceElements) {  
         const double w_0 = h1*h2;  
         const double w_1 = h0*h2;  
         const double w_2 = h0*h1;  
 #pragma omp parallel  
         {  
             vector<double> int_local(numComp, 0);  
             if (m_faceOffset[0] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_0;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[1] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k1=0; k1 < m_NE1; ++k1) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_0;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[2] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_1;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[3] > -1) {  
 #pragma omp for nowait  
                 for (index_t k2=0; k2 < m_NE2; ++k2) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_1;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[4] > -1) {  
 #pragma omp for nowait  
                 for (index_t k1=0; k1 < m_NE1; ++k1) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_2;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
             if (m_faceOffset[5] > -1) {  
 #pragma omp for nowait  
                 for (index_t k1=0; k1 < m_NE1; ++k1) {  
                     for (index_t k0=0; k0 < m_NE0; ++k0) {  
                         const double* f = in.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));  
                         for (index_t i=0; i < numComp; ++i) {  
                             int_local[i]+=f[i]*w_2;  
                         }  /* end of component loop i */  
                     } /* end of k1 loop */  
                 } /* end of k2 loop */  
             }  
   
 #pragma omp critical  
             for (index_t i=0; i<numComp; i++)  
                 integrals[i]+=int_local[i];  
         } // end of parallel section  
   
     } else {  
         stringstream msg;  
         msg << "setToIntegrals() not implemented for "  
             << functionSpaceTypeAsString(arg.getFunctionSpace().getTypeCode());  
         throw RipleyException(msg.str());  
     }  
 }  
   
347  void Brick::setToNormal(escript::Data& out) const  void Brick::setToNormal(escript::Data& out) const
348  {  {
349      if (out.getFunctionSpace().getTypeCode() == FaceElements) {      if (out.getFunctionSpace().getTypeCode() == FaceElements) {
# Line 1207  void Brick::setToNormal(escript::Data& o Line 513  void Brick::setToNormal(escript::Data& o
513    
514      } else {      } else {
515          stringstream msg;          stringstream msg;
516          msg << "setToNormal() not implemented for "          msg << "setToNormal: invalid function space type "
517              << functionSpaceTypeAsString(out.getFunctionSpace().getTypeCode());              << out.getFunctionSpace().getTypeCode();
518          throw RipleyException(msg.str());          throw RipleyException(msg.str());
519      }      }
520  }  }
# Line 1222  void Brick::setToSize(escript::Data& out Line 528  void Brick::setToSize(escript::Data& out
528          const double xSize=getFirstCoordAndSpacing(0).second;          const double xSize=getFirstCoordAndSpacing(0).second;
529          const double ySize=getFirstCoordAndSpacing(1).second;          const double ySize=getFirstCoordAndSpacing(1).second;
530          const double zSize=getFirstCoordAndSpacing(2).second;          const double zSize=getFirstCoordAndSpacing(2).second;
531          const double size=min(min(xSize,ySize),zSize);          const double size=sqrt(xSize*xSize+ySize*ySize+zSize*zSize);
532  #pragma omp parallel for  #pragma omp parallel for
533          for (index_t k = 0; k < getNumElements(); ++k) {          for (index_t k = 0; k < getNumElements(); ++k) {
534              double* o = out.getSampleDataRW(k);              double* o = out.getSampleDataRW(k);
# Line 1306  void Brick::setToSize(escript::Data& out Line 612  void Brick::setToSize(escript::Data& out
612    
613      } else {      } else {
614          stringstream msg;          stringstream msg;
615          msg << "setToSize() not implemented for "          msg << "setToSize: invalid function space type "
616              << functionSpaceTypeAsString(out.getFunctionSpace().getTypeCode());              << out.getFunctionSpace().getTypeCode();
617          throw RipleyException(msg.str());          throw RipleyException(msg.str());
618      }      }
619  }  }
# Line 1315  void Brick::setToSize(escript::Data& out Line 621  void Brick::setToSize(escript::Data& out
621  Paso_SystemMatrixPattern* Brick::getPattern(bool reducedRowOrder,  Paso_SystemMatrixPattern* Brick::getPattern(bool reducedRowOrder,
622                                              bool reducedColOrder) const                                              bool reducedColOrder) const
623  {  {
624        /* FIXME: reduced
625      if (reducedRowOrder || reducedColOrder)      if (reducedRowOrder || reducedColOrder)
626          throw RipleyException("getPattern() not implemented for reduced order");          throw RipleyException("getPattern() not implemented for reduced order");
627        */
628      return m_pattern;      return m_pattern;
629  }  }
630    
# Line 1382  IndexVector Brick::getNumFacesPerBoundar Line 689  IndexVector Brick::getNumFacesPerBoundar
689      return ret;      return ret;
690  }  }
691    
692    IndexVector Brick::getNumSubdivisionsPerDim() const
693    {
694        IndexVector ret;
695        ret.push_back(m_NX);
696        ret.push_back(m_NY);
697        ret.push_back(m_NZ);
698        return ret;
699    }
700    
701  pair<double,double> Brick::getFirstCoordAndSpacing(dim_t dim) const  pair<double,double> Brick::getFirstCoordAndSpacing(dim_t dim) const
702  {  {
703      if (dim==0)      if (dim==0)
704          return pair<double,double>((m_l0*m_offset0)/m_gNE0, m_l0/m_gNE0);          return pair<double,double>(m_x0+(m_l0*m_offset0)/m_gNE0, m_l0/m_gNE0);
705      else if (dim==1)      else if (dim==1)
706          return pair<double,double>((m_l1*m_offset1)/m_gNE1, m_l1/m_gNE1);          return pair<double,double>(m_y0+(m_l1*m_offset1)/m_gNE1, m_l1/m_gNE1);
707      else if (dim==2)      else if (dim==2)
708          return pair<double,double>((m_l2*m_offset2)/m_gNE2, m_l2/m_gNE2);          return pair<double,double>(m_z0+(m_l2*m_offset2)/m_gNE2, m_l2/m_gNE2);
709    
710      throw RipleyException("getFirstCoordAndSpacing(): invalid argument");      throw RipleyException("getFirstCoordAndSpacing: invalid argument");
711  }  }
712    
713  //protected  //protected
# Line 1438  void Brick::assembleCoordinates(escript: Line 754  void Brick::assembleCoordinates(escript:
754  }  }
755    
756  //protected  //protected
757    void Brick::assembleGradient(escript::Data& out, escript::Data& in) const
758    {
759        const dim_t numComp = in.getDataPointSize();
760        const double h0 = m_l0/m_gNE0;
761        const double h1 = m_l1/m_gNE1;
762        const double h2 = m_l2/m_gNE2;
763        const double C0 = .044658198738520451079;
764        const double C1 = .16666666666666666667;
765        const double C2 = .21132486540518711775;
766        const double C3 = .25;
767        const double C4 = .5;
768        const double C5 = .62200846792814621559;
769        const double C6 = .78867513459481288225;
770    
771        if (out.getFunctionSpace().getTypeCode() == Elements) {
772            out.requireWrite();
773    #pragma omp parallel for
774            for (index_t k2=0; k2 < m_NE2; ++k2) {
775                for (index_t k1=0; k1 < m_NE1; ++k1) {
776                    for (index_t k0=0; k0 < m_NE0; ++k0) {
777                        const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,k2, m_N0,m_N1));
778                        const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));
779                        const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));
780                        const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));
781                        const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));
782                        const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));
783                        const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));
784                        const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));
785                        double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));
786                        for (index_t i=0; i < numComp; ++i) {
787                            const double V0=((f_100[i]-f_000[i])*C5 + (f_111[i]-f_011[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;
788                            const double V1=((f_110[i]-f_010[i])*C5 + (f_101[i]-f_001[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;
789                            const double V2=((f_101[i]-f_001[i])*C5 + (f_110[i]-f_010[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;
790                            const double V3=((f_111[i]-f_011[i])*C5 + (f_100[i]-f_000[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;
791                            const double V4=((f_010[i]-f_000[i])*C5 + (f_111[i]-f_101[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;
792                            const double V5=((f_110[i]-f_100[i])*C5 + (f_011[i]-f_001[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;
793                            const double V6=((f_011[i]-f_001[i])*C5 + (f_110[i]-f_100[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;
794                            const double V7=((f_111[i]-f_101[i])*C5 + (f_010[i]-f_000[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;
795                            const double V8=((f_001[i]-f_000[i])*C5 + (f_111[i]-f_110[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;
796                            const double V9=((f_101[i]-f_100[i])*C5 + (f_011[i]-f_010[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;
797                            const double V10=((f_011[i]-f_010[i])*C5 + (f_101[i]-f_100[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;
798                            const double V11=((f_111[i]-f_110[i])*C5 + (f_001[i]-f_000[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;
799                            o[INDEX3(i,0,0,numComp,3)] = V0;
800                            o[INDEX3(i,1,0,numComp,3)] = V4;
801                            o[INDEX3(i,2,0,numComp,3)] = V8;
802                            o[INDEX3(i,0,1,numComp,3)] = V0;
803                            o[INDEX3(i,1,1,numComp,3)] = V5;
804                            o[INDEX3(i,2,1,numComp,3)] = V9;
805                            o[INDEX3(i,0,2,numComp,3)] = V1;
806                            o[INDEX3(i,1,2,numComp,3)] = V4;
807                            o[INDEX3(i,2,2,numComp,3)] = V10;
808                            o[INDEX3(i,0,3,numComp,3)] = V1;
809                            o[INDEX3(i,1,3,numComp,3)] = V5;
810                            o[INDEX3(i,2,3,numComp,3)] = V11;
811                            o[INDEX3(i,0,4,numComp,3)] = V2;
812                            o[INDEX3(i,1,4,numComp,3)] = V6;
813                            o[INDEX3(i,2,4,numComp,3)] = V8;
814                            o[INDEX3(i,0,5,numComp,3)] = V2;
815                            o[INDEX3(i,1,5,numComp,3)] = V7;
816                            o[INDEX3(i,2,5,numComp,3)] = V9;
817                            o[INDEX3(i,0,6,numComp,3)] = V3;
818                            o[INDEX3(i,1,6,numComp,3)] = V6;
819                            o[INDEX3(i,2,6,numComp,3)] = V10;
820                            o[INDEX3(i,0,7,numComp,3)] = V3;
821                            o[INDEX3(i,1,7,numComp,3)] = V7;
822                            o[INDEX3(i,2,7,numComp,3)] = V11;
823                        } // end of component loop i
824                    } // end of k0 loop
825                } // end of k1 loop
826            } // end of k2 loop
827        } else if (out.getFunctionSpace().getTypeCode() == ReducedElements) {
828            out.requireWrite();
829    #pragma omp parallel for
830            for (index_t k2=0; k2 < m_NE2; ++k2) {
831                for (index_t k1=0; k1 < m_NE1; ++k1) {
832                    for (index_t k0=0; k0 < m_NE0; ++k0) {
833                        const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,k2, m_N0,m_N1));
834                        const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));
835                        const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));
836                        const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));
837                        const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));
838                        const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));
839                        const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));
840                        const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));
841                        double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));
842                        for (index_t i=0; i < numComp; ++i) {
843                            o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_010[i]-f_011[i])*C3 / h0;
844                            o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_100[i]-f_101[i])*C3 / h1;
845                            o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]+f_101[i]+f_111[i]-f_000[i]-f_010[i]-f_100[i]-f_110[i])*C3 / h2;
846                        } // end of component loop i
847                    } // end of k0 loop
848                } // end of k1 loop
849            } // end of k2 loop
850        } else if (out.getFunctionSpace().getTypeCode() == FaceElements) {
851            out.requireWrite();
852    #pragma omp parallel
853            {
854                if (m_faceOffset[0] > -1) {
855    #pragma omp for nowait
856                    for (index_t k2=0; k2 < m_NE2; ++k2) {
857                        for (index_t k1=0; k1 < m_NE1; ++k1) {
858                            const double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));
859                            const double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));
860                            const double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));
861                            const double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));
862                            const double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));
863                            const double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));
864                            const double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));
865                            const double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));
866                            double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
867                            for (index_t i=0; i < numComp; ++i) {
868                                const double V0=((f_010[i]-f_000[i])*C6 + (f_011[i]-f_001[i])*C2) / h1;
869                                const double V1=((f_010[i]-f_000[i])*C2 + (f_011[i]-f_001[i])*C6) / h1;
870                                const double V2=((f_001[i]-f_000[i])*C6 + (f_010[i]-f_011[i])*C2) / h2;
871                                const double V3=((f_001[i]-f_000[i])*C2 + (f_011[i]-f_010[i])*C6) / h2;
872                                o[INDEX3(i,0,0,numComp,3)] = ((f_100[i]-f_000[i])*C5 + (f_111[i]-f_011[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;
873                                o[INDEX3(i,1,0,numComp,3)] = V0;
874                                o[INDEX3(i,2,0,numComp,3)] = V2;
875                                o[INDEX3(i,0,1,numComp,3)] = ((f_110[i]-f_010[i])*C5 + (f_101[i]-f_001[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;
876                                o[INDEX3(i,1,1,numComp,3)] = V0;
877                                o[INDEX3(i,2,1,numComp,3)] = V3;
878                                o[INDEX3(i,0,2,numComp,3)] = ((f_101[i]-f_001[i])*C5 + (f_110[i]-f_010[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;
879                                o[INDEX3(i,1,2,numComp,3)] = V1;
880                                o[INDEX3(i,2,2,numComp,3)] = V2;
881                                o[INDEX3(i,0,3,numComp,3)] = ((f_111[i]-f_011[i])*C5 + (f_100[i]-f_000[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;
882                                o[INDEX3(i,1,3,numComp,3)] = V1;
883                                o[INDEX3(i,2,3,numComp,3)] = V3;
884                            } // end of component loop i
885                        } // end of k1 loop
886                    } // end of k2 loop
887                } // end of face 0
888                if (m_faceOffset[1] > -1) {
889    #pragma omp for nowait
890                    for (index_t k2=0; k2 < m_NE2; ++k2) {
891                        for (index_t k1=0; k1 < m_NE1; ++k1) {
892                            const double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));
893                            const double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));
894                            const double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));
895                            const double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));
896                            const double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));
897                            const double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));
898                            const double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));
899                            const double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));
900                            double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
901                            for (index_t i=0; i < numComp; ++i) {
902                                const double V0=((f_110[i]-f_100[i])*C6 + (f_111[i]-f_101[i])*C2) / h1;
903                                const double V1=((f_110[i]-f_100[i])*C2 + (f_111[i]-f_101[i])*C6) / h1;
904                                const double V2=((f_101[i]-f_100[i])*C6 + (f_111[i]-f_110[i])*C2) / h2;
905                                const double V3=((f_101[i]-f_100[i])*C2 + (f_111[i]-f_110[i])*C6) / h2;
906                                o[INDEX3(i,0,0,numComp,3)] = ((f_100[i]-f_000[i])*C5 + (f_111[i]-f_011[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;
907                                o[INDEX3(i,1,0,numComp,3)] = V0;
908                                o[INDEX3(i,2,0,numComp,3)] = V2;
909                                o[INDEX3(i,0,1,numComp,3)] = ((f_110[i]-f_010[i])*C5 + (f_101[i]-f_001[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;
910                                o[INDEX3(i,1,1,numComp,3)] = V0;
911                                o[INDEX3(i,2,1,numComp,3)] = V3;
912                                o[INDEX3(i,0,2,numComp,3)] = ((f_101[i]-f_001[i])*C5 + (f_110[i]-f_010[i])*C0 + (f_100[i]+f_111[i]-f_000[i]-f_011[i])*C1) / h0;
913                                o[INDEX3(i,1,2,numComp,3)] = V1;
914                                o[INDEX3(i,2,2,numComp,3)] = V2;
915                                o[INDEX3(i,0,3,numComp,3)] = ((f_111[i]-f_011[i])*C5 + (f_100[i]-f_000[i])*C0 + (f_101[i]+f_110[i]-f_001[i]-f_010[i])*C1) / h0;
916                                o[INDEX3(i,1,3,numComp,3)] = V1;
917                                o[INDEX3(i,2,3,numComp,3)] = V3;
918                            } // end of component loop i
919                        } // end of k1 loop
920                    } // end of k2 loop
921                } // end of face 1
922                if (m_faceOffset[2] > -1) {
923    #pragma omp for nowait
924                    for (index_t k2=0; k2 < m_NE2; ++k2) {
925                        for (index_t k0=0; k0 < m_NE0; ++k0) {
926                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));
927                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));
928                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));
929                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));
930                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,1,k2+1, m_N0,m_N1));
931                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,1,k2, m_N0,m_N1));
932                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,1,k2+1, m_N0,m_N1));
933                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,1,k2, m_N0,m_N1));
934                            double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
935                            for (index_t i=0; i < numComp; ++i) {
936                                const double V0=((f_100[i]-f_000[i])*C6 + (f_101[i]-f_001[i])*C2) / h0;
937                                const double V1=((f_001[i]-f_000[i])*C6 + (f_101[i]-f_100[i])*C2) / h2;
938                                const double V2=((f_001[i]-f_000[i])*C2 + (f_101[i]-f_100[i])*C6) / h2;
939                                o[INDEX3(i,0,0,numComp,3)] = V0;
940                                o[INDEX3(i,1,0,numComp,3)] = ((f_010[i]-f_000[i])*C5 + (f_111[i]-f_101[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;
941                                o[INDEX3(i,2,0,numComp,3)] = V1;
942                                o[INDEX3(i,0,1,numComp,3)] = V0;
943                                o[INDEX3(i,1,1,numComp,3)] = ((f_110[i]-f_100[i])*C5 + (f_011[i]-f_001[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;
944                                o[INDEX3(i,2,1,numComp,3)] = V2;
945                                o[INDEX3(i,0,2,numComp,3)] = V0;
946                                o[INDEX3(i,1,2,numComp,3)] = ((f_011[i]-f_001[i])*C5 + (f_110[i]-f_100[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;
947                                o[INDEX3(i,2,2,numComp,3)] = V1;
948                                o[INDEX3(i,0,3,numComp,3)] = V0;
949                                o[INDEX3(i,1,3,numComp,3)] = ((f_111[i]-f_101[i])*C5 + (f_010[i]-f_000[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;
950                                o[INDEX3(i,2,3,numComp,3)] = V2;
951                            } // end of component loop i
952                        } // end of k0 loop
953                    } // end of k2 loop
954                } // end of face 2
955                if (m_faceOffset[3] > -1) {
956    #pragma omp for nowait
957                    for (index_t k2=0; k2 < m_NE2; ++k2) {
958                        for (index_t k0=0; k0 < m_NE0; ++k0) {
959                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));
960                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));
961                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));
962                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));
963                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2, m_N0,m_N1));
964                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2+1, m_N0,m_N1));
965                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2+1, m_N0,m_N1));
966                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2, m_N0,m_N1));
967                            double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
968                            for (index_t i=0; i < numComp; ++i) {
969                                const double V0=((f_110[i]-f_010[i])*C6 + (f_111[i]-f_011[i])*C2) / h0;
970                                const double V1=((f_110[i]-f_010[i])*C2 + (f_111[i]-f_011[i])*C6) / h0;
971                                const double V2=((f_011[i]-f_010[i])*C6 + (f_111[i]-f_110[i])*C2) / h2;
972                                const double V3=((f_011[i]-f_010[i])*C2 + (f_111[i]-f_110[i])*C6) / h2;
973                                o[INDEX3(i,0,0,numComp,3)] = V0;
974                                o[INDEX3(i,1,0,numComp,3)] = ((f_010[i]-f_000[i])*C5 + (f_111[i]-f_101[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;
975                                o[INDEX3(i,2,0,numComp,3)] = V2;
976                                o[INDEX3(i,0,1,numComp,3)] = V0;
977                                o[INDEX3(i,1,1,numComp,3)] = ((f_110[i]-f_100[i])*C5 + (f_011[i]-f_001[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;
978                                o[INDEX3(i,2,1,numComp,3)] = V3;
979                                o[INDEX3(i,0,2,numComp,3)] = V1;
980                                o[INDEX3(i,1,2,numComp,3)] = ((f_011[i]-f_001[i])*C5 + (f_110[i]-f_100[i])*C0 + (f_010[i]+f_111[i]-f_000[i]-f_101[i])*C1) / h1;
981                                o[INDEX3(i,2,2,numComp,3)] = V2;
982                                o[INDEX3(i,0,3,numComp,3)] = V1;
983                                o[INDEX3(i,1,3,numComp,3)] = ((f_111[i]-f_101[i])*C5 + (f_010[i]-f_000[i])*C0 + (f_011[i]+f_110[i]-f_001[i]-f_100[i])*C1) / h1;
984                                o[INDEX3(i,2,3,numComp,3)] = V3;
985                            } // end of component loop i
986                        } // end of k0 loop
987                    } // end of k2 loop
988                } // end of face 3
989                if (m_faceOffset[4] > -1) {
990    #pragma omp for nowait
991                    for (index_t k1=0; k1 < m_NE1; ++k1) {
992                        for (index_t k0=0; k0 < m_NE0; ++k0) {
993                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));
994                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));
995                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));
996                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));
997                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,1, m_N0,m_N1));
998                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,1, m_N0,m_N1));
999                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,1, m_N0,m_N1));
1000                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,1, m_N0,m_N1));
1001                            double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
1002                            for (index_t i=0; i < numComp; ++i) {
1003                                const double V0=((f_100[i]-f_000[i])*C6 + (f_110[i]-f_010[i])*C2) / h0;
1004                                const double V1=((f_100[i]-f_000[i])*C2 + (f_110[i]-f_010[i])*C6) / h0;
1005                                const double V2=((f_010[i]-f_000[i])*C6 + (f_110[i]-f_100[i])*C2) / h1;
1006                                const double V3=((f_010[i]-f_000[i])*C2 + (f_110[i]-f_100[i])*C6) / h1;
1007                                o[INDEX3(i,0,0,numComp,3)] = V0;
1008                                o[INDEX3(i,1,0,numComp,3)] = V2;
1009                                o[INDEX3(i,2,0,numComp,3)] = ((f_001[i]-f_000[i])*C5 + (f_111[i]-f_110[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;
1010                                o[INDEX3(i,0,1,numComp,3)] = V0;
1011                                o[INDEX3(i,1,1,numComp,3)] = V3;
1012                                o[INDEX3(i,2,1,numComp,3)] = ((f_101[i]-f_100[i])*C5 + (f_011[i]-f_010[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;
1013                                o[INDEX3(i,0,2,numComp,3)] = V1;
1014                                o[INDEX3(i,1,2,numComp,3)] = V2;
1015                                o[INDEX3(i,2,2,numComp,3)] = ((f_011[i]-f_010[i])*C5 + (f_101[i]-f_100[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;
1016                                o[INDEX3(i,0,3,numComp,3)] = V1;
1017                                o[INDEX3(i,1,3,numComp,3)] = V3;
1018                                o[INDEX3(i,2,3,numComp,3)] = ((f_111[i]-f_110[i])*C5 + (f_001[i]-f_000[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;
1019                            } // end of component loop i
1020                        } // end of k0 loop
1021                    } // end of k1 loop
1022                } // end of face 4
1023                if (m_faceOffset[5] > -1) {
1024    #pragma omp for nowait
1025                    for (index_t k1=0; k1 < m_NE1; ++k1) {
1026                        for (index_t k0=0; k0 < m_NE0; ++k0) {
1027                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));
1028                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));
1029                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));
1030                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));
1031                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-2, m_N0,m_N1));
1032                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-2, m_N0,m_N1));
1033                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-2, m_N0,m_N1));
1034                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-2, m_N0,m_N1));
1035                            double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
1036                            for (index_t i=0; i < numComp; ++i) {
1037                                const double V0=((f_101[i]-f_001[i])*C6 + (f_111[i]-f_011[i])*C2) / h0;
1038                                const double V1=((f_101[i]-f_001[i])*C2 + (f_111[i]-f_011[i])*C6) / h0;
1039                                const double V2=((f_011[i]-f_001[i])*C6 + (f_111[i]-f_101[i])*C2) / h1;
1040                                const double V3=((f_011[i]-f_001[i])*C2 + (f_111[i]-f_101[i])*C6) / h1;
1041                                o[INDEX3(i,0,0,numComp,3)] = V0;
1042                                o[INDEX3(i,1,0,numComp,3)] = V2;
1043                                o[INDEX3(i,2,0,numComp,3)] = ((f_001[i]-f_000[i])*C5 + (f_111[i]-f_110[i])*C0 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;
1044                                o[INDEX3(i,0,1,numComp,3)] = V0;
1045                                o[INDEX3(i,1,1,numComp,3)] = V3;
1046                                o[INDEX3(i,2,1,numComp,3)] = ((f_011[i]-f_010[i])*C0 + (f_101[i]-f_100[i])*C5 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;
1047                                o[INDEX3(i,0,2,numComp,3)] = V1;
1048                                o[INDEX3(i,1,2,numComp,3)] = V2;
1049                                o[INDEX3(i,2,2,numComp,3)] = ((f_011[i]-f_010[i])*C5 + (f_101[i]-f_100[i])*C0 + (f_001[i]+f_111[i]-f_000[i]-f_110[i])*C1) / h2;
1050                                o[INDEX3(i,0,3,numComp,3)] = V1;
1051                                o[INDEX3(i,1,3,numComp,3)] = V3;
1052                                o[INDEX3(i,2,3,numComp,3)] = ((f_001[i]-f_000[i])*C0 + (f_111[i]-f_110[i])*C5 + (f_011[i]+f_101[i]-f_010[i]-f_100[i])*C1) / h2;
1053                            } // end of component loop i
1054                        } // end of k0 loop
1055                    } // end of k1 loop
1056                } // end of face 5
1057            } // end of parallel section
1058        } else if (out.getFunctionSpace().getTypeCode() == ReducedFaceElements) {
1059            out.requireWrite();
1060    #pragma omp parallel
1061            {
1062                if (m_faceOffset[0] > -1) {
1063    #pragma omp for nowait
1064                    for (index_t k2=0; k2 < m_NE2; ++k2) {
1065                        for (index_t k1=0; k1 < m_NE1; ++k1) {
1066                            const double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));
1067                            const double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));
1068                            const double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));
1069                            const double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));
1070                            const double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));
1071                            const double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));
1072                            const double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));
1073                            const double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));
1074                            double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
1075                            for (index_t i=0; i < numComp; ++i) {
1076                                o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_010[i]-f_011[i])*C3 / h0;
1077                                o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]-f_000[i]-f_001[i])*C4 / h1;
1078                                o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]-f_000[i]-f_010[i])*C4 / h2;
1079                            } // end of component loop i
1080                        } // end of k1 loop
1081                    } // end of k2 loop
1082                } // end of face 0
1083                if (m_faceOffset[1] > -1) {
1084    #pragma omp for nowait
1085                    for (index_t k2=0; k2 < m_NE2; ++k2) {
1086                        for (index_t k1=0; k1 < m_NE1; ++k1) {
1087                            const double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));
1088                            const double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));
1089                            const double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));
1090                            const double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));
1091                            const double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));
1092                            const double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));
1093                            const double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));
1094                            const double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));
1095                            double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
1096                            for (index_t i=0; i < numComp; ++i) {
1097                                o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_010[i]-f_011[i])*C3 / h0;
1098                                o[INDEX3(i,1,0,numComp,3)] = (f_110[i]+f_111[i]-f_100[i]-f_101[i])*C4 / h1;
1099                                o[INDEX3(i,2,0,numComp,3)] = (f_101[i]+f_111[i]-f_100[i]-f_110[i])*C4 / h2;
1100                            } // end of component loop i
1101                        } // end of k1 loop
1102                    } // end of k2 loop
1103                } // end of face 1
1104                if (m_faceOffset[2] > -1) {
1105    #pragma omp for nowait
1106                    for (index_t k2=0; k2 < m_NE2; ++k2) {
1107                        for (index_t k0=0; k0 < m_NE0; ++k0) {
1108                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));
1109                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));
1110                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));
1111                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));
1112                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,1,k2+1, m_N0,m_N1));
1113                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,1,k2, m_N0,m_N1));
1114                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,1,k2, m_N0,m_N1));
1115                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,1,k2+1, m_N0,m_N1));
1116                            double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
1117                            for (index_t i=0; i < numComp; ++i) {
1118                                o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_101[i]-f_000[i]-f_001[i])*C4 / h0;
1119                                o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_100[i]-f_101[i])*C3 / h1;
1120                                o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_101[i]-f_000[i]-f_100[i])*C4 / h2;
1121                            } // end of component loop i
1122                        } // end of k0 loop
1123                    } // end of k2 loop
1124                } // end of face 2
1125                if (m_faceOffset[3] > -1) {
1126    #pragma omp for nowait
1127                    for (index_t k2=0; k2 < m_NE2; ++k2) {
1128                        for (index_t k0=0; k0 < m_NE0; ++k0) {
1129                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));
1130                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));
1131                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));
1132                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));
1133                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2, m_N0,m_N1));
1134                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2+1, m_N0,m_N1));
1135                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2+1, m_N0,m_N1));
1136                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2, m_N0,m_N1));
1137                            double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
1138                            for (index_t i=0; i < numComp; ++i) {
1139                                o[INDEX3(i,0,0,numComp,3)] = (f_110[i]+f_111[i]-f_010[i]-f_011[i])*C4 / h0;
1140                                o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_011[i]+f_110[i]+f_111[i]-f_000[i]-f_001[i]-f_100[i]-f_101[i])*C3 / h1;
1141                                o[INDEX3(i,2,0,numComp,3)] = (f_011[i]+f_111[i]-f_010[i]-f_110[i])*C4 / h2;
1142                            } // end of component loop i
1143                        } // end of k0 loop
1144                    } // end of k2 loop
1145                } // end of face 3
1146                if (m_faceOffset[4] > -1) {
1147    #pragma omp for nowait
1148                    for (index_t k1=0; k1 < m_NE1; ++k1) {
1149                        for (index_t k0=0; k0 < m_NE0; ++k0) {
1150                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));
1151                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));
1152                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));
1153                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));
1154                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,1, m_N0,m_N1));
1155                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,1, m_N0,m_N1));
1156                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,1, m_N0,m_N1));
1157                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,1, m_N0,m_N1));
1158                            double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
1159                            for (index_t i=0; i < numComp; ++i) {
1160                                o[INDEX3(i,0,0,numComp,3)] = (f_100[i]+f_110[i]-f_000[i]-f_010[i])*C4 / h0;
1161                                o[INDEX3(i,1,0,numComp,3)] = (f_010[i]+f_110[i]-f_000[i]-f_100[i])*C4 / h1;
1162                                o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]+f_101[i]+f_111[i]-f_000[i]-f_010[i]-f_100[i]-f_110[i])*C4 / h2;
1163                            } // end of component loop i
1164                        } // end of k0 loop
1165                    } // end of k1 loop
1166                } // end of face 4
1167                if (m_faceOffset[5] > -1) {
1168    #pragma omp for nowait
1169                    for (index_t k1=0; k1 < m_NE1; ++k1) {
1170                        for (index_t k0=0; k0 < m_NE0; ++k0) {
1171                            const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));
1172                            const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));
1173                            const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));
1174                            const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));
1175                            const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-2, m_N0,m_N1));
1176                            const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-2, m_N0,m_N1));
1177                            const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-2, m_N0,m_N1));
1178                            const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-2, m_N0,m_N1));
1179                            double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
1180                            for (index_t i=0; i < numComp; ++i) {
1181                                o[INDEX3(i,0,0,numComp,3)] = (f_101[i]+f_111[i]-f_001[i]-f_011[i])*C4 / h0;
1182                                o[INDEX3(i,1,0,numComp,3)] = (f_011[i]+f_111[i]-f_001[i]-f_101[i])*C4 / h1;
1183                                o[INDEX3(i,2,0,numComp,3)] = (f_001[i]+f_011[i]+f_101[i]+f_111[i]-f_000[i]-f_010[i]-f_100[i]-f_110[i])*C3 / h2;
1184                            } // end of component loop i
1185                        } // end of k0 loop
1186                    } // end of k1 loop
1187                } // end of face 5
1188            } // end of parallel section
1189        }
1190    }
1191    
1192    //protected
1193    void Brick::assembleIntegrate(vector<double>& integrals, escript::Data& arg) const
1194    {
1195        const dim_t numComp = arg.getDataPointSize();
1196        const double h0 = m_l0/m_gNE0;
1197        const double h1 = m_l1/m_gNE1;
1198        const double h2 = m_l2/m_gNE2;
1199        const index_t left = (m_offset0==0 ? 0 : 1);
1200        const index_t bottom = (m_offset1==0 ? 0 : 1);
1201        const index_t front = (m_offset2==0 ? 0 : 1);
1202        const int fs = arg.getFunctionSpace().getTypeCode();
1203        if (fs == Elements && arg.actsExpanded()) {
1204            const double w_0 = h0*h1*h2/8.;
1205    #pragma omp parallel
1206            {
1207                vector<double> int_local(numComp, 0);
1208    #pragma omp for nowait
1209                for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1210                    for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1211                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1212                            const double* f = arg.getSampleDataRO(INDEX3(k0, k1, k2, m_NE0, m_NE1));
1213                            for (index_t i=0; i < numComp; ++i) {
1214                                const double f_0 = f[INDEX2(i,0,numComp)];
1215                                const double f_1 = f[INDEX2(i,1,numComp)];
1216                                const double f_2 = f[INDEX2(i,2,numComp)];
1217                                const double f_3 = f[INDEX2(i,3,numComp)];
1218                                const double f_4 = f[INDEX2(i,4,numComp)];
1219                                const double f_5 = f[INDEX2(i,5,numComp)];
1220                                const double f_6 = f[INDEX2(i,6,numComp)];
1221                                const double f_7 = f[INDEX2(i,7,numComp)];
1222                                int_local[i]+=(f_0+f_1+f_2+f_3+f_4+f_5+f_6+f_7)*w_0;
1223                            }  // end of component loop i
1224                        } // end of k0 loop
1225                    } // end of k1 loop
1226                } // end of k2 loop
1227    
1228    #pragma omp critical
1229                for (index_t i=0; i<numComp; i++)
1230                    integrals[i]+=int_local[i];
1231            } // end of parallel section
1232    
1233        } else if (fs==ReducedElements || (fs==Elements && !arg.actsExpanded())) {
1234            const double w_0 = h0*h1*h2;
1235    #pragma omp parallel
1236            {
1237                vector<double> int_local(numComp, 0);
1238    #pragma omp for nowait
1239                for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1240                    for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1241                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1242                            const double* f = arg.getSampleDataRO(INDEX3(k0, k1, k2, m_NE0, m_NE1));
1243                            for (index_t i=0; i < numComp; ++i) {
1244                                int_local[i]+=f[i]*w_0;
1245                            }  // end of component loop i
1246                        } // end of k0 loop
1247                    } // end of k1 loop
1248                } // end of k2 loop
1249    
1250    #pragma omp critical
1251                for (index_t i=0; i<numComp; i++)
1252                    integrals[i]+=int_local[i];
1253            } // end of parallel section
1254    
1255        } else if (fs == FaceElements && arg.actsExpanded()) {
1256            const double w_0 = h1*h2/4.;
1257            const double w_1 = h0*h2/4.;
1258            const double w_2 = h0*h1/4.;
1259    #pragma omp parallel
1260            {
1261                vector<double> int_local(numComp, 0);
1262                if (m_faceOffset[0] > -1) {
1263    #pragma omp for nowait
1264                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1265                        for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1266                            const double* f = arg.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
1267                            for (index_t i=0; i < numComp; ++i) {
1268                                const double f_0 = f[INDEX2(i,0,numComp)];
1269                                const double f_1 = f[INDEX2(i,1,numComp)];
1270                                const double f_2 = f[INDEX2(i,2,numComp)];
1271                                const double f_3 = f[INDEX2(i,3,numComp)];
1272                                int_local[i]+=(f_0+f_1+f_2+f_3)*w_0;
1273                            }  // end of component loop i
1274                        } // end of k1 loop
1275                    } // end of k2 loop
1276                }
1277    
1278                if (m_faceOffset[1] > -1) {
1279    #pragma omp for nowait
1280                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1281                        for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1282                            const double* f = arg.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
1283                            for (index_t i=0; i < numComp; ++i) {
1284                                const double f_0 = f[INDEX2(i,0,numComp)];
1285                                const double f_1 = f[INDEX2(i,1,numComp)];
1286                                const double f_2 = f[INDEX2(i,2,numComp)];
1287                                const double f_3 = f[INDEX2(i,3,numComp)];
1288                                int_local[i]+=(f_0+f_1+f_2+f_3)*w_0;
1289                            }  // end of component loop i
1290                        } // end of k1 loop
1291                    } // end of k2 loop
1292                }
1293    
1294                if (m_faceOffset[2] > -1) {
1295    #pragma omp for nowait
1296                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1297                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1298                            const double* f = arg.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
1299                            for (index_t i=0; i < numComp; ++i) {
1300                                const double f_0 = f[INDEX2(i,0,numComp)];
1301                                const double f_1 = f[INDEX2(i,1,numComp)];
1302                                const double f_2 = f[INDEX2(i,2,numComp)];
1303                                const double f_3 = f[INDEX2(i,3,numComp)];
1304                                int_local[i]+=(f_0+f_1+f_2+f_3)*w_1;
1305                            }  // end of component loop i
1306                        } // end of k1 loop
1307                    } // end of k2 loop
1308                }
1309    
1310                if (m_faceOffset[3] > -1) {
1311    #pragma omp for nowait
1312                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1313                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1314                            const double* f = arg.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
1315                            for (index_t i=0; i < numComp; ++i) {
1316                                const double f_0 = f[INDEX2(i,0,numComp)];
1317                                const double f_1 = f[INDEX2(i,1,numComp)];
1318                                const double f_2 = f[INDEX2(i,2,numComp)];
1319                                const double f_3 = f[INDEX2(i,3,numComp)];
1320                                int_local[i]+=(f_0+f_1+f_2+f_3)*w_1;
1321                            }  // end of component loop i
1322                        } // end of k1 loop
1323                    } // end of k2 loop
1324                }
1325    
1326                if (m_faceOffset[4] > -1) {
1327    #pragma omp for nowait
1328                    for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1329                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1330                            const double* f = arg.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
1331                            for (index_t i=0; i < numComp; ++i) {
1332                                const double f_0 = f[INDEX2(i,0,numComp)];
1333                                const double f_1 = f[INDEX2(i,1,numComp)];
1334                                const double f_2 = f[INDEX2(i,2,numComp)];
1335                                const double f_3 = f[INDEX2(i,3,numComp)];
1336                                int_local[i]+=(f_0+f_1+f_2+f_3)*w_2;
1337                            }  // end of component loop i
1338                        } // end of k1 loop
1339                    } // end of k2 loop
1340                }
1341    
1342                if (m_faceOffset[5] > -1) {
1343    #pragma omp for nowait
1344                    for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1345                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1346                            const double* f = arg.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
1347                            for (index_t i=0; i < numComp; ++i) {
1348                                const double f_0 = f[INDEX2(i,0,numComp)];
1349                                const double f_1 = f[INDEX2(i,1,numComp)];
1350                                const double f_2 = f[INDEX2(i,2,numComp)];
1351                                const double f_3 = f[INDEX2(i,3,numComp)];
1352                                int_local[i]+=(f_0+f_1+f_2+f_3)*w_2;
1353                            }  // end of component loop i
1354                        } // end of k1 loop
1355                    } // end of k2 loop
1356                }
1357    
1358    #pragma omp critical
1359                for (index_t i=0; i<numComp; i++)
1360                    integrals[i]+=int_local[i];
1361            } // end of parallel section
1362    
1363        } else if (fs==ReducedFaceElements || (fs==FaceElements && !arg.actsExpanded())) {
1364            const double w_0 = h1*h2;
1365            const double w_1 = h0*h2;
1366            const double w_2 = h0*h1;
1367    #pragma omp parallel
1368            {
1369                vector<double> int_local(numComp, 0);
1370                if (m_faceOffset[0] > -1) {
1371    #pragma omp for nowait
1372                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1373                        for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1374                            const double* f = arg.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
1375                            for (index_t i=0; i < numComp; ++i) {
1376                                int_local[i]+=f[i]*w_0;
1377                            }  // end of component loop i
1378                        } // end of k1 loop
1379                    } // end of k2 loop
1380                }
1381    
1382                if (m_faceOffset[1] > -1) {
1383    #pragma omp for nowait
1384                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1385                        for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1386                            const double* f = arg.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
1387                            for (index_t i=0; i < numComp; ++i) {
1388                                int_local[i]+=f[i]*w_0;
1389                            }  // end of component loop i
1390                        } // end of k1 loop
1391                    } // end of k2 loop
1392                }
1393    
1394                if (m_faceOffset[2] > -1) {
1395    #pragma omp for nowait
1396                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1397                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1398                            const double* f = arg.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
1399                            for (index_t i=0; i < numComp; ++i) {
1400                                int_local[i]+=f[i]*w_1;
1401                            }  // end of component loop i
1402                        } // end of k1 loop
1403                    } // end of k2 loop
1404                }
1405    
1406                if (m_faceOffset[3] > -1) {
1407    #pragma omp for nowait
1408                    for (index_t k2 = front; k2 < front+m_ownNE2; ++k2) {
1409                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1410                            const double* f = arg.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
1411                            for (index_t i=0; i < numComp; ++i) {
1412                                int_local[i]+=f[i]*w_1;
1413                            }  // end of component loop i
1414                        } // end of k1 loop
1415                    } // end of k2 loop
1416                }
1417    
1418                if (m_faceOffset[4] > -1) {
1419    #pragma omp for nowait
1420                    for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1421                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1422                            const double* f = arg.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
1423                            for (index_t i=0; i < numComp; ++i) {
1424                                int_local[i]+=f[i]*w_2;
1425                            }  // end of component loop i
1426                        } // end of k1 loop
1427                    } // end of k2 loop
1428                }
1429    
1430                if (m_faceOffset[5] > -1) {
1431    #pragma omp for nowait
1432                    for (index_t k1 = bottom; k1 < bottom+m_ownNE1; ++k1) {
1433                        for (index_t k0 = left; k0 < left+m_ownNE0; ++k0) {
1434                            const double* f = arg.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
1435                            for (index_t i=0; i < numComp; ++i) {
1436                                int_local[i]+=f[i]*w_2;
1437                            }  // end of component loop i
1438                        } // end of k1 loop
1439                    } // end of k2 loop
1440                }
1441    
1442    #pragma omp critical
1443                for (index_t i=0; i<numComp; i++)
1444                    integrals[i]+=int_local[i];
1445            } // end of parallel section
1446        } // function space selector
1447    }
1448    
1449    //protected
1450  dim_t Brick::insertNeighbourNodes(IndexVector& index, index_t node) const  dim_t Brick::insertNeighbourNodes(IndexVector& index, index_t node) const
1451  {  {
1452      const dim_t nDOF0 = (m_gNE0+1)/m_NX;      const dim_t nDOF0 = (m_gNE0+1)/m_NX;
# Line 1523  void Brick::populateSampleIds() Line 1532  void Brick::populateSampleIds()
1532      // globally      // globally
1533    
1534      // build node distribution vector first.      // build node distribution vector first.
1535      // rank i owns m_nodeDistribution[i+1]-nodeDistribution[i] nodes      // rank i owns m_nodeDistribution[i+1]-nodeDistribution[i] nodes which is
1536        // constant for all ranks in this implementation
1537      m_nodeDistribution.assign(m_mpiInfo->size+1, 0);      m_nodeDistribution.assign(m_mpiInfo->size+1, 0);
1538      const dim_t numDOF=getNumDOF();      const dim_t numDOF=getNumDOF();
1539      for (dim_t k=1; k<m_mpiInfo->size; k++) {      for (dim_t k=1; k<m_mpiInfo->size; k++) {
# Line 1617  void Brick::createPattern() Line 1627  void Brick::createPattern()
1627      // The rest is assigned in the loop further down      // The rest is assigned in the loop further down
1628      m_dofMap.assign(getNumNodes(), 0);      m_dofMap.assign(getNumNodes(), 0);
1629  #pragma omp parallel for  #pragma omp parallel for
1630      for (index_t i=front; i<m_N2; i++) {      for (index_t i=front; i<front+nDOF2; i++) {
1631          for (index_t j=bottom; j<m_N1; j++) {          for (index_t j=bottom; j<bottom+nDOF1; j++) {
1632              for (index_t k=left; k<m_N0; k++) {              for (index_t k=left; k<left+nDOF0; k++) {
1633                  m_dofMap[i*m_N0*m_N1+j*m_N0+k]=(i-front)*nDOF0*nDOF1+(j-bottom)*nDOF0+k-left;                  m_dofMap[i*m_N0*m_N1+j*m_N0+k]=(i-front)*nDOF0*nDOF1+(j-bottom)*nDOF0+k-left;
1634              }              }
1635          }          }
# Line 1911  void Brick::createPattern() Line 1921  void Brick::createPattern()
1921      Paso_Pattern_free(rowPattern);      Paso_Pattern_free(rowPattern);
1922  }  }
1923    
1924    //private
1925    void Brick::addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
1926             const vector<double>& EM_S, const vector<double>& EM_F, bool addS,
1927             bool addF, index_t firstNode, dim_t nEq, dim_t nComp) const
1928    {
1929        IndexVector rowIndex;
1930        rowIndex.push_back(m_dofMap[firstNode]);
1931        rowIndex.push_back(m_dofMap[firstNode+1]);
1932        rowIndex.push_back(m_dofMap[firstNode+m_N0]);
1933        rowIndex.push_back(m_dofMap[firstNode+m_N0+1]);
1934        rowIndex.push_back(m_dofMap[firstNode+m_N0*m_N1]);
1935        rowIndex.push_back(m_dofMap[firstNode+m_N0*m_N1+1]);
1936        rowIndex.push_back(m_dofMap[firstNode+m_N0*(m_N1+1)]);
1937        rowIndex.push_back(m_dofMap[firstNode+m_N0*(m_N1+1)+1]);
1938        if (addF) {
1939            double *F_p=F.getSampleDataRW(0);
1940            for (index_t i=0; i<rowIndex.size(); i++) {
1941                if (rowIndex[i]<getNumDOF()) {
1942                    for (index_t eq=0; eq<nEq; eq++) {
1943                        F_p[INDEX2(eq, rowIndex[i], nEq)]+=EM_F[INDEX2(eq,i,nEq)];
1944                    }
1945                }
1946            }
1947        }
1948        if (addS) {
1949            addToSystemMatrix(S, rowIndex, nEq, rowIndex, nComp, EM_S);
1950        }
1951    }
1952    
1953  //protected  //protected
1954  void Brick::interpolateNodesOnElements(escript::Data& out, escript::Data& in,  void Brick::interpolateNodesOnElements(escript::Data& out, escript::Data& in,
1955                                         bool reduced) const                                         bool reduced) const
# Line 1918  void Brick::interpolateNodesOnElements(e Line 1957  void Brick::interpolateNodesOnElements(e
1957      const dim_t numComp = in.getDataPointSize();      const dim_t numComp = in.getDataPointSize();
1958      if (reduced) {      if (reduced) {
1959          out.requireWrite();          out.requireWrite();
         /*** GENERATOR SNIP_INTERPOLATE_REDUCED_ELEMENTS TOP */  
1960          const double c0 = .125;          const double c0 = .125;
1961  #pragma omp parallel for  #pragma omp parallel for
1962          for (index_t k2=0; k2 < m_NE2; ++k2) {          for (index_t k2=0; k2 < m_NE2; ++k2) {
1963              for (index_t k1=0; k1 < m_NE1; ++k1) {              for (index_t k1=0; k1 < m_NE1; ++k1) {
1964                  for (index_t k0=0; k0 < m_NE0; ++k0) {                  for (index_t k0=0; k0 < m_NE0; ++k0) {
1965                      const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,k2, m_N0,m_N1));                      const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,k2, m_N0,m_N1));
1966                      const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));                      const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));
1967                      const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));                      const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));
1968                      const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));                      const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));
1969                      const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));                      const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));
1970                      const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));                      const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));
1971                      const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));                      const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));
1972                      const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));                      const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));
1973                      double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));                      double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));
1974                      for (index_t i=0; i < numComp; ++i) {                      for (index_t i=0; i < numComp; ++i) {
1975                          o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_001[i] + f_010[i] + f_011[i] + f_100[i] + f_101[i] + f_110[i] + f_111[i]);                          o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_001[i] + f_010[i] + f_011[i] + f_100[i] + f_101[i] + f_110[i] + f_111[i]);
1976                      } /* end of component loop i */                      } // end of component loop i
1977                  } /* end of k0 loop */                  } // end of k0 loop
1978              } /* end of k1 loop */              } // end of k1 loop
1979          } /* end of k2 loop */          } // end of k2 loop
         /* GENERATOR SNIP_INTERPOLATE_REDUCED_ELEMENTS BOTTOM */  
1980      } else {      } else {
1981          out.requireWrite();          out.requireWrite();
         /*** GENERATOR SNIP_INTERPOLATE_ELEMENTS TOP */  
1982          const double c0 = .0094373878376559314545;          const double c0 = .0094373878376559314545;
1983          const double c1 = .035220810900864519624;          const double c1 = .035220810900864519624;
1984          const double c2 = .13144585576580214704;          const double c2 = .13144585576580214704;
# Line 1951  void Brick::interpolateNodesOnElements(e Line 1987  void Brick::interpolateNodesOnElements(e
1987          for (index_t k2=0; k2 < m_NE2; ++k2) {          for (index_t k2=0; k2 < m_NE2; ++k2) {
1988              for (index_t k1=0; k1 < m_NE1; ++k1) {              for (index_t k1=0; k1 < m_NE1; ++k1) {
1989                  for (index_t k0=0; k0 < m_NE0; ++k0) {                  for (index_t k0=0; k0 < m_NE0; ++k0) {
1990                      const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,k2, m_N0,m_N1));                      const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,k2, m_N0,m_N1));
1991                      const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));                      const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,k2+1, m_N0,m_N1));
1992                      const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));                      const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,k2+1, m_N0,m_N1));
1993                      const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));                      const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,k2+1, m_N0,m_N1));
1994                      const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));                      const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2, m_N0,m_N1));
1995                      const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));                      const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,k2, m_N0,m_N1));
1996                      const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));                      const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,k2, m_N0,m_N1));
1997                      const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));                      const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,k2+1, m_N0,m_N1));
1998                      double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));                      double* o = out.getSampleDataRW(INDEX3(k0,k1,k2,m_NE0,m_NE1));
1999                      for (index_t i=0; i < numComp; ++i) {                      for (index_t i=0; i < numComp; ++i) {
2000                          o[INDEX2(i,numComp,0)] = f_000[i]*c3 + f_111[i]*c0 + c2*(f_001[i] + f_010[i] + f_100[i]) + c1*(f_011[i] + f_101[i] + f_110[i]);                          o[INDEX2(i,numComp,0)] = f_000[i]*c3 + f_111[i]*c0 + c2*(f_001[i] + f_010[i] + f_100[i]) + c1*(f_011[i] + f_101[i] + f_110[i]);
# Line 1969  void Brick::interpolateNodesOnElements(e Line 2005  void Brick::interpolateNodesOnElements(e
2005                          o[INDEX2(i,numComp,5)] = f_010[i]*c0 + f_101[i]*c3 + c2*(f_001[i] + f_100[i] + f_111[i]) + c1*(f_000[i] + f_011[i] + f_110[i]);                          o[INDEX2(i,numComp,5)] = f_010[i]*c0 + f_101[i]*c3 + c2*(f_001[i] + f_100[i] + f_111[i]) + c1*(f_000[i] + f_011[i] + f_110[i]);
2006                          o[INDEX2(i,numComp,6)] = f_011[i]*c3 + f_100[i]*c0 + c2*(f_001[i] + f_010[i] + f_111[i]) + c1*(f_000[i] + f_101[i] + f_110[i]);                          o[INDEX2(i,numComp,6)] = f_011[i]*c3 + f_100[i]*c0 + c2*(f_001[i] + f_010[i] + f_111[i]) + c1*(f_000[i] + f_101[i] + f_110[i]);
2007                          o[INDEX2(i,numComp,7)] = f_000[i]*c0 + f_111[i]*c3 + c2*(f_011[i] + f_101[i] + f_110[i]) + c1*(f_001[i] + f_010[i] + f_100[i]);                          o[INDEX2(i,numComp,7)] = f_000[i]*c0 + f_111[i]*c3 + c2*(f_011[i] + f_101[i] + f_110[i]) + c1*(f_001[i] + f_010[i] + f_100[i]);
2008                      } /* end of component loop i */                      } // end of component loop i
2009                  } /* end of k0 loop */                  } // end of k0 loop
2010              } /* end of k1 loop */              } // end of k1 loop
2011          } /* end of k2 loop */          } // end of k2 loop
         /* GENERATOR SNIP_INTERPOLATE_ELEMENTS BOTTOM */  
2012      }      }
2013  }  }
2014    
# Line 1987  void Brick::interpolateNodesOnFaces(escr Line 2022  void Brick::interpolateNodesOnFaces(escr
2022          const double c0 = .25;          const double c0 = .25;
2023  #pragma omp parallel  #pragma omp parallel
2024          {          {
             /*** GENERATOR SNIP_INTERPOLATE_REDUCED_FACES TOP */  
2025              if (m_faceOffset[0] > -1) {              if (m_faceOffset[0] > -1) {
2026  #pragma omp for nowait  #pragma omp for nowait
2027                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2028                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
2029                          const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));                          const double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));
2030                          const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));                          const double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));
2031                          const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));                          const double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));
2032                          const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));                          const double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));
2033                          double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));                          double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
2034                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2035                              o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_001[i] + f_010[i] + f_011[i]);                              o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_001[i] + f_010[i] + f_011[i]);
2036                          } /* end of component loop i */                          } // end of component loop i
2037                      } /* end of k1 loop */                      } // end of k1 loop
2038                  } /* end of k2 loop */                  } // end of k2 loop
2039              } /* end of face 0 */              } // end of face 0
2040              if (m_faceOffset[1] > -1) {              if (m_faceOffset[1] > -1) {
2041  #pragma omp for nowait  #pragma omp for nowait
2042                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2043                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
2044                          const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));                          const double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));
2045                          const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));                          const double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));
2046                          const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));                          const double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));
2047                          const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));                          const double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));
2048                          double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));                          double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
2049                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2050                              o[INDEX2(i,numComp,0)] = c0*(f_100[i] + f_101[i] + f_110[i] + f_111[i]);                              o[INDEX2(i,numComp,0)] = c0*(f_100[i] + f_101[i] + f_110[i] + f_111[i]);
2051                          } /* end of component loop i */                          } // end of component loop i
2052                      } /* end of k1 loop */                      } // end of k1 loop
2053                  } /* end of k2 loop */                  } // end of k2 loop
2054              } /* end of face 1 */              } // end of face 1
2055              if (m_faceOffset[2] > -1) {              if (m_faceOffset[2] > -1) {
2056  #pragma omp for nowait  #pragma omp for nowait
2057                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2058                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2059                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));                          const double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));
2060                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));                          const double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));
2061                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));                          const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));
2062                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));                          const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));
2063                          double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
2064                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2065                              o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_001[i] + f_100[i] + f_101[i]);                              o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_001[i] + f_100[i] + f_101[i]);
2066                          } /* end of component loop i */                          } // end of component loop i
2067                      } /* end of k0 loop */                      } // end of k0 loop
2068                  } /* end of k2 loop */                  } // end of k2 loop
2069              } /* end of face 2 */              } // end of face 2
2070              if (m_faceOffset[3] > -1) {              if (m_faceOffset[3] > -1) {
2071  #pragma omp for nowait  #pragma omp for nowait
2072                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2073                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2074                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));                          const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));
2075                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));                          const double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));
2076                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));                          const double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));
2077                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));                          const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));
2078                          double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
2079                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2080                              o[INDEX2(i,numComp,0)] = c0*(f_010[i] + f_011[i] + f_110[i] + f_111[i]);                              o[INDEX2(i,numComp,0)] = c0*(f_010[i] + f_011[i] + f_110[i] + f_111[i]);
2081                          } /* end of component loop i */                          } // end of component loop i
2082                      } /* end of k0 loop */                      } // end of k0 loop
2083                  } /* end of k2 loop */                  } // end of k2 loop
2084              } /* end of face 3 */              } // end of face 3
2085              if (m_faceOffset[4] > -1) {              if (m_faceOffset[4] > -1) {
2086  #pragma omp for nowait  #pragma omp for nowait
2087                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
2088                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2089                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));                          const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));
2090                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));                          const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));
2091                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));                          const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));
2092                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));                          const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));
2093                          double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
2094                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2095                              o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_010[i] + f_100[i] + f_110[i]);                              o[INDEX2(i,numComp,0)] = c0*(f_000[i] + f_010[i] + f_100[i] + f_110[i]);
2096                          } /* end of component loop i */                          } // end of component loop i
2097                      } /* end of k0 loop */                      } // end of k0 loop
2098                  } /* end of k1 loop */                  } // end of k1 loop
2099              } /* end of face 4 */              } // end of face 4
2100              if (m_faceOffset[5] > -1) {              if (m_faceOffset[5] > -1) {
2101  #pragma omp for nowait  #pragma omp for nowait
2102                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
2103                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2104                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));                          const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));
2105                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));                          const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));
2106                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));                          const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));
2107                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));                          const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));
2108                          double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
2109                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2110                              o[INDEX2(i,numComp,0)] = c0*(f_001[i] + f_011[i] + f_101[i] + f_111[i]);                              o[INDEX2(i,numComp,0)] = c0*(f_001[i] + f_011[i] + f_101[i] + f_111[i]);
2111                          } /* end of component loop i */                          } // end of component loop i
2112                      } /* end of k0 loop */                      } // end of k0 loop
2113                  } /* end of k1 loop */                  } // end of k1 loop
2114              } /* end of face 5 */              } // end of face 5
             /* GENERATOR SNIP_INTERPOLATE_REDUCED_FACES BOTTOM */  
2115          } // end of parallel section          } // end of parallel section
2116      } else {      } else {
2117          out.requireWrite();          out.requireWrite();
# Line 2087  void Brick::interpolateNodesOnFaces(escr Line 2120  void Brick::interpolateNodesOnFaces(escr
2120          const double c2 = 0.62200846792814621559;          const double c2 = 0.62200846792814621559;
2121  #pragma omp parallel  #pragma omp parallel
2122          {          {
             /*** GENERATOR SNIP_INTERPOLATE_FACES TOP */  
2123              if (m_faceOffset[0] > -1) {              if (m_faceOffset[0] > -1) {
2124  #pragma omp for nowait  #pragma omp for nowait
2125                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2126                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
2127                          const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));                          const double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));
2128                          const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));                          const double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));
2129                          const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));                          const double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));
2130                          const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));                          const double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));
2131                          double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));                          double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
2132                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2133                              o[INDEX2(i,numComp,0)] = f_000[i]*c2 + f_011[i]*c0 + c1*(f_001[i] + f_010[i]);                              o[INDEX2(i,numComp,0)] = f_000[i]*c2 + f_011[i]*c0 + c1*(f_001[i] + f_010[i]);
2134                              o[INDEX2(i,numComp,1)] = f_001[i]*c0 + f_010[i]*c2 + c1*(f_000[i] + f_011[i]);                              o[INDEX2(i,numComp,1)] = f_001[i]*c0 + f_010[i]*c2 + c1*(f_000[i] + f_011[i]);
2135                              o[INDEX2(i,numComp,2)] = f_001[i]*c2 + f_010[i]*c0 + c1*(f_000[i] + f_011[i]);                              o[INDEX2(i,numComp,2)] = f_001[i]*c2 + f_010[i]*c0 + c1*(f_000[i] + f_011[i]);
2136                              o[INDEX2(i,numComp,3)] = f_000[i]*c0 + f_011[i]*c2 + c1*(f_001[i] + f_010[i]);                              o[INDEX2(i,numComp,3)] = f_000[i]*c0 + f_011[i]*c2 + c1*(f_001[i] + f_010[i]);
2137                          } /* end of component loop i */                          } // end of component loop i
2138                      } /* end of k1 loop */                      } // end of k1 loop
2139                  } /* end of k2 loop */                  } // end of k2 loop
2140              } /* end of face 0 */              } // end of face 0
2141              if (m_faceOffset[1] > -1) {              if (m_faceOffset[1] > -1) {
2142  #pragma omp for nowait  #pragma omp for nowait
2143                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2144                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
2145                          const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));                          const double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));
2146                          const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));                          const double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));
2147                          const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));                          const double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));
2148                          const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));                          const double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));
2149                          double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));                          double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
2150                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2151                              o[INDEX2(i,numComp,0)] = f_100[i]*c2 + f_111[i]*c0 + c1*(f_101[i] + f_110[i]);                              o[INDEX2(i,numComp,0)] = f_100[i]*c2 + f_111[i]*c0 + c1*(f_101[i] + f_110[i]);
2152                              o[INDEX2(i,numComp,1)] = f_101[i]*c0 + f_110[i]*c2 + c1*(f_100[i] + f_111[i]);                              o[INDEX2(i,numComp,1)] = f_101[i]*c0 + f_110[i]*c2 + c1*(f_100[i] + f_111[i]);
2153                              o[INDEX2(i,numComp,2)] = f_101[i]*c2 + f_110[i]*c0 + c1*(f_100[i] + f_111[i]);                              o[INDEX2(i,numComp,2)] = f_101[i]*c2 + f_110[i]*c0 + c1*(f_100[i] + f_111[i]);
2154                              o[INDEX2(i,numComp,3)] = f_100[i]*c0 + f_111[i]*c2 + c1*(f_101[i] + f_110[i]);                              o[INDEX2(i,numComp,3)] = f_100[i]*c0 + f_111[i]*c2 + c1*(f_101[i] + f_110[i]);
2155                          } /* end of component loop i */                          } // end of component loop i
2156                      } /* end of k1 loop */                      } // end of k1 loop
2157                  } /* end of k2 loop */                  } // end of k2 loop
2158              } /* end of face 1 */              } // end of face 1
2159              if (m_faceOffset[2] > -1) {              if (m_faceOffset[2] > -1) {
2160  #pragma omp for nowait  #pragma omp for nowait
2161                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2162                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2163                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));                          const double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));
2164                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));                          const double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));
2165                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));                          const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));
2166                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));                          const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));
2167                          double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
2168                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2169                              o[INDEX2(i,numComp,0)] = f_000[i]*c2 + f_101[i]*c0 + c1*(f_001[i] + f_100[i]);                              o[INDEX2(i,numComp,0)] = f_000[i]*c2 + f_101[i]*c0 + c1*(f_001[i] + f_100[i]);
2170                              o[INDEX2(i,numComp,1)] = f_001[i]*c0 + f_100[i]*c2 + c1*(f_000[i] + f_101[i]);                              o[INDEX2(i,numComp,1)] = f_001[i]*c0 + f_100[i]*c2 + c1*(f_000[i] + f_101[i]);
2171                              o[INDEX2(i,numComp,2)] = f_001[i]*c2 + f_100[i]*c0 + c1*(f_000[i] + f_101[i]);                              o[INDEX2(i,numComp,2)] = f_001[i]*c2 + f_100[i]*c0 + c1*(f_000[i] + f_101[i]);
2172                              o[INDEX2(i,numComp,3)] = f_000[i]*c0 + f_101[i]*c2 + c1*(f_001[i] + f_100[i]);                              o[INDEX2(i,numComp,3)] = f_000[i]*c0 + f_101[i]*c2 + c1*(f_001[i] + f_100[i]);
2173                          } /* end of component loop i */                          } // end of component loop i
2174                      } /* end of k0 loop */                      } // end of k0 loop
2175                  } /* end of k2 loop */                  } // end of k2 loop
2176              } /* end of face 2 */              } // end of face 2
2177              if (m_faceOffset[3] > -1) {              if (m_faceOffset[3] > -1) {
2178  #pragma omp for nowait  #pragma omp for nowait
2179                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
2180                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2181                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));                          const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));
2182                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));                          const double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));
2183                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));                          const double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));
2184                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));                          const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));
2185                          double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
2186                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2187                              o[INDEX2(i,numComp,0)] = f_010[i]*c2 + f_111[i]*c0 + c1*(f_011[i] + f_110[i]);                              o[INDEX2(i,numComp,0)] = f_010[i]*c2 + f_111[i]*c0 + c1*(f_011[i] + f_110[i]);
2188                              o[INDEX2(i,numComp,1)] = f_011[i]*c0 + f_110[i]*c2 + c1*(f_010[i] + f_111[i]);                              o[INDEX2(i,numComp,1)] = f_011[i]*c0 + f_110[i]*c2 + c1*(f_010[i] + f_111[i]);
2189                              o[INDEX2(i,numComp,2)] = f_011[i]*c2 + f_110[i]*c0 + c1*(f_010[i] + f_111[i]);                              o[INDEX2(i,numComp,2)] = f_011[i]*c2 + f_110[i]*c0 + c1*(f_010[i] + f_111[i]);
2190                              o[INDEX2(i,numComp,3)] = f_010[i]*c0 + f_111[i]*c2 + c1*(f_011[i] + f_110[i]);                              o[INDEX2(i,numComp,3)] = f_010[i]*c0 + f_111[i]*c2 + c1*(f_011[i] + f_110[i]);
2191                          } /* end of component loop i */                          } // end of component loop i
2192                      } /* end of k0 loop */                      } // end of k0 loop
2193                  } /* end of k2 loop */                  } // end of k2 loop
2194              } /* end of face 3 */              } // end of face 3
2195              if (m_faceOffset[4] > -1) {              if (m_faceOffset[4] > -1) {
2196  #pragma omp for nowait  #pragma omp for nowait
2197                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
2198                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2199                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));                          const double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));
2200                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));                          const double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));
2201                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));                          const double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));
2202                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));                          const double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));
2203                          double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
2204                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2205                              o[INDEX2(i,numComp,0)] = f_000[i]*c2 + f_110[i]*c0 + c1*(f_010[i] + f_100[i]);                              o[INDEX2(i,numComp,0)] = f_000[i]*c2 + f_110[i]*c0 + c1*(f_010[i] + f_100[i]);
2206                              o[INDEX2(i,numComp,1)] = f_010[i]*c0 + f_100[i]*c2 + c1*(f_000[i] + f_110[i]);                              o[INDEX2(i,numComp,1)] = f_010[i]*c0 + f_100[i]*c2 + c1*(f_000[i] + f_110[i]);
2207                              o[INDEX2(i,numComp,2)] = f_010[i]*c2 + f_100[i]*c0 + c1*(f_000[i] + f_110[i]);                              o[INDEX2(i,numComp,2)] = f_010[i]*c2 + f_100[i]*c0 + c1*(f_000[i] + f_110[i]);
2208                              o[INDEX2(i,numComp,3)] = f_000[i]*c0 + f_110[i]*c2 + c1*(f_010[i] + f_100[i]);                              o[INDEX2(i,numComp,3)] = f_000[i]*c0 + f_110[i]*c2 + c1*(f_010[i] + f_100[i]);
2209                          } /* end of component loop i */                          } // end of component loop i
2210                      } /* end of k0 loop */                      } // end of k0 loop
2211                  } /* end of k1 loop */                  } // end of k1 loop
2212              } /* end of face 4 */              } // end of face 4
2213              if (m_faceOffset[5] > -1) {              if (m_faceOffset[5] > -1) {
2214  #pragma omp for nowait  #pragma omp for nowait
2215                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
2216                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
2217                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));                          const double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));
2218                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));                          const double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));
2219                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));                          const double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));
2220                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));                          const double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));
2221                          double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));                          double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
2222                          for (index_t i=0; i < numComp; ++i) {                          for (index_t i=0; i < numComp; ++i) {
2223                              o[INDEX2(i,numComp,0)] = f_001[i]*c2 + f_111[i]*c0 + c1*(f_011[i] + f_101[i]);                              o[INDEX2(i,numComp,0)] = f_001[i]*c2 + f_111[i]*c0 + c1*(f_011[i] + f_101[i]);
2224                              o[INDEX2(i,numComp,1)] = f_011[i]*c0 + f_101[i]*c2 + c1*(f_001[i] + f_111[i]);                              o[INDEX2(i,numComp,1)] = f_011[i]*c0 + f_101[i]*c2 + c1*(f_001[i] + f_111[i]);
2225                              o[INDEX2(i,numComp,2)] = f_011[i]*c2 + f_101[i]*c0 + c1*(f_001[i] + f_111[i]);                              o[INDEX2(i,numComp,2)] = f_011[i]*c2 + f_101[i]*c0 + c1*(f_001[i] + f_111[i]);
2226                              o[INDEX2(i,numComp,3)] = f_001[i]*c0 + f_111[i]*c2 + c1*(f_011[i] + f_101[i]);                              o[INDEX2(i,numComp,3)] = f_001[i]*c0 + f_111[i]*c2 + c1*(f_011[i] + f_101[i]);
2227                          } /* end of component loop i */                          } // end of component loop i
2228                      } /* end of k0 loop */                      } // end of k0 loop
2229                  } /* end of k1 loop */                  } // end of k1 loop
2230              } /* end of face 5 */              } // end of face 5
             /* GENERATOR SNIP_INTERPOLATE_FACES BOTTOM */  
2231          } // end of parallel section          } // end of parallel section
2232      }      }
2233  }  }
# Line 2205  void Brick::interpolateNodesOnFaces(escr Line 2236  void Brick::interpolateNodesOnFaces(escr
2236  void Brick::assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,  void Brick::assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
2237          const escript::Data& A, const escript::Data& B,          const escript::Data& A, const escript::Data& B,
2238          const escript::Data& C, const escript::Data& D,          const escript::Data& C, const escript::Data& D,
2239          const escript::Data& X, const escript::Data& Y,          const escript::Data& X, const escript::Data& Y) const
         const escript::Data& d, const escript::Data& y) const  
2240  {  {
2241      const double h0 = m_l0/m_gNE0;      const double h0 = m_l0/m_gNE0;
2242      const double h1 = m_l1/m_gNE1;      const double h1 = m_l1/m_gNE1;
2243      const double h2 = m_l2/m_gNE2;      const double h2 = m_l2/m_gNE2;
     /*** GENERATOR SNIP_PDE_SINGLE_PRE TOP */  
2244      const double w0 = 0.0009303791403858427308*h1*h2/h0;      const double w0 = 0.0009303791403858427308*h1*h2/h0;
2245      const double w1 = 0.0009303791403858427308*h2;      const double w1 = 0.0009303791403858427308*h2;
2246        const double w2 = -0.00024929433932114870101*h1;
2247        const double w3 = 0.0009303791403858427308*h0*h2/h1;
2248        const double w4 = -0.00024929433932114870101*h0;
2249        const double w5 = 0.0009303791403858427308*h1;
2250        const double w6 = 0.0009303791403858427308*h0;
2251        const double w7 = -0.00024929433932114870101*h0*h1/h2;
2252        const double w8 = 0.0034722222222222222222*h2;
2253        const double w9 = -0.0009303791403858427308*h1;
2254      const double w10 = 0.012958509748503046158*h0*h2/h1;      const double w10 = 0.012958509748503046158*h0*h2/h1;
     const double w100 = 0.038141762351741127649*h0*h1;  
     const double w101 = 0.000052682092703316795705*h0*h1;  
     const double w102 = 0.0007337668937680108255*h0*h1;  
     const double w103 = 0.010220054420048834761*h0*h1;  
     const double w104 = -0.0001966122466178319053*h1*h2;  
     const double w105 = -0.0001966122466178319053*h0*h2;  
     const double w106 = -0.0007337668937680108255*h1*h2;  
     const double w107 = -0.0007337668937680108255*h0*h2;  
     const double w108 = -0.0027384553284542113967*h1*h2;  
     const double w109 = -0.0027384553284542113967*h0*h2;  
2255      const double w11 = -0.0034722222222222222222*h0;      const double w11 = -0.0034722222222222222222*h0;
     const double w110 = -0.010220054420048834761*h1*h2;  
     const double w111 = -0.010220054420048834761*h0*h2;  
     const double w112 = -0.0007337668937680108255*h0*h1;  
     const double w113 = -0.010220054420048834761*h0*h1;  
     const double w114 = -0.038141762351741127649*h0*h2;  
     const double w115 = -0.000052682092703316795705*h0*h2;  
     const double w116 = -0.0001966122466178319053*h0*h1;  
     const double w117 = -0.0027384553284542113967*h0*h1;  
     const double w118 = 0.000052682092703316795705*h0*h2;  
     const double w119 = 0.038141762351741127649*h0*h2;  
2256      const double w12 = 0.0034722222222222222222*h1;      const double w12 = 0.0034722222222222222222*h1;
     const double w120 = 0.000052682092703316795705*h1*h2;  
     const double w121 = 0.038141762351741127649*h1*h2;  
     const double w122 = -0.000052682092703316795705*h0*h1;  
     const double w123 = -0.038141762351741127649*h0*h1;  
     const double w124 = -0.000052682092703316795705*h1*h2;  
     const double w125 = -0.038141762351741127649*h1*h2;  
     const double w126 = 0.027777777777777777778*h1*h2;  
     const double w127 = 0.027777777777777777778*h0*h2;  
     const double w128 = 0.055555555555555555556*h0*h1;  
     const double w129 = -0.027777777777777777778*h1*h2;  
2257      const double w13 = 0.012958509748503046158*h0;      const double w13 = 0.012958509748503046158*h0;
     const double w130 = -0.027777777777777777778*h0*h2;  
     const double w131 = 0.013888888888888888889*h0*h1;  
     const double w132 = -0.055555555555555555556*h0*h2;  
     const double w133 = -0.027777777777777777778*h0*h1;  
     const double w134 = 0.055555555555555555556*h0*h2;  
     const double w135 = 0.027777777777777777778*h0*h1;  
     const double w136 = -0.013888888888888888889*h0*h1;  
     const double w137 = 0.055555555555555555556*h1*h2;  
     const double w138 = -0.013888888888888888889*h1*h2;  
     const double w139 = -0.013888888888888888889*h0*h2;  
2258      const double w14 = -0.0034722222222222222222*h0*h1/h2;      const double w14 = -0.0034722222222222222222*h0*h1/h2;
     const double w140 = -0.055555555555555555556*h0*h1;  
     const double w141 = 0.013888888888888888889*h1*h2;  
     const double w142 = 0.013888888888888888889*h0*h2;  
     const double w143 = -0.055555555555555555556*h1*h2;  
     const double w144 = 0.000041549056553524783501*h0*h1*h2;  
     const double w145 = 0.0005787037037037037037*h0*h1*h2;  
     const double w146 = 0.0080603027952983270684*h0*h1*h2;  
     const double w147 = 0.0001550631900643071218*h0*h1*h2;  
     const double w148 = 0.002159751624750507693*h0*h1*h2;  
     const double w149 = 0.03008145955644280058*h0*h1*h2;  
2259      const double w15 = 0.012958509748503046158*h1*h2/h0;      const double w15 = 0.012958509748503046158*h1*h2/h0;
     const double w150 = 0.000011133036149792012204*h0*h1*h2;  
     const double w151 = 0.018518518518518518519*h0*h1*h2;  
     const double w152 = 0.0092592592592592592592*h0*h1*h2;  
     const double w153 = 0.0046296296296296296296*h0*h1*h2;  
     const double w154 = 0.037037037037037037037*h0*h1*h2;  
     const double w155 = -0.077751058491018276949*h1*h2;  
     const double w156 = -0.077751058491018276949*h0*h2;  
     const double w157 = -0.077751058491018276949*h0*h1;  
     const double w158 = -0.020833333333333333333*h0*h2;  
     const double w159 = -0.020833333333333333333*h0*h1;  
2260      const double w16 = -0.0034722222222222222222*h1;      const double w16 = -0.0034722222222222222222*h1;
     const double w160 = -0.020833333333333333333*h1*h2;  
     const double w161 = -0.0055822748423150563848*h0*h1;  
     const double w162 = -0.0055822748423150563848*h0*h2;  
     const double w163 = -0.0055822748423150563848*h1*h2;  
     const double w164 = 0.077751058491018276949*h1*h2;  
     const double w165 = 0.020833333333333333333*h1*h2;  
     const double w166 = 0.0055822748423150563848*h1*h2;  
     const double w167 = 0.077751058491018276949*h0*h2;  
     const double w168 = 0.020833333333333333333*h0*h2;  
     const double w169 = 0.0055822748423150563848*h0*h2;  
2261      const double w17 = -0.0009303791403858427308*h0;      const double w17 = -0.0009303791403858427308*h0;
     const double w170 = 0.077751058491018276949*h0*h1;  
     const double w171 = 0.020833333333333333333*h0*h1;  
     const double w172 = 0.0055822748423150563848*h0*h1;  
     const double w173 = -0.25*h1*h2;  
     const double w174 = -0.25*h0*h2;  
     const double w175 = -0.25*h0*h1;  
     const double w176 = 0.25*h1*h2;  
     const double w177 = 0.25*h0*h2;  
     const double w178 = 0.25*h0*h1;  
     const double w179 = 0.061320326520293008568*h0*h1*h2;  
2262      const double w18 = 0.012958509748503046158*h1;      const double w18 = 0.012958509748503046158*h1;
     const double w180 = 0.01643073197072526838*h0*h1*h2;  
     const double w181 = 0.004402601362608064953*h0*h1*h2;  
     const double w182 = 0.0011796734797069914318*h0*h1*h2;  
     const double w183 = 0.125*h0*h1*h2;  
2263      const double w19 = 0.0034722222222222222222*h0;      const double w19 = 0.0034722222222222222222*h0;
     const double w2 = -0.00024929433932114870101*h1;  
2264      const double w20 = 0.012958509748503046158*h2;      const double w20 = 0.012958509748503046158*h2;
2265      const double w21 = -0.012958509748503046158*h1;      const double w21 = -0.012958509748503046158*h1;
2266      const double w22 = -0.012958509748503046158*h0;      const double w22 = -0.012958509748503046158*h0;
# Line 2319  void Brick::assemblePDESingle(Paso_Syste Line 2271  void Brick::assemblePDESingle(Paso_Syste
2271      const double w27 = 0.00024929433932114870101*h0;      const double w27 = 0.00024929433932114870101*h0;
2272      const double w28 = -0.04836181677178996241*h1;      const double w28 = -0.04836181677178996241*h1;
2273      const double w29 = -0.04836181677178996241*h0;      const double w29 = -0.04836181677178996241*h0;
     const double w3 = 0.0009303791403858427308*h0*h2/h1;  
2274      const double w30 = -0.0009303791403858427308*h1*h2/h0;      const double w30 = -0.0009303791403858427308*h1*h2/h0;
2275      const double w31 = -0.0009303791403858427308*h2;      const double w31 = -0.0009303791403858427308*h2;
2276      const double w32 = -0.0009303791403858427308*h0*h2/h1;      const double w32 = -0.0009303791403858427308*h0*h2/h1;
# Line 2330  void Brick::assemblePDESingle(Paso_Syste Line 2281  void Brick::assemblePDESingle(Paso_Syste
2281      const double w37 = -0.012958509748503046158*h2;      const double w37 = -0.012958509748503046158*h2;
2282      const double w38 = -0.012958509748503046158*h0*h2/h1;      const double w38 = -0.012958509748503046158*h0*h2/h1;
2283      const double w39 = -0.04836181677178996241*h2;      const double w39 = -0.04836181677178996241*h2;
     const double w4 = -0.00024929433932114870101*h0;  
2284      const double w40 = -0.0034722222222222222222*h0*h2/h1;      const double w40 = -0.0034722222222222222222*h0*h2/h1;
2285      const double w41 = 0.0009303791403858427308*h0*h1/h2;      const double w41 = 0.0009303791403858427308*h0*h1/h2;
2286      const double w42 = 0.04836181677178996241*h2;      const double w42 = 0.04836181677178996241*h2;
# Line 2341  void Brick::assemblePDESingle(Paso_Syste Line 2291  void Brick::assemblePDESingle(Paso_Syste
2291      const double w47 = -0.0034722222222222222222*h1*h2/h0;      const double w47 = -0.0034722222222222222222*h1*h2/h0;
2292      const double w48 = -0.00024929433932114870101*h1*h2/h0;      const double w48 = -0.00024929433932114870101*h1*h2/h0;
2293      const double w49 = -0.04836181677178996241*h1*h2/h0;      const double w49 = -0.04836181677178996241*h1*h2/h0;
     const double w5 = 0.0009303791403858427308*h1;  
2294      const double w50 = 0.0034722222222222222222*h0*h2/h1;      const double w50 = 0.0034722222222222222222*h0*h2/h1;
2295      const double w51 = -0.0009303791403858427308*h0*h1/h2;      const double w51 = -0.0009303791403858427308*h0*h1/h2;
2296      const double w52 = -0.012958509748503046158*h0*h1/h2;      const double w52 = -0.012958509748503046158*h0*h1/h2;
# Line 2352  void Brick::assemblePDESingle(Paso_Syste Line 2301  void Brick::assemblePDESingle(Paso_Syste
2301      const double w57 = 0.04836181677178996241*h0*h1/h2;      const double w57 = 0.04836181677178996241*h0*h1/h2;
2302      const double w58 = 0.00024929433932114870101*h1*h2/h0;      const double w58 = 0.00024929433932114870101*h1*h2/h0;
2303      const double w59 = 0.00024929433932114870101*h0*h2/h1;      const double w59 = 0.00024929433932114870101*h0*h2/h1;
     const double w6 = 0.0009303791403858427308*h0;  
2304      const double w60 = 0.055555555555555555556*h1*h2/h0;      const double w60 = 0.055555555555555555556*h1*h2/h0;
2305      const double w61 = 0.041666666666666666667*h2;      const double w61 = 0.041666666666666666667*h2;
2306      const double w62 = -0.083333333333333333333*h1;      const double w62 = -0.083333333333333333333*h1;
# Line 2363  void Brick::assemblePDESingle(Paso_Syste Line 2311  void Brick::assemblePDESingle(Paso_Syste
2311      const double w67 = -0.11111111111111111111*h0*h1/h2;      const double w67 = -0.11111111111111111111*h0*h1/h2;
2312      const double w68 = -0.055555555555555555556*h1*h2/h0;      const double w68 = -0.055555555555555555556*h1*h2/h0;
2313      const double w69 = -0.083333333333333333333*h2;      const double w69 = -0.083333333333333333333*h2;
     const double w7 = -0.00024929433932114870101*h0*h1/h2;  
2314      const double w70 = -0.041666666666666666667*h1;      const double w70 = -0.041666666666666666667*h1;
2315      const double w71 = -0.055555555555555555556*h0*h2/h1;      const double w71 = -0.055555555555555555556*h0*h2/h1;
2316      const double w72 = -0.041666666666666666667*h0;      const double w72 = -0.041666666666666666667*h0;
# Line 2374  void Brick::assemblePDESingle(Paso_Syste Line 2321  void Brick::assemblePDESingle(Paso_Syste
2321      const double w77 = -0.11111111111111111111*h0*h2/h1;      const double w77 = -0.11111111111111111111*h0*h2/h1;
2322      const double w78 = 0.055555555555555555556*h0*h1/h2;      const double w78 = 0.055555555555555555556*h0*h1/h2;
2323      const double w79 = -0.11111111111111111111*h1*h2/h0;      const double w79 = -0.11111111111111111111*h1*h2/h0;
     const double w8 = 0.0034722222222222222222*h2;  
2324      const double w80 = -0.027777777777777777778*h1*h2/h0;      const double w80 = -0.027777777777777777778*h1*h2/h0;
2325      const double w81 = -0.041666666666666666667*h2;      const double w81 = -0.041666666666666666667*h2;
2326      const double w82 = -0.027777777777777777778*h0*h2/h1;      const double w82 = -0.027777777777777777778*h0*h2/h1;
# Line 2385  void Brick::assemblePDESingle(Paso_Syste Line 2331  void Brick::assemblePDESingle(Paso_Syste
2331      const double w87 = 0.11111111111111111111*h0*h2/h1;      const double w87 = 0.11111111111111111111*h0*h2/h1;
2332      const double w88 = 0.11111111111111111111*h0*h1/h2;      const double w88 = 0.11111111111111111111*h0*h1/h2;
2333      const double w89 = 0.027777777777777777778*h1*h2/h0;      const double w89 = 0.027777777777777777778*h1*h2/h0;
     const double w9 = -0.0009303791403858427308*h1;  
2334      const double w90 = 0.0001966122466178319053*h1*h2;      const double w90 = 0.0001966122466178319053*h1*h2;
2335      const double w91 = 0.0001966122466178319053*h0*h2;      const double w91 = 0.0001966122466178319053*h0*h2;
2336      const double w92 = 0.0001966122466178319053*h0*h1;      const double w92 = 0.0001966122466178319053*h0*h1;
# Line 2396  void Brick::assemblePDESingle(Paso_Syste Line 2341  void Brick::assemblePDESingle(Paso_Syste
2341      const double w97 = 0.0007337668937680108255*h0*h2;      const double w97 = 0.0007337668937680108255*h0*h2;
2342      const double w98 = 0.010220054420048834761*h1*h2;      const double w98 = 0.010220054420048834761*h1*h2;
2343      const double w99 = 0.010220054420048834761*h0*h2;      const double w99 = 0.010220054420048834761*h0*h2;
2344      /* GENERATOR SNIP_PDE_SINGLE_PRE BOTTOM */      const double w100 = 0.038141762351741127649*h0*h1;
2345        const double w101 = 0.000052682092703316795705*h0*h1;
2346        const double w102 = 0.0007337668937680108255*h0*h1;
2347        const double w103 = 0.010220054420048834761*h0*h1;
2348        const double w104 = -0.0001966122466178319053*h1*h2;
2349        const double w105 = -0.0001966122466178319053*h0*h2;
2350        const double w106 = -0.0007337668937680108255*h1*h2;
2351        const double w107 = -0.0007337668937680108255*h0*h2;
2352        const double w108 = -0.0027384553284542113967*h1*h2;
2353        const double w109 = -0.0027384553284542113967*h0*h2;
2354        const double w110 = -0.010220054420048834761*h1*h2;
2355        const double w111 = -0.010220054420048834761*h0*h2;
2356        const double w112 = -0.0007337668937680108255*h0*h1;
2357        const double w113 = -0.010220054420048834761*h0*h1;
2358        const double w114 = -0.038141762351741127649*h0*h2;
2359        const double w115 = -0.000052682092703316795705*h0*h2;
2360        const double w116 = -0.0001966122466178319053*h0*h1;
2361        const double w117 = -0.0027384553284542113967*h0*h1;
2362        const double w118 = 0.000052682092703316795705*h0*h2;
2363        const double w119 = 0.038141762351741127649*h0*h2;
2364        const double w120 = 0.000052682092703316795705*h1*h2;
2365        const double w121 = 0.038141762351741127649*h1*h2;
2366        const double w122 = -0.000052682092703316795705*h0*h1;
2367        const double w123 = -0.038141762351741127649*h0*h1;
2368        const double w124 = -0.000052682092703316795705*h1*h2;
2369        const double w125 = -0.038141762351741127649*h1*h2;
2370        const double w126 = 0.027777777777777777778*h1*h2;
2371        const double w127 = 0.027777777777777777778*h0*h2;
2372        const double w128 = 0.055555555555555555556*h0*h1;
2373        const double w129 = -0.027777777777777777778*h1*h2;
2374        const double w130 = -0.027777777777777777778*h0*h2;
2375        const double w131 = 0.013888888888888888889*h0*h1;
2376        const double w132 = -0.055555555555555555556*h0*h2;
2377        const double w133 = -0.027777777777777777778*h0*h1;
2378        const double w134 = 0.055555555555555555556*h0*h2;
2379        const double w135 = 0.027777777777777777778*h0*h1;
2380        const double w136 = -0.013888888888888888889*h0*h1;
2381        const double w137 = 0.055555555555555555556*h1*h2;
2382        const double w138 = -0.013888888888888888889*h1*h2;
2383        const double w139 = -0.013888888888888888889*h0*h2;
2384        const double w140 = -0.055555555555555555556*h0*h1;
2385        const double w141 = 0.013888888888888888889*h1*h2;
2386        const double w142 = 0.013888888888888888889*h0*h2;
2387        const double w143 = -0.055555555555555555556*h1*h2;
2388        const double w144 = 0.000041549056553524783501*h0*h1*h2;
2389        const double w145 = 0.0005787037037037037037*h0*h1*h2;
2390        const double w146 = 0.0080603027952983270684*h0*h1*h2;
2391        const double w147 = 0.0001550631900643071218*h0*h1*h2;
2392        const double w148 = 0.002159751624750507693*h0*h1*h2;
2393        const double w149 = 0.03008145955644280058*h0*h1*h2;
2394        const double w150 = 0.000011133036149792012204*h0*h1*h2;
2395        const double w151 = 0.018518518518518518519*h0*h1*h2;
2396        const double w152 = 0.0092592592592592592592*h0*h1*h2;
2397        const double w153 = 0.0046296296296296296296*h0*h1*h2;
2398        const double w154 = 0.037037037037037037037*h0*h1*h2;
2399        const double w155 = -0.077751058491018276949*h1*h2;
2400        const double w156 = -0.077751058491018276949*h0*h2;
2401        const double w157 = -0.077751058491018276949*h0*h1;
2402        const double w158 = -0.020833333333333333333*h0*h2;
2403        const double w159 = -0.020833333333333333333*h0*h1;
2404        const double w160 = -0.020833333333333333333*h1*h2;
2405        const double w161 = -0.0055822748423150563848*h0*h1;
2406        const double w162 = -0.0055822748423150563848*h0*h2;
2407        const double w163 = -0.0055822748423150563848*h1*h2;
2408        const double w164 = 0.077751058491018276949*h1*h2;
2409        const double w165 = 0.020833333333333333333*h1*h2;
2410        const double w166 = 0.0055822748423150563848*h1*h2;
2411        const double w167 = 0.077751058491018276949*h0*h2;
2412        const double w168 = 0.020833333333333333333*h0*h2;
2413        const double w169 = 0.0055822748423150563848*h0*h2;
2414        const double w170 = 0.077751058491018276949*h0*h1;
2415        const double w171 = 0.020833333333333333333*h0*h1;
2416        const double w172 = 0.0055822748423150563848*h0*h1;
2417        const double w173 = -0.25*h1*h2;
2418        const double w174 = -0.25*h0*h2;
2419        const double w175 = -0.25*h0*h1;
2420        const double w176 = 0.25*h1*h2;
2421        const double w177 = 0.25*h0*h2;
2422        const double w178 = 0.25*h0*h1;
2423        const double w179 = 0.061320326520293008568*h0*h1*h2;
2424        const double w180 = 0.01643073197072526838*h0*h1*h2;
2425        const double w181 = 0.004402601362608064953*h0*h1*h2;
2426        const double w182 = 0.0011796734797069914318*h0*h1*h2;
2427        const double w183 = 0.125*h0*h1*h2;
2428    
2429      rhs.requireWrite();      rhs.requireWrite();
2430  #pragma omp parallel  #pragma omp parallel
# Line 2411  void Brick::assemblePDESingle(Paso_Syste Line 2439  void Brick::assemblePDESingle(Paso_Syste
2439                          vector<double> EM_S(8*8, 0);                          vector<double> EM_S(8*8, 0);
2440                          vector<double> EM_F(8, 0);                          vector<double> EM_F(8, 0);
2441                          const index_t e = k0 + m_NE0*k1 + m_NE0*m_NE1*k2;                          const index_t e = k0 + m_NE0*k1 + m_NE0*m_NE1*k2;
                         /*** GENERATOR SNIP_PDE_SINGLE TOP */  
2442                          ///////////////                          ///////////////
2443                          // process A //                          // process A //
2444                          ///////////////                          ///////////////
# Line 2419  void Brick::assemblePDESingle(Paso_Syste Line 2446  void Brick::assemblePDESingle(Paso_Syste
2446                              add_EM_S=true;                              add_EM_S=true;
2447                              const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);                              const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);
2448                              if (A.actsExpanded()) {                              if (A.actsExpanded()) {
2449                                  const register double A_00_0 = A_p[INDEX3(0,0,0,3,3)];                                  const double A_00_0 = A_p[INDEX3(0,0,0,3,3)];
2450                                  const register double A_01_0 = A_p[INDEX3(0,1,0,3,3)];                                  const double A_01_0 = A_p[INDEX3(0,1,0,3,3)];
2451                                  const register double A_02_0 = A_p[INDEX3(0,2,0,3,3)];                                  const double A_02_0 = A_p[INDEX3(0,2,0,3,3)];
2452                                  const register double A_10_0 = A_p[INDEX3(1,0,0,3,3)];                                  const double A_10_0 = A_p[INDEX3(1,0,0,3,3)];
2453                                  const register double A_11_0 = A_p[INDEX3(1,1,0,3,3)];                                  const double A_11_0 = A_p[INDEX3(1,1,0,3,3)];
2454                                  const register double A_12_0 = A_p[INDEX3(1,2,0,3,3)];                                  const double A_12_0 = A_p[INDEX3(1,2,0,3,3)];
2455                                  const register double A_20_0 = A_p[INDEX3(2,0,0,3,3)];                                  const double A_20_0 = A_p[INDEX3(2,0,0,3,3)];
2456                                  const register double A_21_0 = A_p[INDEX3(2,1,0,3,3)];                                  const double A_21_0 = A_p[INDEX3(2,1,0,3,3)];
2457                                  const register double A_22_0 = A_p[INDEX3(2,2,0,3,3)];                                  const double A_22_0 = A_p[INDEX3(2,2,0,3,3)];
2458                                  const register double A_00_1 = A_p[INDEX3(0,0,1,3,3)];                                  const double A_00_1 = A_p[INDEX3(0,0,1,3,3)];
2459                                  const register double A_01_1 = A_p[INDEX3(0,1,1,3,3)];                                  const double A_01_1 = A_p[INDEX3(0,1,1,3,3)];
2460                                  const register double A_02_1 = A_p[INDEX3(0,2,1,3,3)];                                  const double A_02_1 = A_p[INDEX3(0,2,1,3,3)];
2461                                  const register double A_10_1 = A_p[INDEX3(1,0,1,3,3)];                                  const double A_10_1 = A_p[INDEX3(1,0,1,3,3)];
2462                                  const register double A_11_1 = A_p[INDEX3(1,1,1,3,3)];                                  const double A_11_1 = A_p[INDEX3(1,1,1,3,3)];
2463                                  const register double A_12_1 = A_p[INDEX3(1,2,1,3,3)];                                  const double A_12_1 = A_p[INDEX3(1,2,1,3,3)];
2464                                  const register double A_20_1 = A_p[INDEX3(2,0,1,3,3)];                                  const double A_20_1 = A_p[INDEX3(2,0,1,3,3)];
2465                                  const register double A_21_1 = A_p[INDEX3(2,1,1,3,3)];                                  const double A_21_1 = A_p[INDEX3(2,1,1,3,3)];
2466                                  const register double A_22_1 = A_p[INDEX3(2,2,1,3,3)];                                  const double A_22_1 = A_p[INDEX3(2,2,1,3,3)];
2467                                  const register double A_00_2 = A_p[INDEX3(0,0,2,3,3)];                                  const double A_00_2 = A_p[INDEX3(0,0,2,3,3)];
2468                                  const register double A_01_2 = A_p[INDEX3(0,1,2,3,3)];                                  const double A_01_2 = A_p[INDEX3(0,1,2,3,3)];
2469                                  const register double A_02_2 = A_p[INDEX3(0,2,2,3,3)];                                  const double A_02_2 = A_p[INDEX3(0,2,2,3,3)];
2470                                  const register double A_10_2 = A_p[INDEX3(1,0,2,3,3)];                                  const double A_10_2 = A_p[INDEX3(1,0,2,3,3)];
2471                                  const register double A_11_2 = A_p[INDEX3(1,1,2,3,3)];                                  const double A_11_2 = A_p[INDEX3(1,1,2,3,3)];
2472                                  const register double A_12_2 = A_p[INDEX3(1,2,2,3,3)];                                  const double A_12_2 = A_p[INDEX3(1,2,2,3,3)];
2473                                  const register double A_20_2 = A_p[INDEX3(2,0,2,3,3)];                                  const double A_20_2 = A_p[INDEX3(2,0,2,3,3)];
2474                                  const register double A_21_2 = A_p[INDEX3(2,1,2,3,3)];                                  const double A_21_2 = A_p[INDEX3(2,1,2,3,3)];
2475                                  const register double A_22_2 = A_p[INDEX3(2,2,2,3,3)];                                  const double A_22_2 = A_p[INDEX3(2,2,2,3,3)];
2476                                  const register double A_00_3 = A_p[INDEX3(0,0,3,3,3)];                                  const double A_00_3 = A_p[INDEX3(0,0,3,3,3)];
2477                                  const register double A_01_3 = A_p[INDEX3(0,1,3,3,3)];                                  const double A_01_3 = A_p[INDEX3(0,1,3,3,3)];
2478                                  const register double A_02_3 = A_p[INDEX3(0,2,3,3,3)];                                  const double A_02_3 = A_p[INDEX3(0,2,3,3,3)];
2479                                  const register double A_10_3 = A_p[INDEX3(1,0,3,3,3)];                                  const double A_10_3 = A_p[INDEX3(1,0,3,3,3)];
2480                                  const register double A_11_3 = A_p[INDEX3(1,1,3,3,3)];                                  const double A_11_3 = A_p[INDEX3(1,1,3,3,3)];
2481                                  const register double A_12_3 = A_p[INDEX3(1,2,3,3,3)];                                  const double A_12_3 = A_p[INDEX3(1,2,3,3,3)];
2482                                  const register double A_20_3 = A_p[INDEX3(2,0,3,3,3)];                                  const double A_20_3 = A_p[INDEX3(2,0,3,3,3)];
2483                                  const register double A_21_3 = A_p[INDEX3(2,1,3,3,3)];                                  const double A_21_3 = A_p[INDEX3(2,1,3,3,3)];
2484                                  const register double A_22_3 = A_p[INDEX3(2,2,3,3,3)];                                  const double A_22_3 = A_p[INDEX3(2,2,3,3,3)];
2485                                  const register double A_00_4 = A_p[INDEX3(0,0,4,3,3)];                                  const double A_00_4 = A_p[INDEX3(0,0,4,3,3)];
2486                                  const register double A_01_4 = A_p[INDEX3(0,1,4,3,3)];                                  const double A_01_4 = A_p[INDEX3(0,1,4,3,3)];
2487                                  const register double A_02_4 = A_p[INDEX3(0,2,4,3,3)];                                  const double A_02_4 = A_p[INDEX3(0,2,4,3,3)];
2488                                  const register double A_10_4 = A_p[INDEX3(1,0,4,3,3)];                                  const double A_10_4 = A_p[INDEX3(1,0,4,3,3)];
2489                                  const register double A_11_4 = A_p[INDEX3(1,1,4,3,3)];                                  const double A_11_4 = A_p[INDEX3(1,1,4,3,3)];
2490                                  const register double A_12_4 = A_p[INDEX3(1,2,4,3,3)];                                  const double A_12_4 = A_p[INDEX3(1,2,4,3,3)];
2491                                  const register double A_20_4 = A_p[INDEX3(2,0,4,3,3)];                                  const double A_20_4 = A_p[INDEX3(2,0,4,3,3)];
2492                                  const register double A_21_4 = A_p[INDEX3(2,1,4,3,3)];                                  const double A_21_4 = A_p[INDEX3(2,1,4,3,3)];
2493                                  const register double A_22_4 = A_p[INDEX3(2,2,4,3,3)];                                  const double A_22_4 = A_p[INDEX3(2,2,4,3,3)];
2494                                  const register double A_00_5 = A_p[INDEX3(0,0,5,3,3)];                                  const double A_00_5 = A_p[INDEX3(0,0,5,3,3)];
2495                                  const register double A_01_5 = A_p[INDEX3(0,1,5,3,3)];                                  const double A_01_5 = A_p[INDEX3(0,1,5,3,3)];
2496                                  const register double A_02_5 = A_p[INDEX3(0,2,5,3,3)];                                  const double A_02_5 = A_p[INDEX3(0,2,5,3,3)];
2497                                  const register double A_10_5 = A_p[INDEX3(1,0,5,3,3)];                                  const double A_10_5 = A_p[INDEX3(1,0,5,3,3)];
2498                                  const register double A_11_5 = A_p[INDEX3(1,1,5,3,3)];                                  const double A_11_5 = A_p[INDEX3(1,1,5,3,3)];
2499                                  const register double A_12_5 = A_p[INDEX3(1,2,5,3,3)];                                  const double A_12_5 = A_p[INDEX3(1,2,5,3,3)];
2500                                  const register double A_20_5 = A_p[INDEX3(2,0,5,3,3)];                                  const double A_20_5 = A_p[INDEX3(2,0,5,3,3)];
2501                                  const register double A_21_5 = A_p[INDEX3(2,1,5,3,3)];                                  const double A_21_5 = A_p[INDEX3(2,1,5,3,3)];
2502                                  const register double A_22_5 = A_p[INDEX3(2,2,5,3,3)];                                  const double A_22_5 = A_p[INDEX3(2,2,5,3,3)];
2503                                  const register double A_00_6 = A_p[INDEX3(0,0,6,3,3)];                                  const double A_00_6 = A_p[INDEX3(0,0,6,3,3)];
2504                                  const register double A_01_6 = A_p[INDEX3(0,1,6,3,3)];                                  const double A_01_6 = A_p[INDEX3(0,1,6,3,3)];
2505                                  const register double A_02_6 = A_p[INDEX3(0,2,6,3,3)];                                  const double A_02_6 = A_p[INDEX3(0,2,6,3,3)];
2506                                  const register double A_10_6 = A_p[INDEX3(1,0,6,3,3)];                                  const double A_10_6 = A_p[INDEX3(1,0,6,3,3)];
2507                                  const register double A_11_6 = A_p[INDEX3(1,1,6,3,3)];                                  const double A_11_6 = A_p[INDEX3(1,1,6,3,3)];
2508                                  const register double A_12_6 = A_p[INDEX3(1,2,6,3,3)];                                  const double A_12_6 = A_p[INDEX3(1,2,6,3,3)];
2509                                  const register double A_20_6 = A_p[INDEX3(2,0,6,3,3)];                                  const double A_20_6 = A_p[INDEX3(2,0,6,3,3)];
2510                                  const register double A_21_6 = A_p[INDEX3(2,1,6,3,3)];                                  const double A_21_6 = A_p[INDEX3(2,1,6,3,3)];
2511                                  const register double A_22_6 = A_p[INDEX3(2,2,6,3,3)];                                  const double A_22_6 = A_p[INDEX3(2,2,6,3,3)];
2512                                  const register double A_00_7 = A_p[INDEX3(0,0,7,3,3)];                                  const double A_00_7 = A_p[INDEX3(0,0,7,3,3)];
2513                                  const register double A_01_7 = A_p[INDEX3(0,1,7,3,3)];                                  const double A_01_7 = A_p[INDEX3(0,1,7,3,3)];
2514                                  const register double A_02_7 = A_p[INDEX3(0,2,7,3,3)];                                  const double A_02_7 = A_p[INDEX3(0,2,7,3,3)];
2515                                  const register double A_10_7 = A_p[INDEX3(1,0,7,3,3)];                                  const double A_10_7 = A_p[INDEX3(1,0,7,3,3)];
2516                                  const register double A_11_7 = A_p[INDEX3(1,1,7,3,3)];                                  const double A_11_7 = A_p[INDEX3(1,1,7,3,3)];
2517                                  const register double A_12_7 = A_p[INDEX3(1,2,7,3,3)];                                  const double A_12_7 = A_p[INDEX3(1,2,7,3,3)];
2518                                  const register double A_20_7 = A_p[INDEX3(2,0,7,3,3)];                                  const double A_20_7 = A_p[INDEX3(2,0,7,3,3)];
2519                                  const register double A_21_7 = A_p[INDEX3(2,1,7,3,3)];                                  const double A_21_7 = A_p[INDEX3(2,1,7,3,3)];
2520                                  const register double A_22_7 = A_p[INDEX3(2,2,7,3,3)];                                  const double A_22_7 = A_p[INDEX3(2,2,7,3,3)];
2521                                  const register double tmp160_0 = A_12_0 + A_12_6 + A_21_0 + A_21_6;                                  const double tmp160_0 = A_12_0 + A_12_6 + A_21_0 + A_21_6;
2522                                  const register double tmp8_0 = A_21_0 + A_21_6;                                  const double tmp8_0 = A_21_0 + A_21_6;
2523                                  const register double tmp135_0 = A_10_1 + A_10_2 + A_10_5 + A_10_6;                                  const double tmp135_0 = A_10_1 + A_10_2 + A_10_5 + A_10_6;
2524                                  const register double tmp67_0 = A_02_2 + A_02_7;                                  const double tmp67_0 = A_02_2 + A_02_7;
2525                                  const register double tmp211_0 = A_12_6 + A_21_6;                                  const double tmp211_0 = A_12_6 + A_21_6;
2526                                  const register double tmp180_0 = A_10_2 + A_10_6;                                  const double tmp180_0 = A_10_2 + A_10_6;
2527                                  const register double tmp37_0 = A_00_0 + A_00_1 + A_00_2 + A_00_3;                                  const double tmp37_0 = A_00_0 + A_00_1 + A_00_2 + A_00_3;
2528                                  const register double tmp92_0 = A_11_0 + A_11_1 + A_11_2 + A_11_3 + A_11_4 + A_11_5 + A_11_6 + A_11_7;                                  const double tmp92_0 = A_11_0 + A_11_1 + A_11_2 + A_11_3 + A_11_4 + A_11_5 + A_11_6 + A_11_7;
2529                                  const register double tmp195_0 = A_02_2 + A_20_2;                                  const double tmp195_0 = A_02_2 + A_20_2;
2530                                  const register double tmp70_0 = A_01_0 + A_01_7;                                  const double tmp70_0 = A_01_0 + A_01_7;
2531                                  const register double tmp139_0 = A_02_3 + A_02_4 + A_20_1 + A_20_6;                                  const double tmp139_0 = A_02_3 + A_02_4 + A_20_1 + A_20_6;
2532                                  const register double tmp200_0 = A_12_3 + A_12_5 + A_21_3 + A_21_5;                                  const double tmp200_0 = A_12_3 + A_12_5 + A_21_3 + A_21_5;
2533                                  const register double tmp60_0 = A_22_0 + A_22_2 + A_22_4 + A_22_6;                                  const double tmp60_0 = A_22_0 + A_22_2 + A_22_4 + A_22_6;
2534                                  const register double tmp192_0 = A_01_5 + A_10_5;                                  const double tmp192_0 = A_01_5 + A_10_5;
2535                                  const register double tmp46_0 = A_21_0 + A_21_7;                                  const double tmp46_0 = A_21_0 + A_21_7;
2536                                  const register double tmp48_0 = A_10_0 + A_10_7;                                  const double tmp48_0 = A_10_0 + A_10_7;
2537                                  const register double tmp166_0 = A_11_5 + A_11_7;                                  const double tmp166_0 = A_11_5 + A_11_7;
2538                                  const register double tmp221_0 = A_02_1 + A_02_6 + A_20_3 + A_20_4;                                  const double tmp221_0 = A_02_1 + A_02_6 + A_20_3 + A_20_4;
2539                                  const register double tmp50_0 = A_02_4 + A_02_6 + A_20_4 + A_20_6;                                  const double tmp50_0 = A_02_4 + A_02_6 + A_20_4 + A_20_6;
2540                                  const register double tmp217_0 = A_02_3 + A_02_4 + A_20_3 + A_20_4;                                  const double tmp217_0 = A_02_3 + A_02_4 + A_20_3 + A_20_4;
2541                                  const register double tmp216_0 = A_01_2 + A_01_5 + A_10_2 + A_10_5;                                  const double tmp216_0 = A_01_2 + A_01_5 + A_10_2 + A_10_5;
2542                                  const register double tmp104_0 = A_22_2 + A_22_6;                                  const double tmp104_0 = A_22_2 + A_22_6;
2543                                  const register double tmp72_0 = A_20_3 + A_20_6;                                  const double tmp72_0 = A_20_3 + A_20_6;
2544                                  const register double tmp79_0 = A_10_4 + A_10_7;                                  const double tmp79_0 = A_10_4 + A_10_7;
2545                                  const register double tmp86_0 = A_01_2 + A_01_6 + A_10_1 + A_10_5;                                  const double tmp86_0 = A_01_2 + A_01_6 + A_10_1 + A_10_5;
2546                                  const register double tmp214_0 = A_12_0 + A_12_7 + A_21_0 + A_21_7;                                  const double tmp214_0 = A_12_0 + A_12_7 + A_21_0 + A_21_7;
2547                                  const register double tmp32_0 = A_02_0 + A_02_2;                                  const double tmp32_0 = A_02_0 + A_02_2;
2548                                  const register double tmp112_0 = A_01_0 + A_01_4 + A_10_3 + A_10_7;                                  const double tmp112_0 = A_01_0 + A_01_4 + A_10_3 + A_10_7;
2549                                  const register double tmp197_0 = A_12_0 + A_21_0;                                  const double tmp197_0 = A_12_0 + A_21_0;
2550                                  const register double tmp106_0 = A_22_1 + A_22_5;                                  const double tmp106_0 = A_22_1 + A_22_5;
2551                                  const register double tmp2_0 = A_00_0 + A_00_1 + A_00_4 + A_00_5;                                  const double tmp2_0 = A_00_0 + A_00_1 + A_00_4 + A_00_5;
2552                                  const register double tmp115_0 = A_02_5 + A_02_7 + A_20_0 + A_20_2;                                  const double tmp115_0 = A_02_5 + A_02_7 + A_20_0 + A_20_2;
2553                                  const register double tmp175_0 = A_01_3 + A_01_7;                                  const double tmp175_0 = A_01_3 + A_01_7;
2554                                  const register double tmp126_0 = A_01_2 + A_01_5 + A_10_1 + A_10_6;                                  const double tmp126_0 = A_01_2 + A_01_5 + A_10_1 + A_10_6;
2555                                  const register double tmp90_0 = A_00_0 + A_00_1 + A_00_2 + A_00_3 + A_00_4 + A_00_5 + A_00_6 + A_00_7;                                  const double tmp90_0 = A_00_0 + A_00_1 + A_00_2 + A_00_3 + A_00_4 + A_00_5 + A_00_6 + A_00_7;
2556                                  const register double tmp47_0 = A_12_0 + A_12_6;                                  const double tmp47_0 = A_12_0 + A_12_6;
2557                                  const register double tmp205_0 = A_02_7 + A_20_7;                                  const double tmp205_0 = A_02_7 + A_20_7;
2558                                  const register double tmp148_0 = A_01_3 + A_01_4;                                  const double tmp148_0 = A_01_3 + A_01_4;
2559                                  const register double tmp113_0 = A_01_3 + A_01_7 + A_10_0 + A_10_4;                                  const double tmp113_0 = A_01_3 + A_01_7 + A_10_0 + A_10_4;
2560                                  const register double tmp43_0 = A_20_4 + A_20_6;                                  const double tmp43_0 = A_20_4 + A_20_6;
2561                                  const register double tmp161_0 = A_02_1 + A_02_6 + A_20_1 + A_20_6;                                  const double tmp161_0 = A_02_1 + A_02_6 + A_20_1 + A_20_6;
2562                                  const register double tmp69_0 = A_12_0 + A_12_1 + A_12_6 + A_12_7 + A_21_0 + A_21_1 + A_21_6 + A_21_7;                                  const double tmp69_0 = A_12_0 + A_12_1 + A_12_6 + A_12_7 + A_21_0 + A_21_1 + A_21_6 + A_21_7;
2563                                  const register double tmp176_0 = A_01_1 + A_01_2 + A_01_5 + A_01_6;                                  const double tmp176_0 = A_01_1 + A_01_2 + A_01_5 + A_01_6;
2564                                  const register double tmp105_0 = A_01_2 + A_01_6 + A_10_2 + A_10_6;                                  const double tmp105_0 = A_01_2 + A_01_6 + A_10_2 + A_10_6;
2565                                  const register double tmp22_0 = A_01_5 + A_10_6;                                  const double tmp22_0 = A_01_5 + A_10_6;
2566                                  const register double tmp91_0 = A_02_4 + A_02_6 + A_20_1 + A_20_3;                                  const double tmp91_0 = A_02_4 + A_02_6 + A_20_1 + A_20_3;
2567                                  const register double tmp206_0 = A_12_7 + A_21_7;                                  const double tmp206_0 = A_12_7 + A_21_7;
2568                                  const register double tmp188_0 = A_02_5 + A_20_5;                                  const double tmp188_0 = A_02_5 + A_20_5;
2569                                  const register double tmp117_0 = A_21_1 + A_21_6;                                  const double tmp117_0 = A_21_1 + A_21_6;
2570                                  const register double tmp165_0 = A_01_1 + A_01_6;                                  const double tmp165_0 = A_01_1 + A_01_6;
2571                                  const register double tmp66_0 = A_00_4 + A_00_5;                                  const double tmp66_0 = A_00_4 + A_00_5;
2572                                  const register double tmp57_0 = A_02_0 + A_02_2 + A_02_5 + A_02_7 + A_20_0 + A_20_2 + A_20_5 + A_20_7;                                  const double tmp57_0 = A_02_0 + A_02_2 + A_02_5 + A_02_7 + A_20_0 + A_20_2 + A_20_5 + A_20_7;
2573                                  const register double tmp31_0 = A_21_4 + A_21_5;                                  const double tmp31_0 = A_21_4 + A_21_5;
2574                                  const register double tmp3_0 = A_11_0 + A_11_2 + A_11_4 + A_11_6;                                  const double tmp3_0 = A_11_0 + A_11_2 + A_11_4 + A_11_6;
2575                                  const register double tmp183_0 = A_12_0 + A_12_7;                                  const double tmp183_0 = A_12_0 + A_12_7;
2576                                  const register double tmp61_0 = A_02_1 + A_02_3 + A_20_1 + A_20_3;                                  const double tmp61_0 = A_02_1 + A_02_3 + A_20_1 + A_20_3;
2577                                  const register double tmp54_0 = A_10_5 + A_10_6;                                  const double tmp54_0 = A_10_5 + A_10_6;
2578                                  const register double tmp18_0 = A_02_3 + A_02_6;                                  const double tmp18_0 = A_02_3 + A_02_6;
2579                                  const register double tmp119_0 = A_12_2 + A_12_3 + A_12_4 + A_12_5 + A_21_2 + A_21_3 + A_21_4 + A_21_5;                                  const double tmp119_0 = A_12_2 + A_12_3 + A_12_4 + A_12_5 + A_21_2 + A_21_3 + A_21_4 + A_21_5;
2580                                  const register double tmp29_0 = A_21_2 + A_21_3;                                  const double tmp29_0 = A_21_2 + A_21_3;
2581                                  const register double tmp17_0 = A_01_3 + A_01_7 + A_10_3 + A_10_7;                                  const double tmp17_0 = A_01_3 + A_01_7 + A_10_3 + A_10_7;
2582                                  const register double tmp212_0 = A_02_6 + A_20_6;                                  const double tmp212_0 = A_02_6 + A_20_6;
2583                                  const register double tmp220_0 = A_02_3 + A_20_6;                                  const double tmp220_0 = A_02_3 + A_20_6;
2584                                  const register double tmp78_0 = A_20_0 + A_20_7;                                  const double tmp78_0 = A_20_0 + A_20_7;
2585                                  const register double tmp215_0 = A_01_6 + A_10_6;                                  const double tmp215_0 = A_01_6 + A_10_6;
2586                                  const register double tmp203_0 = A_01_7 + A_10_7;                                  const double tmp203_0 = A_01_7 + A_10_7;
2587                                  const register double tmp87_0 = A_12_2 + A_12_3 + A_21_4 + A_21_5;                                  const double tmp87_0 = A_12_2 + A_12_3 + A_21_4 + A_21_5;
2588                                  const register double tmp114_0 = A_02_0 + A_02_2 + A_20_5 + A_20_7;                                  const double tmp114_0 = A_02_0 + A_02_2 + A_20_5 + A_20_7;
2589                                  const register double tmp0_0 = A_01_0 + A_01_4 + A_10_0 + A_10_4;                                  const double tmp0_0 = A_01_0 + A_01_4 + A_10_0 + A_10_4;
2590                                  const register double tmp202_0 = A_01_3 + A_01_4 + A_10_3 + A_10_4;                                  const double tmp202_0 = A_01_3 + A_01_4 + A_10_3 + A_10_4;
2591                                  const register double tmp4_0 = A_20_0 + A_20_5;                                  const double tmp4_0 = A_20_0 + A_20_5;
2592                                  const register double tmp65_0 = A_00_2 + A_00_3;                                  const double tmp65_0 = A_00_2 + A_00_3;
2593                                  const register double tmp24_0 = A_20_1 + A_20_3;                                  const double tmp24_0 = A_20_1 + A_20_3;
2594                                  const register double tmp64_0 = A_10_0 + A_10_3;                                  const double tmp64_0 = A_10_0 + A_10_3;
2595                                  const register double tmp170_0 = A_02_0 + A_02_2 + A_20_0 + A_20_2;                                  const double tmp170_0 = A_02_0 + A_02_2 + A_20_0 + A_20_2;
2596                                  const register double tmp11_0 = A_20_1 + A_20_6;                                  const double tmp11_0 = A_20_1 + A_20_6;
2597                                  const register double tmp82_0 = A_12_4 + A_12_5 + A_21_4 + A_21_5;                                  const double tmp82_0 = A_12_4 + A_12_5 + A_21_4 + A_21_5;
2598                                  const register double tmp99_0 = A_01_4 + A_10_7;                                  const double tmp99_0 = A_01_4 + A_10_7;
2599                                  const register double tmp49_0 = A_12_1 + A_12_7;                                  const double tmp49_0 = A_12_1 + A_12_7;
2600                                  const register double tmp130_0 = A_12_0 + A_12_1 + A_12_6 + A_12_7;                                  const double tmp130_0 = A_12_0 + A_12_1 + A_12_6 + A_12_7;
2601                                  const register double tmp144_0 = A_01_0 + A_10_3;                                  const double tmp144_0 = A_01_0 + A_10_3;
2602                                  const register double tmp109_0 = A_22_0 + A_22_3 + A_22_4 + A_22_7;                                  const double tmp109_0 = A_22_0 + A_22_3 + A_22_4 + A_22_7;
2603                                  const register double tmp185_0 = A_02_0 + A_02_7 + A_20_2 + A_20_5;                                  const double tmp185_0 = A_02_0 + A_02_7 + A_20_2 + A_20_5;
2604                                  const register double tmp157_0 = A_01_4 + A_10_4;                                  const double tmp157_0 = A_01_4 + A_10_4;
2605                                  const register double tmp51_0 = A_22_1 + A_22_3 + A_22_5 + A_22_7;                                  const double tmp51_0 = A_22_1 + A_22_3 + A_22_5 + A_22_7;
2606                                  const register double tmp146_0 = A_00_6 + A_00_7;                                  const double tmp146_0 = A_00_6 + A_00_7;
2607                                  const register double tmp147_0 = A_12_0 + A_12_1 + A_21_0 + A_21_1;                                  const double tmp147_0 = A_12_0 + A_12_1 + A_21_0 + A_21_1;
2608                                  const register double tmp150_0 = A_00_2 + A_00_3 + A_00_4 + A_00_5;                                  const double tmp150_0 = A_00_2 + A_00_3 + A_00_4 + A_00_5;
2609                                  const register double tmp62_0 = A_21_3 + A_21_5;                                  const double tmp62_0 = A_21_3 + A_21_5;
2610                                  const register double tmp223_0 = A_12_2 + A_21_4;                                  const double tmp223_0 = A_12_2 + A_21_4;
2611                                  const register double tmp16_0 = A_02_2 + A_02_5;                                  const double tmp16_0 = A_02_2 + A_02_5;
2612                                  const register double tmp168_0 = A_11_1 + A_11_3 + A_11_4 + A_11_6;                                  const double tmp168_0 = A_11_1 + A_11_3 + A_11_4 + A_11_6;
2613                                  const register double tmp88_0 = A_12_4 + A_12_5 + A_21_2 + A_21_3;                                  const double tmp88_0 = A_12_4 + A_12_5 + A_21_2 + A_21_3;
2614                                  const register double tmp142_0 = A_01_7 + A_10_4;                                  const double tmp142_0 = A_01_7 + A_10_4;
2615                                  const register double tmp34_0 = A_20_0 + A_20_2 + A_20_5 + A_20_7;                                  const double tmp34_0 = A_20_0 + A_20_2 + A_20_5 + A_20_7;
2616                                  const register double tmp71_0 = A_00_0 + A_00_1 + A_00_6 + A_00_7;                                  const double tmp71_0 = A_00_0 + A_00_1 + A_00_6 + A_00_7;
2617                                  const register double tmp213_0 = A_02_1 + A_20_1;                                  const double tmp213_0 = A_02_1 + A_20_1;
2618                                  const register double tmp227_0 = A_12_2 + A_12_5 + A_21_3 + A_21_4;                                  const double tmp227_0 = A_12_2 + A_12_5 + A_21_3 + A_21_4;
2619                                  const register double tmp228_0 = A_12_1 + A_21_7;                                  const double tmp228_0 = A_12_1 + A_21_7;
2620                                  const register double tmp140_0 = A_01_2 + A_01_6;                                  const double tmp140_0 = A_01_2 + A_01_6;
2621                                  const register double tmp74_0 = A_22_0 + A_22_1 + A_22_4 + A_22_5;                                  const double tmp74_0 = A_22_0 + A_22_1 + A_22_4 + A_22_5;
2622                                  const register double tmp167_0 = A_11_0 + A_11_2;                                  const double tmp167_0 = A_11_0 + A_11_2;
2623                                  const register double tmp143_0 = A_01_3 + A_01_4 + A_10_0 + A_10_7;                                  const double tmp143_0 = A_01_3 + A_01_4 + A_10_0 + A_10_7;
2624                                  const register double tmp83_0 = A_02_0 + A_02_5;                                  const double tmp83_0 = A_02_0 + A_02_5;
2625                                  const register double tmp14_0 = A_22_1 + A_22_2 + A_22_5 + A_22_6;                                  const double tmp14_0 = A_22_1 + A_22_2 + A_22_5 + A_22_6;
2626                                  const register double tmp5_0 = A_12_1 + A_12_6;                                  const double tmp5_0 = A_12_1 + A_12_6;
2627                                  const register double tmp94_0 = A_02_1 + A_02_3;                                  const double tmp94_0 = A_02_1 + A_02_3;
2628                                  const register double tmp193_0 = A_01_1 + A_01_6 + A_10_1 + A_10_6;                                  const double tmp193_0 = A_01_1 + A_01_6 + A_10_1 + A_10_6;
2629                                  const register double tmp97_0 = A_02_0 + A_02_2 + A_02_5 + A_02_7;                                  const double tmp97_0 = A_02_0 + A_02_2 + A_02_5 + A_02_7;
2630                                  const register double tmp131_0 = A_01_1 + A_01_5;                                  const double tmp131_0 = A_01_1 + A_01_5;
2631                                  const register double tmp124_0 = A_01_6 + A_10_5;                                  const double tmp124_0 = A_01_6 + A_10_5;
2632                                  const register double tmp149_0 = A_12_6 + A_12_7 + A_21_6 + A_21_7;                                  const double tmp149_0 = A_12_6 + A_12_7 + A_21_6 + A_21_7;
2633                                  const register double tmp187_0 = A_01_2 + A_10_2;                                  const double tmp187_0 = A_01_2 + A_10_2;
2634                                  const register double tmp93_0 = A_01_1 + A_01_2 + A_10_1 + A_10_2;                                  const double tmp93_0 = A_01_1 + A_01_2 + A_10_1 + A_10_2;
2635                                  const register double tmp25_0 = A_01_4 + A_01_7 + A_10_4 + A_10_7;                                  const double tmp25_0 = A_01_4 + A_01_7 + A_10_4 + A_10_7;
2636                                  const register double tmp156_0 = A_12_2 + A_12_5 + A_21_2 + A_21_5;                                  const double tmp156_0 = A_12_2 + A_12_5 + A_21_2 + A_21_5;
2637                                  const register double tmp20_0 = A_21_2 + A_21_5;                                  const double tmp20_0 = A_21_2 + A_21_5;
2638                                  const register double tmp55_0 = A_21_2 + A_21_4;                                  const double tmp55_0 = A_21_2 + A_21_4;
2639                                  const register double tmp208_0 = A_12_1 + A_12_6 + A_21_0 + A_21_7;                                  const double tmp208_0 = A_12_1 + A_12_6 + A_21_0 + A_21_7;
2640                                  const register double tmp125_0 = A_12_4 + A_12_5;                                  const double tmp125_0 = A_12_4 + A_12_5;
2641                                  const register double tmp158_0 = A_01_0 + A_01_7 + A_10_0 + A_10_7;                                  const double tmp158_0 = A_01_0 + A_01_7 + A_10_0 + A_10_7;
2642                                  const register double tmp108_0 = A_01_1 + A_01_5 + A_10_1 + A_10_5;                                  const double tmp108_0 = A_01_1 + A_01_5 + A_10_1 + A_10_5;
2643                                  const register double tmp199_0 = A_12_2 + A_12_4 + A_21_2 + A_21_4;                                  const double tmp199_0 = A_12_2 + A_12_4 + A_21_2 + A_21_4;
2644                                  const register double tmp10_0 = A_02_1 + A_02_4;                                  const double tmp10_0 = A_02_1 + A_02_4;
2645                                  const register double tmp182_0 = A_02_3 + A_02_6 + A_20_3 + A_20_6;                                  const double tmp182_0 = A_02_3 + A_02_6 + A_20_3 + A_20_6;
2646                                  const register double tmp132_0 = A_02_1 + A_20_4;                                  const double tmp132_0 = A_02_1 + A_20_4;
2647                                  const register double tmp191_0 = A_12_3 + A_12_4 + A_21_3 + A_21_4;                                  const double tmp191_0 = A_12_3 + A_12_4 + A_21_3 + A_21_4;
2648                                  const register double tmp35_0 = A_11_0 + A_11_1 + A_11_2 + A_11_3;                                  const double tmp35_0 = A_11_0 + A_11_1 + A_11_2 + A_11_3;
2649                                  const register double tmp164_0 = A_10_3 + A_10_4;                                  const double tmp164_0 = A_10_3 + A_10_4;
2650                                  const register double tmp190_0 = A_12_5 + A_21_5;                                  const double tmp190_0 = A_12_5 + A_21_5;
2651                                  const register double tmp73_0 = A_02_1 + A_02_6;                                  const double tmp73_0 = A_02_1 + A_02_6;
2652                                  const register double tmp98_0 = A_01_0 + A_01_7 + A_10_3 + A_10_4;                                  const double tmp98_0 = A_01_0 + A_01_7 + A_10_3 + A_10_4;
2653                                  const register double tmp225_0 = A_12_4 + A_21_2;                                  const double tmp225_0 = A_12_4 + A_21_2;
2654                                  const register double tmp103_0 = A_02_4 + A_02_6;                                  const double tmp103_0 = A_02_4 + A_02_6;
2655                                  const register double tmp194_0 = A_02_0 + A_02_7 + A_20_0 + A_20_7;                                  const double tmp194_0 = A_02_0 + A_02_7 + A_20_0 + A_20_7;
2656                                  const register double tmp207_0 = A_12_0 + A_21_6;                                  const double tmp207_0 = A_12_0 + A_21_6;
2657                                  const register double tmp102_0 = A_20_5 + A_20_7;                                  const double tmp102_0 = A_20_5 + A_20_7;
2658                                  const register double tmp1_0 = A_22_3 + A_22_7;                                  const double tmp1_0 = A_22_3 + A_22_7;
2659                                  const register double tmp172_0 = A_10_1 + A_10_5;                                  const double tmp172_0 = A_10_1 + A_10_5;
2660                                  const register double tmp222_0 = A_12_5 + A_21_3;                                  const double tmp222_0 = A_12_5 + A_21_3;
2661                                  const register double tmp201_0 = A_02_2 + A_02_5 + A_20_2 + A_20_5;                                  const double tmp201_0 = A_02_2 + A_02_5 + A_20_2 + A_20_5;
2662                                  const register double tmp155_0 = A_12_4 + A_21_4;                                  const double tmp155_0 = A_12_4 + A_21_4;
2663                                  const register double tmp174_0 = A_02_1 + A_02_4 + A_20_1 + A_20_4;                                  const double tmp174_0 = A_02_1 + A_02_4 + A_20_1 + A_20_4;
2664                                  const register double tmp59_0 = A_01_0 + A_01_3;                                  const double tmp59_0 = A_01_0 + A_01_3;
2665                                  const register double tmp21_0 = A_20_2 + A_20_7;                                  const double tmp21_0 = A_20_2 + A_20_7;
2666                                  const register double tmp141_0 = A_02_2 + A_02_7 + A_20_2 + A_20_7;                                  const double tmp141_0 = A_02_2 + A_02_7 + A_20_2 + A_20_7;
2667                                  const register double tmp210_0 = A_01_1 + A_10_1;                                  const double tmp210_0 = A_01_1 + A_10_1;
2668                                  const register double tmp145_0 = A_00_0 + A_00_1;                                  const double tmp145_0 = A_00_0 + A_00_1;
2669                                  const register double tmp121_0 = A_12_0 + A_12_1 + A_21_6 + A_21_7;                                  const double tmp121_0 = A_12_0 + A_12_1 + A_21_6 + A_21_7;
2670                                  const register double tmp224_0 = A_12_3 + A_12_4 + A_21_2 + A_21_5;                                  const double tmp224_0 = A_12_3 + A_12_4 + A_21_2 + A_21_5;
2671                                  const register double tmp186_0 = A_02_2 + A_20_7;                                  const double tmp186_0 = A_02_2 + A_20_7;
2672                                  const register double tmp53_0 = A_11_4 + A_11_6;                                  const double tmp53_0 = A_11_4 + A_11_6;
2673                                  const register double tmp184_0 = A_02_5 + A_20_0;                                  const double tmp184_0 = A_02_5 + A_20_0;
2674                                  const register double tmp38_0 = A_12_0 + A_12_1;                                  const double tmp38_0 = A_12_0 + A_12_1;
2675                                  const register double tmp12_0 = A_01_1 + A_01_2 + A_01_5 + A_01_6 + A_10_1 + A_10_2 + A_10_5 + A_10_6;                                  const double tmp12_0 = A_01_1 + A_01_2 + A_01_5 + A_01_6 + A_10_1 + A_10_2 + A_10_5 + A_10_6;
2676                                  const register double tmp230_0 = A_12_6 + A_21_0;                                  const double tmp230_0 = A_12_6 + A_21_0;
2677                                  const register double tmp23_0 = A_11_4 + A_11_5 + A_11_6 + A_11_7;                                  const double tmp23_0 = A_11_4 + A_11_5 + A_11_6 + A_11_7;
2678                                  const register double tmp81_0 = A_20_1 + A_20_4;                                  const double tmp81_0 = A_20_1 + A_20_4;
2679                                  const register double tmp134_0 = A_10_3 + A_10_7;                                  const double tmp134_0 = A_10_3 + A_10_7;
2680                                  const register double tmp129_0 = A_21_0 + A_21_1;                                  const double tmp129_0 = A_21_0 + A_21_1;
2681                                  const register double tmp137_0 = A_01_0 + A_01_3 + A_01_4 + A_01_7;                                  const double tmp137_0 = A_01_0 + A_01_3 + A_01_4 + A_01_7;
2682                                  const register double tmp198_0 = A_01_0 + A_10_0;                                  const double tmp198_0 = A_01_0 + A_10_0;
2683                                  const register double tmp9_0 = A_21_1 + A_21_7;                                  const double tmp9_0 = A_21_1 + A_21_7;
2684                                  const register double tmp179_0 = A_01_0 + A_01_4;                                  const double tmp179_0 = A_01_0 + A_01_4;
2685                                  const register double tmp100_0 = A_20_1 + A_20_3 + A_20_4 + A_20_6;                                  const double tmp100_0 = A_20_1 + A_20_3 + A_20_4 + A_20_6;
2686                                  const register double tmp173_0 = A_02_0 + A_20_5;                                  const double tmp173_0 = A_02_0 + A_20_5;
2687                                  const register double tmp42_0 = A_21_0 + A_21_1 + A_21_6 + A_21_7;                                  const double tmp42_0 = A_21_0 + A_21_1 + A_21_6 + A_21_7;
2688                                  const register double tmp226_0 = A_12_3 + A_21_5;                                  const double tmp226_0 = A_12_3 + A_21_5;
2689                                  const register double tmp6_0 = A_22_0 + A_22_4;                                  const double tmp6_0 = A_22_0 + A_22_4;
2690                                  const register double tmp218_0 = A_12_1 + A_21_1;                                  const double tmp218_0 = A_12_1 + A_21_1;
2691                                  const register double tmp28_0 = A_01_2 + A_10_1;                                  const double tmp28_0 = A_01_2 + A_10_1;
2692                                  const register double tmp133_0 = A_02_6 + A_20_3;                                  const double tmp133_0 = A_02_6 + A_20_3;
2693                                  const register double tmp13_0 = A_00_2 + A_00_3 + A_00_6 + A_00_7;                                  const double tmp13_0 = A_00_2 + A_00_3 + A_00_6 + A_00_7;
2694                                  const register double tmp27_0 = A_12_2 + A_12_3 + A_12_4 + A_12_5;                                  const double tmp27_0 = A_12_2 + A_12_3 + A_12_4 + A_12_5;
2695                                  const register double tmp75_0 = A_10_1 + A_10_6;                                  const double tmp75_0 = A_10_1 + A_10_6;
2696                                  const register double tmp36_0 = A_01_0 + A_01_3 + A_10_0 + A_10_3;                                  const double tmp36_0 = A_01_0 + A_01_3 + A_10_0 + A_10_3;
2697                                  const register double tmp138_0 = A_10_0 + A_10_4;                                  const double tmp138_0 = A_10_0 + A_10_4;
2698                                  const register double tmp189_0 = A_12_2 + A_21_2;                                  const double tmp189_0 = A_12_2 + A_21_2;
2699                                  const register double tmp181_0 = A_02_7 + A_20_2;                                  const double tmp181_0 = A_02_7 + A_20_2;
2700                                  const register double tmp85_0 = A_02_1 + A_02_3 + A_20_4 + A_20_6;                                  const double tmp85_0 = A_02_1 + A_02_3 + A_20_4 + A_20_6;
2701                                  const register double tmp122_0 = A_01_1 + A_10_2;                                  const double tmp122_0 = A_01_1 + A_10_2;
2702                                  const register double tmp95_0 = A_01_3 + A_10_0;                                  const double tmp95_0 = A_01_3 + A_10_0;
2703                                  const register double tmp120_0 = A_12_6 + A_12_7 + A_21_0 + A_21_1;                                  const double tmp120_0 = A_12_6 + A_12_7 + A_21_0 + A_21_1;
2704                                  const register double tmp196_0 = A_02_0 + A_20_0;                                  const double tmp196_0 = A_02_0 + A_20_0;
2705                                  const register double tmp171_0 = A_02_3 + A_02_4;                                  const double tmp171_0 = A_02_3 + A_02_4;
2706                                  const register double tmp204_0 = A_12_1 + A_12_6 + A_21_1 + A_21_6;                                  const double tmp204_0 = A_12_1 + A_12_6 + A_21_1 + A_21_6;
2707                                  const register double tmp45_0 = A_10_1 + A_10_2;                                  const double tmp45_0 = A_10_1 + A_10_2;
2708                                  const register double tmp101_0 = A_01_5 + A_01_6 + A_10_5 + A_10_6;                                  const double tmp101_0 = A_01_5 + A_01_6 + A_10_5 + A_10_6;
2709                                  const register double tmp58_0 = A_11_0 + A_11_2 + A_11_5 + A_11_7;                                  const double tmp58_0 = A_11_0 + A_11_2 + A_11_5 + A_11_7;
2710                                  const register double tmp107_0 = A_20_3 + A_20_4;                                  const double tmp107_0 = A_20_3 + A_20_4;
2711                                  const register double tmp30_0 = A_01_1 + A_01_6 + A_10_2 + A_10_5;                                  const double tmp30_0 = A_01_1 + A_01_6 + A_10_2 + A_10_5;
2712                                  const register double tmp63_0 = A_12_2 + A_12_5;                                  const double tmp63_0 = A_12_2 + A_12_5;
2713                                  const register double tmp127_0 = A_12_2 + A_12_3;                                  const double tmp127_0 = A_12_2 + A_12_3;
2714                                  const register double tmp177_0 = A_02_2 + A_02_5 + A_20_0 + A_20_7;                                  const double tmp177_0 = A_02_2 + A_02_5 + A_20_0 + A_20_7;
2715                                  const register double tmp178_0 = A_10_0 + A_10_3 + A_10_4 + A_10_7;                                  const double tmp178_0 = A_10_0 + A_10_3 + A_10_4 + A_10_7;
2716                                  const register double tmp76_0 = A_01_1 + A_01_2;                                  const double tmp76_0 = A_01_1 + A_01_2;
2717                                  const register double tmp80_0 = A_22_2 + A_22_3 + A_22_6 + A_22_7;                                  const double tmp80_0 = A_22_2 + A_22_3 + A_22_6 + A_22_7;
2718                                  const register double tmp41_0 = A_12_6 + A_12_7;                                  const double tmp41_0 = A_12_6 + A_12_7;
2719                                  const register double tmp89_0 = A_01_0 + A_01_3 + A_01_4 + A_01_7 + A_10_0 + A_10_3 + A_10_4 + A_10_7;                                  const double tmp89_0 = A_01_0 + A_01_3 + A_01_4 + A_01_7 + A_10_0 + A_10_3 + A_10_4 + A_10_7;
2720                                  const register double tmp116_0 = A_02_1 + A_02_3 + A_02_4 + A_02_6 + A_20_1 + A_20_3 + A_20_4 + A_20_6;                                  const double tmp116_0 = A_02_1 + A_02_3 + A_02_4 + A_02_6 + A_20_1 + A_20_3 + A_20_4 + A_20_6;
2721                                  const register double tmp33_0 = A_22_0 + A_22_1 + A_22_2 + A_22_3 + A_22_4 + A_22_5 + A_22_6 + A_22_7;                                  const double tmp33_0 = A_22_0 + A_22_1 + A_22_2 + A_22_3 + A_22_4 + A_22_5 + A_22_6 + A_22_7;
2722                                  const register double tmp169_0 = A_21_3 + A_21_4;                                  const double tmp169_0 = A_21_3 + A_21_4;
2723                                  const register double tmp96_0 = A_20_0 + A_20_2;                                  const double tmp96_0 = A_20_0 + A_20_2;
2724                                  const register double tmp111_0 = A_12_3 + A_12_4;                                  const double tmp111_0 = A_12_3 + A_12_4;
2725                                  const register double tmp118_0 = A_20_2 + A_20_5;                                  const double tmp118_0 = A_20_2 + A_20_5;
2726                                  const register double tmp19_0 = A_12_3 + A_12_5;                                  const double tmp19_0 = A_12_3 + A_12_5;
2727                                  const register double tmp68_0 = A_01_5 + A_01_6;                                  const double tmp68_0 = A_01_5 + A_01_6;
2728                                  const register double tmp7_0 = A_11_1 + A_11_3 + A_11_5 + A_11_7;                                  const double tmp7_0 = A_11_1 + A_11_3 + A_11_5 + A_11_7;
2729                                  const register double tmp154_0 = A_12_3 + A_21_3;                                  const double tmp154_0 = A_12_3 + A_21_3;
2730                                  const register double tmp152_0 = A_02_4 + A_20_4;                                  const double tmp152_0 = A_02_4 + A_20_4;
2731                                  const register double tmp153_0 = A_02_3 + A_20_3;                                  const double tmp153_0 = A_02_3 + A_20_3;
2732                                  const register double tmp163_0 = A_02_5 + A_02_7 + A_20_5 + A_20_7;                                  const double tmp163_0 = A_02_5 + A_02_7 + A_20_5 + A_20_7;
2733                                  const register double tmp44_0 = A_01_4 + A_01_7;                                  const double tmp44_0 = A_01_4 + A_01_7;
2734                                  const register double tmp39_0 = A_02_1 + A_02_3 + A_02_4 + A_02_6;                                  const double tmp39_0 = A_02_1 + A_02_3 + A_02_4 + A_02_6;
2735                                  const register double tmp123_0 = A_21_2 + A_21_3 + A_21_4 + A_21_5;                                  const double tmp123_0 = A_21_2 + A_21_3 + A_21_4 + A_21_5;
2736                                  const register double tmp40_0 = A_02_5 + A_02_7;                                  const double tmp40_0 = A_02_5 + A_02_7;
2737                                  const register double tmp110_0 = A_02_0 + A_02_7;                                  const double tmp110_0 = A_02_0 + A_02_7;
2738                                  const register double tmp77_0 = A_12_2 + A_12_3 + A_21_2 + A_21_3;                                  const double tmp77_0 = A_12_2 + A_12_3 + A_21_2 + A_21_3;
2739                                  const register double tmp209_0 = A_12_7 + A_21_1;                                  const double tmp209_0 = A_12_7 + A_21_1;
2740                                  const register double tmp219_0 = A_02_4 + A_20_1;                                  const double tmp219_0 = A_02_4 + A_20_1;
2741                                  const register double tmp84_0 = A_01_1 + A_01_5 + A_10_2 + A_10_6;                                  const double tmp84_0 = A_01_1 + A_01_5 + A_10_2 + A_10_6;
2742                                  const register double tmp162_0 = A_12_1 + A_12_7 + A_21_1 + A_21_7;                                  const double tmp162_0 = A_12_1 + A_12_7 + A_21_1 + A_21_7;
2743                                  const register double tmp159_0 = A_01_3 + A_10_3;                                  const double tmp159_0 = A_01_3 + A_10_3;
2744                                  const register double tmp56_0 = A_11_1 + A_11_3;                                  const double tmp56_0 = A_11_1 + A_11_3;
2745                                  const register double tmp52_0 = A_01_2 + A_01_5;                                  const double tmp52_0 = A_01_2 + A_01_5;
2746                                  const register double tmp26_0 = A_00_4 + A_00_5 + A_00_6 + A_00_7;                                  const double tmp26_0 = A_00_4 + A_00_5 + A_00_6 + A_00_7;
2747                                  const register double tmp229_0 = A_12_0 + A_12_7 + A_21_1 + A_21_6;                                  const double tmp229_0 = A_12_0 + A_12_7 + A_21_1 + A_21_6;
2748                                  const register double tmp151_0 = A_10_2 + A_10_5;                                  const double tmp151_0 = A_10_2 + A_10_5;
2749                                  const register double tmp136_0 = A_02_0 + A_02_5 + A_20_0 + A_20_5;                                  const double tmp136_0 = A_02_0 + A_02_5 + A_20_0 + A_20_5;
2750                                  const register double tmp128_0 = A_21_6 + A_21_7;                                  const double tmp128_0 = A_21_6 + A_21_7;
2751                                  const register double tmp15_0 = A_12_2 + A_12_4;                                  const double tmp15_0 = A_12_2 + A_12_4;
2752                                  const register double tmp296_1 = tmp159_0*w42;                                  const double tmp296_1 = tmp159_0*w42;
2753                                  const register double tmp130_1 = tmp67_0*w5;                                  const double tmp130_1 = tmp67_0*w5;
2754                                  const register double tmp98_1 = A_01_6*w42;                                  const double tmp98_1 = A_01_6*w42;
2755                                  const register double tmp231_1 = tmp125_0*w6;                                  const double tmp231_1 = tmp125_0*w6;
2756                                  const register double tmp42_1 = tmp34_0*w12;                                  const double tmp42_1 = tmp34_0*w12;
2757                                  const register double tmp199_1 = A_02_5*w28;                                  const double tmp199_1 = A_02_5*w28;
2758                                  const register double tmp113_1 = tmp29_0*w13;                                  const double tmp113_1 = tmp29_0*w13;
2759                                  const register double tmp330_1 = tmp152_0*w28;                                  const double tmp330_1 = tmp152_0*w28;
2760                                  const register double tmp90_1 = A_01_1*w46;                                  const double tmp90_1 = A_01_1*w46;
2761                                  const register double tmp446_1 = tmp77_0*w22;                                  const double tmp446_1 = tmp77_0*w22;
2762                                  const register double tmp108_1 = tmp43_0*w5;                                  const double tmp108_1 = tmp43_0*w5;
2763                                  const register double tmp524_1 = A_12_6*w29;                                  const double tmp524_1 = A_12_6*w29;
2764                                  const register double tmp232_1 = tmp126_0*w34;                                  const double tmp232_1 = tmp126_0*w34;
2765                                  const register double tmp33_1 = tmp25_0*w37;                                  const double tmp33_1 = tmp25_0*w37;
2766                                  const register double tmp461_1 = tmp180_0*w1;                                  const double tmp461_1 = tmp180_0*w1;
2767                                  const register double tmp14_1 = tmp8_0*w6;                                  const double tmp14_1 = tmp8_0*w6;
2768                                  const register double tmp447_1 = tmp205_0*w26;                                  const double tmp447_1 = tmp205_0*w26;
2769                                  const register double tmp452_1 = tmp198_0*w42;                                  const double tmp452_1 = tmp198_0*w42;
2770                                  const register double tmp217_1 = tmp81_0*w9;                                  const double tmp217_1 = tmp81_0*w9;
2771                                  const register double tmp76_1 = tmp59_0*w20;                                  const double tmp76_1 = tmp59_0*w20;
2772                                  const register double tmp421_1 = tmp134_0*w31;                                  const double tmp421_1 = tmp134_0*w31;
2773                                  const register double tmp485_1 = tmp51_0*w51;                                  const double tmp485_1 = tmp51_0*w51;
2774                                  const register double tmp240_1 = tmp131_0*w1;                                  const double tmp240_1 = tmp131_0*w1;
2775                                  const register double tmp160_1 = tmp91_0*w9;                                  const double tmp160_1 = tmp91_0*w9;
2776                                  const register double tmp174_1 = A_20_1*w26;                                  const double tmp174_1 = A_20_1*w26;
2777                                  const register double tmp273_1 = A_10_1*w46;                                  const double tmp273_1 = A_10_1*w46;
2778                                  const register double tmp159_1 = tmp90_0*w47;                                  const double tmp159_1 = tmp90_0*w47;
2779                                  const register double tmp228_1 = tmp103_0*w5;                                  const double tmp228_1 = tmp103_0*w5;
2780                                  const register double tmp313_1 = tmp166_0*w45;                                  const double tmp313_1 = tmp166_0*w45;
2781                                  const register double tmp45_1 = tmp37_0*w30;                                  const double tmp45_1 = tmp37_0*w30;
2782                                  const register double tmp512_1 = tmp147_0*w13;                                  const double tmp512_1 = tmp147_0*w13;
2783                                  const register double tmp73_1 = tmp56_0*w43;                                  const double tmp73_1 = tmp56_0*w43;
2784                                  const register double tmp61_1 = A_01_6*w46;                                  const double tmp61_1 = A_01_6*w46;
2785                                  const register double tmp316_1 = tmp167_0*w43;                                  const double tmp316_1 = tmp167_0*w43;
2786                                  const register double tmp189_1 = tmp112_0*w20;                                  const double tmp189_1 = tmp112_0*w20;
2787                                  const register double tmp455_1 = tmp215_0*w39;                                  const double tmp455_1 = tmp215_0*w39;
2788                                  const register double tmp360_1 = A_21_5*w24;                                  const double tmp360_1 = A_21_5*w24;
2789                                  const register double tmp258_1 = A_20_7*w2;                                  const double tmp258_1 = A_20_7*w2;
2790                                  const register double tmp196_1 = A_20_6*w26;                                  const double tmp196_1 = A_20_6*w26;
2791                                  const register double tmp37_1 = tmp29_0*w6;                                  const double tmp37_1 = tmp29_0*w6;
2792                                  const register double tmp9_1 = A_12_7*w29;                                  const double tmp9_1 = A_12_7*w29;
2793                                  const register double tmp80_1 = tmp63_0*w19;                                  const double tmp80_1 = tmp63_0*w19;
2794                                  const register double tmp312_1 = tmp165_0*w8;                                  const double tmp312_1 = tmp165_0*w8;
2795                                  const register double tmp264_1 = tmp101_0*w1;                                  const double tmp264_1 = tmp101_0*w1;
2796                                  const register double tmp124_1 = A_02_3*w26;                                  const double tmp124_1 = A_02_3*w26;
2797                                  const register double tmp229_1 = tmp123_0*w11;                                  const double tmp229_1 = tmp123_0*w11;
2798                                  const register double tmp333_1 = tmp159_0*w46;                                  const double tmp333_1 = tmp159_0*w46;
2799                                  const register double tmp533_1 = tmp222_0*w4;                                  const double tmp533_1 = tmp222_0*w4;
2800                                  const register double tmp201_1 = tmp108_0*w37;                                  const double tmp201_1 = tmp108_0*w37;
2801                                  const register double tmp444_1 = tmp35_0*w10;                                  const double tmp444_1 = tmp35_0*w10;
2802                                  const register double tmp51_1 = tmp43_0*w18;                                  const double tmp51_1 = tmp43_0*w18;
2803                                  const register double tmp214_1 = A_21_7*w29;                                  const double tmp214_1 = A_21_7*w29;
2804                                  const register double tmp518_1 = tmp86_0*w37;                                  const double tmp518_1 = tmp86_0*w37;
2805                                  const register double tmp192_1 = tmp115_0*w5;                                  const double tmp192_1 = tmp115_0*w5;
2806                                  const register double tmp355_1 = A_21_2*w27;                                  const double tmp355_1 = A_21_2*w27;
2807                                  const register double tmp156_1 = tmp87_0*w22;                                  const double tmp156_1 = tmp87_0*w22;
2808                                  const register double tmp516_1 = tmp230_0*w27;                                  const double tmp516_1 = tmp230_0*w27;
2809                                  const register double tmp366_1 = tmp104_0*w57;                                  const double tmp366_1 = tmp104_0*w57;
2810                                  const register double tmp271_1 = tmp146_0*w49;                                  const double tmp271_1 = tmp146_0*w49;
2811                                  const register double tmp437_1 = tmp218_0*w24;                                  const double tmp437_1 = tmp218_0*w24;
2812                                  const register double tmp436_1 = tmp104_0*w54;                                  const double tmp436_1 = tmp104_0*w54;
2813                                  const register double tmp167_1 = tmp98_0*w8;                                  const double tmp167_1 = tmp98_0*w8;
2814                                  const register double tmp136_1 = tmp70_0*w34;                                  const double tmp136_1 = tmp70_0*w34;
2815                                  const register double tmp406_1 = tmp207_0*w27;                                  const double tmp406_1 = tmp207_0*w27;
2816                                  const register double tmp193_1 = tmp116_0*w12;                                  const double tmp193_1 = tmp116_0*w12;
2817                                  const register double tmp486_1 = tmp225_0*w29;                                  const double tmp486_1 = tmp225_0*w29;
2818                                  const register double tmp469_1 = tmp224_0*w11;                                  const double tmp469_1 = tmp224_0*w11;
2819                                  const register double tmp287_1 = tmp71_0*w53;                                  const double tmp287_1 = tmp71_0*w53;
2820                                  const register double tmp430_1 = tmp213_0*w28;                                  const double tmp430_1 = tmp213_0*w28;
2821                                  const register double tmp462_1 = tmp220_0*w2;                                  const double tmp462_1 = tmp220_0*w2;
2822                                  const register double tmp294_1 = tmp53_0*w59;                                  const double tmp294_1 = tmp53_0*w59;
2823                                  const register double tmp218_1 = tmp118_0*w16;                                  const double tmp218_1 = tmp118_0*w16;
2824                                  const register double tmp116_1 = tmp25_0*w31;                                  const double tmp116_1 = tmp25_0*w31;
2825                                  const register double tmp495_1 = tmp76_0*w37;                                  const double tmp495_1 = tmp76_0*w37;
2826                                  const register double tmp501_1 = tmp99_0*w46;                                  const double tmp501_1 = tmp99_0*w46;
2827                                  const register double tmp0_1 = tmp0_0*w1;                                  const double tmp0_1 = tmp0_0*w1;
2828                                  const register double tmp99_1 = tmp62_0*w17;                                  const double tmp99_1 = tmp62_0*w17;
2829                                  const register double tmp429_1 = tmp212_0*w2;                                  const double tmp429_1 = tmp212_0*w2;
2830                                  const register double tmp249_1 = tmp136_0*w9;                                  const double tmp249_1 = tmp136_0*w9;
2831                                  const register double tmp504_1 = tmp229_0*w19;                                  const double tmp504_1 = tmp229_0*w19;
2832                                  const register double tmp197_1 = A_12_2*w27;                                  const double tmp197_1 = A_12_2*w27;
2833                                  const register double tmp531_1 = tmp122_0*w35;                                  const double tmp531_1 = tmp122_0*w35;
2834                                  const register double tmp265_1 = tmp142_0*w46;                                  const double tmp265_1 = tmp142_0*w46;
2835                                  const register double tmp488_1 = tmp226_0*w4;                                  const double tmp488_1 = tmp226_0*w4;
2836                                  const register double tmp528_1 = tmp115_0*w18;                                  const double tmp528_1 = tmp115_0*w18;
2837                                  const register double tmp438_1 = tmp219_0*w2;                                  const double tmp438_1 = tmp219_0*w2;
2838                                  const register double tmp233_1 = tmp127_0*w13;                                  const double tmp233_1 = tmp127_0*w13;
2839                                  const register double tmp491_1 = tmp79_0*w1;                                  const double tmp491_1 = tmp79_0*w1;
2840                                  const register double tmp215_1 = A_21_0*w4;                                  const double tmp215_1 = A_21_0*w4;
2841                                  const register double tmp24_1 = tmp18_0*w21;                                  const double tmp24_1 = tmp18_0*w21;
2842                                  const register double tmp538_1 = tmp209_0*w27;                                  const double tmp538_1 = tmp209_0*w27;
2843                                  const register double tmp379_1 = tmp167_0*w55;                                  const double tmp379_1 = tmp167_0*w55;
2844                                  const register double tmp332_1 = tmp154_0*w4;                                  const double tmp332_1 = tmp154_0*w4;
2845                                  const register double tmp498_1 = tmp68_0*w31;                                  const double tmp498_1 = tmp68_0*w31;
2846                                  const register double tmp41_1 = tmp33_0*w33;                                  const double tmp41_1 = tmp33_0*w33;
2847                                  const register double tmp464_1 = tmp179_0*w37;                                  const double tmp464_1 = tmp179_0*w37;
2848                                  const register double tmp317_1 = tmp168_0*w40;                                  const double tmp317_1 = tmp168_0*w40;
2849                                  const register double tmp378_1 = tmp106_0*w54;                                  const double tmp378_1 = tmp106_0*w54;
2850                                  const register double tmp184_1 = tmp109_0*w14;                                  const double tmp184_1 = tmp109_0*w14;
2851                                  const register double tmp292_1 = tmp14_0*w33;                                  const double tmp292_1 = tmp14_0*w33;
2852                                  const register double tmp11_1 = tmp5_0*w11;                                  const double tmp11_1 = tmp5_0*w11;
2853                                  const register double tmp354_1 = A_02_6*w26;                                  const double tmp354_1 = A_02_6*w26;
2854                                  const register double tmp84_1 = tmp37_0*w0;                                  const double tmp84_1 = tmp37_0*w0;
2855                                  const register double tmp422_1 = tmp13_0*w30;                                  const double tmp422_1 = tmp13_0*w30;
2856                                  const register double tmp132_1 = tmp69_0*w11;                                  const double tmp132_1 = tmp69_0*w11;
2857                                  const register double tmp251_1 = tmp138_0*w31;                                  const double tmp251_1 = tmp138_0*w31;
2858                                  const register double tmp18_1 = tmp12_0*w8;                                  const double tmp18_1 = tmp12_0*w8;
2859                                  const register double tmp88_1 = A_21_1*w4;                                  const double tmp88_1 = A_21_1*w4;
2860                                  const register double tmp188_1 = A_12_2*w24;                                  const double tmp188_1 = A_12_2*w24;
2861                                  const register double tmp465_1 = tmp175_0*w31;                                  const double tmp465_1 = tmp175_0*w31;
2862                                  const register double tmp235_1 = tmp128_0*w17;                                  const double tmp235_1 = tmp128_0*w17;
2863                                  const register double tmp323_1 = A_02_1*w26;                                  const double tmp323_1 = A_02_1*w26;
2864                                  const register double tmp31_1 = tmp23_0*w38;                                  const double tmp31_1 = tmp23_0*w38;
2865                                  const register double tmp397_1 = tmp170_0*w5;                                  const double tmp397_1 = tmp170_0*w5;
2866                                  const register double tmp175_1 = tmp7_0*w3;                                  const double tmp175_1 = tmp7_0*w3;
2867                                  const register double tmp148_1 = tmp81_0*w21;                                  const double tmp148_1 = tmp81_0*w21;
2868                                  const register double tmp238_1 = tmp130_0*w19;                                  const double tmp238_1 = tmp130_0*w19;
2869                                  const register double tmp59_1 = tmp46_0*w11;                                  const double tmp59_1 = tmp46_0*w11;
2870                                  const register double tmp432_1 = tmp215_0*w35;                                  const double tmp432_1 = tmp215_0*w35;
2871                                  const register double tmp398_1 = A_01_2*w46;                                  const double tmp398_1 = A_01_2*w46;
2872                                  const register double tmp497_1 = A_10_5*w46;                                  const double tmp497_1 = A_10_5*w46;
2873                                  const register double tmp28_1 = tmp21_0*w18;                                  const double tmp28_1 = tmp21_0*w18;
2874                                  const register double tmp115_1 = tmp23_0*w32;                                  const double tmp115_1 = tmp23_0*w32;
2875                                  const register double tmp441_1 = tmp23_0*w3;                                  const double tmp441_1 = tmp23_0*w3;
2876                                  const register double tmp131_1 = tmp68_0*w37;                                  const double tmp131_1 = tmp68_0*w37;
2877                                  const register double tmp289_1 = tmp155_0*w4;                                  const double tmp289_1 = tmp155_0*w4;
2878                                  const register double tmp278_1 = tmp80_0*w44;                                  const double tmp278_1 = tmp80_0*w44;
2879                                  const register double tmp5_1 = A_21_4*w27;                                  const double tmp5_1 = A_21_4*w27;
2880                                  const register double tmp254_1 = tmp140_0*w20;                                  const double tmp254_1 = tmp140_0*w20;
2881                                  const register double tmp183_1 = tmp108_0*w31;                                  const double tmp183_1 = tmp108_0*w31;
2882                                  const register double tmp279_1 = tmp151_0*w8;                                  const double tmp279_1 = tmp151_0*w8;
2883                                  const register double tmp298_1 = tmp161_0*w16;                                  const double tmp298_1 = tmp161_0*w16;
2884                                  const register double tmp505_1 = tmp230_0*w24;                                  const double tmp505_1 = tmp230_0*w24;
2885                                  const register double tmp246_1 = tmp80_0*w52;                                  const double tmp246_1 = tmp80_0*w52;
2886                                  const register double tmp100_1 = tmp53_0*w43;                                  const double tmp100_1 = tmp53_0*w43;
2887                                  const register double tmp440_1 = tmp221_0*w16;                                  const double tmp440_1 = tmp221_0*w16;
2888                                  const register double tmp481_1 = tmp188_0*w23;                                  const double tmp481_1 = tmp188_0*w23;
2889                                  const register double tmp480_1 = tmp187_0*w35;                                  const double tmp480_1 = tmp187_0*w35;
2890                                  const register double tmp384_1 = tmp150_0*w53;                                  const double tmp384_1 = tmp150_0*w53;
2891                                  const register double tmp142_1 = tmp76_0*w31;                                  const double tmp142_1 = tmp76_0*w31;
2892                                  const register double tmp372_1 = tmp191_0*w11;                                  const double tmp372_1 = tmp191_0*w11;
2893                                  const register double tmp307_1 = A_10_7*w35;                                  const double tmp307_1 = A_10_7*w35;
2894                                  const register double tmp186_1 = tmp111_0*w19;                                  const double tmp186_1 = tmp111_0*w19;
2895                                  const register double tmp127_1 = A_20_2*w2;                                  const double tmp127_1 = A_20_2*w2;
2896                                  const register double tmp391_1 = tmp167_0*w59;                                  const double tmp391_1 = tmp167_0*w59;
2897                                  const register double tmp223_1 = tmp113_0*w20;                                  const double tmp223_1 = tmp113_0*w20;
2898                                  const register double tmp454_1 = tmp197_0*w24;                                  const double tmp454_1 = tmp197_0*w24;
2899                                  const register double tmp241_1 = tmp74_0*w51;                                  const double tmp241_1 = tmp74_0*w51;
2900                                  const register double tmp529_1 = tmp114_0*w5;                                  const double tmp529_1 = tmp114_0*w5;
2901                                  const register double tmp202_1 = tmp104_0*w7;                                  const double tmp202_1 = tmp104_0*w7;
2902                                  const register double tmp236_1 = tmp96_0*w21;                                  const double tmp236_1 = tmp96_0*w21;
2903                                  const register double tmp358_1 = tmp183_0*w11;                                  const double tmp358_1 = tmp183_0*w11;
2904                                  const register double tmp102_1 = tmp51_0*w41;                                  const double tmp102_1 = tmp51_0*w41;
2905                                  const register double tmp493_1 = A_20_5*w2;                                  const double tmp493_1 = A_20_5*w2;
2906                                  const register double tmp468_1 = tmp223_0*w4;                                  const double tmp468_1 = tmp223_0*w4;
2907                                  const register double tmp435_1 = tmp217_0*w16;                                  const double tmp435_1 = tmp217_0*w16;
2908                                  const register double tmp110_1 = tmp37_0*w36;                                  const double tmp110_1 = tmp37_0*w36;
2909                                  const register double tmp479_1 = tmp189_0*w4;                                  const double tmp479_1 = tmp189_0*w4;
2910                                  const register double tmp120_1 = tmp38_0*w22;                                  const double tmp120_1 = tmp38_0*w22;
2911                                  const register double tmp16_1 = tmp10_0*w9;                                  const double tmp16_1 = tmp10_0*w9;
2912                                  const register double tmp407_1 = tmp90_0*w53;                                  const double tmp407_1 = tmp90_0*w53;
2913                                  const register double tmp442_1 = tmp66_0*w48;                                  const double tmp442_1 = tmp66_0*w48;
2914                                  const register double tmp60_1 = A_10_4*w35;                                  const double tmp60_1 = A_10_4*w35;
2915                                  const register double tmp69_1 = tmp53_0*w45;                                  const double tmp69_1 = tmp53_0*w45;
2916                                  const register double tmp144_1 = tmp77_0*w17;                                  const double tmp144_1 = tmp77_0*w17;
2917                                  const register double tmp507_1 = tmp146_0*w48;                                  const double tmp507_1 = tmp146_0*w48;
2918                                  const register double tmp424_1 = tmp174_0*w18;                                  const double tmp424_1 = tmp174_0*w18;
2919                                  const register double tmp352_1 = tmp181_0*w23;                                  const double tmp352_1 = tmp181_0*w23;
2920                                  const register double tmp451_1 = tmp199_0*w13;                                  const double tmp451_1 = tmp199_0*w13;
2921                                  const register double tmp253_1 = tmp139_0*w16;                                  const double tmp253_1 = tmp139_0*w16;
2922                                  const register double tmp353_1 = tmp182_0*w18;                                  const double tmp353_1 = tmp182_0*w18;
2923                                  const register double tmp521_1 = tmp88_0*w22;                                  const double tmp521_1 = tmp88_0*w22;
2924                                  const register double tmp346_1 = tmp175_0*w37;                                  const double tmp346_1 = tmp175_0*w37;
2925                                  const register double tmp416_1 = tmp138_0*w37;                                  const double tmp416_1 = tmp138_0*w37;
2926                                  const register double tmp324_1 = A_10_0*w35;                                  const double tmp324_1 = A_10_0*w35;
2927                                  const register double tmp152_1 = tmp84_0*w37;                                  const double tmp152_1 = tmp84_0*w37;
2928                                  const register double tmp119_1 = tmp32_0*w21;                                  const double tmp119_1 = tmp32_0*w21;
2929                                  const register double tmp86_1 = A_21_6*w29;                                  const double tmp86_1 = A_21_6*w29;
2930                                  const register double tmp290_1 = tmp156_0*w11;                                  const double tmp290_1 = tmp156_0*w11;
2931                                  const register double tmp382_1 = tmp196_0*w26;                                  const double tmp382_1 = tmp196_0*w26;
2932                                  const register double tmp91_1 = tmp49_0*w6;                                  const double tmp91_1 = tmp49_0*w6;
2933                                  const register double tmp499_1 = A_10_2*w42;                                  const double tmp499_1 = A_10_2*w42;
2934                                  const register double tmp226_1 = tmp121_0*w13;                                  const double tmp226_1 = tmp121_0*w13;
2935                                  const register double tmp477_1 = tmp195_0*w26;                                  const double tmp477_1 = tmp195_0*w26;
2936                                  const register double tmp150_1 = A_02_4*w23;                                  const double tmp150_1 = A_02_4*w23;
2937                                  const register double tmp318_1 = tmp15_0*w22;                                  const double tmp318_1 = tmp15_0*w22;
2938                                  const register double tmp396_1 = tmp206_0*w24;                                  const double tmp396_1 = tmp206_0*w24;
2939                                  const register double tmp474_1 = A_02_0*w28;                                  const double tmp474_1 = A_02_0*w28;
2940                                  const register double tmp245_1 = tmp134_0*w37;                                  const double tmp245_1 = tmp134_0*w37;
2941                                  const register double tmp3_1 = A_20_4*w26;                                  const double tmp3_1 = A_20_4*w26;
2942                                  const register double tmp44_1 = tmp36_0*w31;                                  const double tmp44_1 = tmp36_0*w31;
2943                                  const register double tmp487_1 = tmp60_0*w52;                                  const double tmp487_1 = tmp60_0*w52;
2944                                  const register double tmp293_1 = tmp158_0*w8;                                  const double tmp293_1 = tmp158_0*w8;
2945                                  const register double tmp314_1 = A_01_2*w42;                                  const double tmp314_1 = A_01_2*w42;
2946                                  const register double tmp414_1 = tmp80_0*w51;                                  const double tmp414_1 = tmp80_0*w51;
2947                                  const register double tmp472_1 = A_21_3*w27;                                  const double tmp472_1 = A_21_3*w27;
2948                                  const register double tmp321_1 = A_21_2*w24;                                  const double tmp321_1 = A_21_2*w24;
2949                                  const register double tmp225_1 = tmp120_0*w6;                                  const double tmp225_1 = tmp120_0*w6;
2950                                  const register double tmp377_1 = tmp166_0*w59;                                  const double tmp377_1 = tmp166_0*w59;
2951                                  const register double tmp413_1 = tmp186_0*w26;                                  const double tmp413_1 = tmp186_0*w26;
2952                                  const register double tmp385_1 = tmp166_0*w55;                                  const double tmp385_1 = tmp166_0*w55;
2953                                  const register double tmp310_1 = tmp164_0*w34;                                  const double tmp310_1 = tmp164_0*w34;
2954                                  const register double tmp158_1 = tmp89_0*w34;                                  const double tmp158_1 = tmp89_0*w34;
2955                                  const register double tmp449_1 = tmp203_0*w46;                                  const double tmp449_1 = tmp203_0*w46;
2956                                  const register double tmp439_1 = tmp220_0*w28;                                  const double tmp439_1 = tmp220_0*w28;
2957                                  const register double tmp22_1 = tmp16_0*w16;                                  const double tmp22_1 = tmp16_0*w16;
2958                                  const register double tmp164_1 = tmp95_0*w46;                                  const double tmp164_1 = tmp95_0*w46;
2959                                  const register double tmp417_1 = tmp74_0*w52;                                  const double tmp417_1 = tmp74_0*w52;
2960                                  const register double tmp257_1 = tmp6_0*w25;                                  const double tmp257_1 = tmp6_0*w25;
2961                                  const register double tmp203_1 = tmp18_0*w9;                                  const double tmp203_1 = tmp18_0*w9;
2962                                  const register double tmp286_1 = tmp153_0*w28;                                  const double tmp286_1 = tmp153_0*w28;
2963                                  const register double tmp155_1 = tmp33_0*w14;                                  const double tmp155_1 = tmp33_0*w14;
2964                                  const register double tmp389_1 = tmp201_0*w12;                                  const double tmp389_1 = tmp201_0*w12;
2965                                  const register double tmp508_1 = tmp145_0*w49;                                  const double tmp508_1 = tmp145_0*w49;
2966                                  const register double tmp300_1 = tmp56_0*w55;                                  const double tmp300_1 = tmp56_0*w55;
2967                                  const register double tmp299_1 = tmp162_0*w22;                                  const double tmp299_1 = tmp162_0*w22;
2968                                  const register double tmp173_1 = tmp104_0*w25;                                  const double tmp173_1 = tmp104_0*w25;
2969                                  const register double tmp32_1 = tmp24_0*w5;                                  const double tmp32_1 = tmp24_0*w5;
2970                                  const register double tmp227_1 = tmp122_0*w39;                                  const double tmp227_1 = tmp122_0*w39;
2971                                  const register double tmp484_1 = tmp3_0*w38;                                  const double tmp484_1 = tmp3_0*w38;
2972                                  const register double tmp171_1 = tmp102_0*w21;                                  const double tmp171_1 = tmp102_0*w21;
2973                                  const register double tmp478_1 = tmp190_0*w29;                                  const double tmp478_1 = tmp190_0*w29;
2974                                  const register double tmp320_1 = tmp170_0*w18;                                  const double tmp320_1 = tmp170_0*w18;
2975                                  const register double tmp327_1 = tmp6_0*w57;                                  const double tmp327_1 = tmp6_0*w57;
2976                                  const register double tmp490_1 = tmp7_0*w32;                                  const double tmp490_1 = tmp7_0*w32;
2977                                  const register double tmp419_1 = tmp127_0*w6;                                  const double tmp419_1 = tmp127_0*w6;
2978                                  const register double tmp463_1 = tmp219_0*w28;                                  const double tmp463_1 = tmp219_0*w28;
2979                                  const register double tmp12_1 = tmp6_0*w7;                                  const double tmp12_1 = tmp6_0*w7;
2980                                  const register double tmp49_1 = tmp41_0*w22;                                  const double tmp49_1 = tmp41_0*w22;
2981                                  const register double tmp344_1 = tmp173_0*w26;                                  const double tmp344_1 = tmp173_0*w26;
2982                                  const register double tmp243_1 = tmp132_0*w2;                                  const double tmp243_1 = tmp132_0*w2;
2983                                  const register double tmp83_1 = A_10_4*w39;                                  const double tmp83_1 = A_10_4*w39;
2984                                  const register double tmp297_1 = tmp160_0*w17;                                  const double tmp297_1 = tmp160_0*w17;
2985                                  const register double tmp275_1 = tmp148_0*w34;                                  const double tmp275_1 = tmp148_0*w34;
2986                                  const register double tmp168_1 = tmp99_0*w42;                                  const double tmp168_1 = tmp99_0*w42;
2987                                  const register double tmp409_1 = tmp3_0*w32;                                  const double tmp409_1 = tmp3_0*w32;
2988                                  const register double tmp1_1 = tmp1_0*w25;                                  const double tmp1_1 = tmp1_0*w25;
2989                                  const register double tmp426_1 = tmp210_0*w39;                                  const double tmp426_1 = tmp210_0*w39;
2990                                  const register double tmp375_1 = tmp109_0*w33;                                  const double tmp375_1 = tmp109_0*w33;
2991                                  const register double tmp50_1 = tmp42_0*w19;                                  const double tmp50_1 = tmp42_0*w19;
2992                                  const register double tmp513_1 = A_10_1*w42;                                  const double tmp513_1 = A_10_1*w42;
2993                                  const register double tmp97_1 = tmp45_0*w31;                                  const double tmp97_1 = tmp45_0*w31;
2994                                  const register double tmp403_1 = tmp140_0*w1;                                  const double tmp403_1 = tmp140_0*w1;
2995                                  const register double tmp71_1 = A_01_1*w42;                                  const double tmp71_1 = A_01_1*w42;
2996                                  const register double tmp520_1 = tmp84_0*w31;                                  const double tmp520_1 = tmp84_0*w31;
2997                                  const register double tmp510_1 = A_10_6*w46;                                  const double tmp510_1 = A_10_6*w46;
2998                                  const register double tmp302_1 = A_10_0*w39;                                  const double tmp302_1 = A_10_0*w39;
2999                                  const register double tmp364_1 = tmp128_0*w22;                                  const double tmp364_1 = tmp128_0*w22;
3000                                  const register double tmp515_1 = tmp142_0*w42;                                  const double tmp515_1 = tmp142_0*w42;
3001                                  const register double tmp283_1 = tmp65_0*w56;                                  const double tmp283_1 = tmp65_0*w56;
3002                                  const register double tmp222_1 = tmp112_0*w1;                                  const double tmp222_1 = tmp112_0*w1;
3003                                  const register double tmp428_1 = tmp211_0*w27;                                  const double tmp428_1 = tmp211_0*w27;
3004                                  const register double tmp371_1 = tmp190_0*w4;                                  const double tmp371_1 = tmp190_0*w4;
3005                                  const register double tmp423_1 = tmp184_0*w23;                                  const double tmp423_1 = tmp184_0*w23;
3006                                  const register double tmp276_1 = tmp149_0*w13;                                  const double tmp276_1 = tmp149_0*w13;
3007                                  const register double tmp65_1 = tmp50_0*w9;                                  const double tmp65_1 = tmp50_0*w9;
3008                                  const register double tmp305_1 = A_12_0*w29;                                  const double tmp305_1 = A_12_0*w29;
3009                                  const register double tmp170_1 = tmp101_0*w20;                                  const double tmp170_1 = tmp101_0*w20;
3010                                  const register double tmp350_1 = tmp179_0*w31;                                  const double tmp350_1 = tmp179_0*w31;
3011                                  const register double tmp466_1 = tmp172_0*w20;                                  const double tmp466_1 = tmp172_0*w20;
3012                                  const register double tmp361_1 = tmp184_0*w26;                                  const double tmp361_1 = tmp184_0*w26;
3013                                  const register double tmp431_1 = tmp214_0*w19;                                  const double tmp431_1 = tmp214_0*w19;
3014                                  const register double tmp363_1 = tmp129_0*w17;                                  const double tmp363_1 = tmp129_0*w17;
3015                                  const register double tmp178_1 = A_02_2*w28;                                  const double tmp178_1 = A_02_2*w28;
3016                                  const register double tmp527_1 = tmp120_0*w13;                                  const double tmp527_1 = tmp120_0*w13;
3017                                  const register double tmp415_1 = tmp182_0*w5;                                  const double tmp415_1 = tmp182_0*w5;
3018                                  const register double tmp450_1 = tmp200_0*w6;                                  const double tmp450_1 = tmp200_0*w6;
3019                                  const register double tmp269_1 = A_01_7*w39;                                  const double tmp269_1 = A_01_7*w39;
3020                                  const register double tmp285_1 = tmp152_0*w2;                                  const double tmp285_1 = tmp152_0*w2;
3021                                  const register double tmp272_1 = A_01_0*w35;                                  const double tmp272_1 = A_01_0*w35;
3022                                  const register double tmp339_1 = tmp136_0*w21;                                  const double tmp339_1 = tmp136_0*w21;
3023                                  const register double tmp502_1 = tmp95_0*w42;                                  const double tmp502_1 = tmp95_0*w42;
3024                                  const register double tmp38_1 = tmp30_0*w34;                                  const double tmp38_1 = tmp30_0*w34;
3025                                  const register double tmp514_1 = tmp144_0*w46;                                  const double tmp514_1 = tmp144_0*w46;
3026                                  const register double tmp96_1 = tmp56_0*w45;                                  const double tmp96_1 = tmp56_0*w45;
3027                                  const register double tmp399_1 = tmp167_0*w45;                                  const double tmp399_1 = tmp167_0*w45;
3028                                  const register double tmp483_1 = tmp173_0*w23;                                  const double tmp483_1 = tmp173_0*w23;
3029                                  const register double tmp522_1 = tmp87_0*w17;                                  const double tmp522_1 = tmp87_0*w17;
3030                                  const register double tmp519_1 = tmp91_0*w21;                                  const double tmp519_1 = tmp91_0*w21;
3031                                  const register double tmp209_1 = A_12_5*w24;                                  const double tmp209_1 = A_12_5*w24;
3032                                  const register double tmp126_1 = tmp65_0*w48;                                  const double tmp126_1 = tmp65_0*w48;
3033                                  const register double tmp367_1 = tmp187_0*w39;                                  const double tmp367_1 = tmp187_0*w39;
3034                                  const register double tmp221_1 = tmp67_0*w18;                                  const double tmp221_1 = tmp67_0*w18;
3035                                  const register double tmp381_1 = tmp146_0*w56;                                  const double tmp381_1 = tmp146_0*w56;
3036                                  const register double tmp70_1 = tmp54_0*w31;                                  const double tmp70_1 = tmp54_0*w31;
3037                                  const register double tmp216_1 = tmp117_0*w11;                                  const double tmp216_1 = tmp117_0*w11;
3038                                  const register double tmp473_1 = A_02_7*w2;                                  const double tmp473_1 = A_02_7*w2;
3039                                  const register double tmp149_1 = tmp82_0*w22;                                  const double tmp149_1 = tmp82_0*w22;
3040                                  const register double tmp357_1 = A_12_6*w4;                                  const double tmp357_1 = A_12_6*w4;
3041                                  const register double tmp534_1 = tmp226_0*w29;                                  const double tmp534_1 = tmp226_0*w29;
3042                                  const register double tmp95_1 = tmp26_0*w15;                                  const double tmp95_1 = tmp26_0*w15;
3043                                  const register double tmp500_1 = tmp64_0*w20;                                  const double tmp500_1 = tmp64_0*w20;
3044                                  const register double tmp387_1 = tmp199_0*w6;                                  const double tmp387_1 = tmp199_0*w6;
3045                                  const register double tmp471_1 = A_20_4*w23;                                  const double tmp471_1 = A_20_4*w23;
3046                                  const register double tmp281_1 = tmp74_0*w41;                                  const double tmp281_1 = tmp74_0*w41;
3047                                  const register double tmp351_1 = tmp180_0*w20;                                  const double tmp351_1 = tmp180_0*w20;
3048                                  const register double tmp63_1 = tmp48_0*w34;                                  const double tmp63_1 = tmp48_0*w34;
3049                                  const register double tmp365_1 = tmp186_0*w23;                                  const double tmp365_1 = tmp186_0*w23;
3050                                  const register double tmp448_1 = tmp206_0*w27;                                  const double tmp448_1 = tmp206_0*w27;
3051                                  const register double tmp39_1 = tmp31_0*w13;                                  const double tmp39_1 = tmp31_0*w13;
3052                                  const register double tmp453_1 = tmp196_0*w23;                                  const double tmp453_1 = tmp196_0*w23;
3053                                  const register double tmp402_1 = tmp163_0*w18;                                  const double tmp402_1 = tmp163_0*w18;
3054                                  const register double tmp137_1 = tmp71_0*w47;                                  const double tmp137_1 = tmp71_0*w47;
3055                                  const register double tmp6_1 = A_02_0*w2;                                  const double tmp6_1 = A_02_0*w2;
3056                                  const register double tmp34_1 = tmp26_0*w36;                                  const double tmp34_1 = tmp26_0*w36;
3057                                  const register double tmp383_1 = tmp197_0*w27;                                  const double tmp383_1 = tmp197_0*w27;
3058                                  const register double tmp166_1 = tmp97_0*w12;                                  const double tmp166_1 = tmp97_0*w12;
3059                                  const register double tmp114_1 = tmp40_0*w9;                                  const double tmp114_1 = tmp40_0*w9;
3060                                  const register double tmp306_1 = A_12_7*w4;                                  const double tmp306_1 = A_12_7*w4;
3061                                  const register double tmp530_1 = tmp124_0*w39;                                  const double tmp530_1 = tmp124_0*w39;
3062                                  const register double tmp388_1 = tmp200_0*w13;                                  const double tmp388_1 = tmp200_0*w13;
3063                                  const register double tmp252_1 = tmp2_0*w30;                                  const double tmp252_1 = tmp2_0*w30;
3064                                  const register double tmp210_1 = A_02_4*w26;                                  const double tmp210_1 = A_02_4*w26;
3065                                  const register double tmp200_1 = tmp21_0*w5;                                  const double tmp200_1 = tmp21_0*w5;
3066                                  const register double tmp181_1 = tmp3_0*w10;                                  const double tmp181_1 = tmp3_0*w10;
3067                                  const register double tmp425_1 = tmp106_0*w57;                                  const double tmp425_1 = tmp106_0*w57;
3068                                  const register double tmp261_1 = A_21_7*w4;                                  const double tmp261_1 = A_21_7*w4;
3069                                  const register double tmp64_1 = tmp49_0*w13;                                  const double tmp64_1 = tmp49_0*w13;
3070                                  const register double tmp506_1 = A_01_0*w39;                                  const double tmp506_1 = A_01_0*w39;
3071                                  const register double tmp457_1 = tmp213_0*w2;                                  const double tmp457_1 = tmp213_0*w2;
3072                                  const register double tmp2_1 = tmp2_0*w0;                                  const double tmp2_1 = tmp2_0*w0;
3073                                  const register double tmp393_1 = tmp203_0*w42;                                  const double tmp393_1 = tmp203_0*w42;
3074                                  const register double tmp133_1 = A_01_3*w35;                                  const double tmp133_1 = A_01_3*w35;
3075                                  const register double tmp147_1 = tmp80_0*w41;                                  const double tmp147_1 = tmp80_0*w41;
3076                                  const register double tmp8_1 = tmp4_0*w5;                                  const double tmp8_1 = tmp4_0*w5;
3077                                  const register double tmp267_1 = tmp144_0*w42;                                  const double tmp267_1 = tmp144_0*w42;
3078                                  const register double tmp17_1 = tmp11_0*w12;                                  const double tmp17_1 = tmp11_0*w12;
3079                                  const register double tmp284_1 = tmp58_0*w50;                                  const double tmp284_1 = tmp58_0*w50;
3080                                  const register double tmp328_1 = tmp66_0*w56;                                  const double tmp328_1 = tmp66_0*w56;
3081                                  const register double tmp405_1 = tmp60_0*w51;                                  const double tmp405_1 = tmp60_0*w51;
3082                                  const register double tmp467_1 = tmp222_0*w29;                                  const double tmp467_1 = tmp222_0*w29;
3083                                  const register double tmp535_1 = tmp225_0*w4;                                  const double tmp535_1 = tmp225_0*w4;
3084                                  const register double tmp356_1 = A_12_1*w29;                                  const double tmp356_1 = A_12_1*w29;
3085                                  const register double tmp274_1 = tmp147_0*w6;                                  const double tmp274_1 = tmp147_0*w6;
3086                                  const register double tmp476_1 = tmp192_0*w39;                                  const double tmp476_1 = tmp192_0*w39;
3087                                  const register double tmp206_1 = tmp10_0*w21;                                  const double tmp206_1 = tmp10_0*w21;
3088                                  const register double tmp334_1 = tmp141_0*w9;                                  const double tmp334_1 = tmp141_0*w9;
3089                                  const register double tmp482_1 = tmp181_0*w26;                                  const double tmp482_1 = tmp181_0*w26;
3090                                  const register double tmp212_1 = A_20_7*w28;                                  const double tmp212_1 = A_20_7*w28;
3091                                  const register double tmp219_1 = tmp72_0*w21;                                  const double tmp219_1 = tmp72_0*w21;
3092                                  const register double tmp47_1 = tmp39_0*w16;                                  const double tmp47_1 = tmp39_0*w16;
3093                                  const register double tmp89_1 = A_10_3*w35;                                  const double tmp89_1 = A_10_3*w35;
3094                                  const register double tmp52_1 = tmp44_0*w1;                                  const double tmp52_1 = tmp44_0*w1;
3095                                  const register double tmp492_1 = A_01_3*w39;                                  const double tmp492_1 = A_01_3*w39;
3096                                  const register double tmp81_1 = A_12_3*w24;                                  const double tmp81_1 = A_12_3*w24;
3097                                  const register double tmp77_1 = tmp60_0*w41;                                  const double tmp77_1 = tmp60_0*w41;
3098                                  const register double tmp153_1 = tmp85_0*w21;                                  const double tmp153_1 = tmp85_0*w21;
3099                                  const register double tmp304_1 = tmp163_0*w5;                                  const double tmp304_1 = tmp163_0*w5;
3100                                  const register double tmp489_1 = tmp227_0*w11;                                  const double tmp489_1 = tmp227_0*w11;
3101                                  const register double tmp107_1 = tmp35_0*w38;                                  const double tmp107_1 = tmp35_0*w38;
3102                                  const register double tmp30_1 = tmp22_0*w39;                                  const double tmp30_1 = tmp22_0*w39;
3103                                  const register double tmp260_1 = A_21_0*w29;                                  const double tmp260_1 = A_21_0*w29;
3104                                  const register double tmp343_1 = tmp172_0*w1;                                  const double tmp343_1 = tmp172_0*w1;
3105                                  const register double tmp511_1 = tmp149_0*w6;                                  const double tmp511_1 = tmp149_0*w6;
3106                                  const register double tmp139_1 = tmp73_0*w12;                                  const double tmp139_1 = tmp73_0*w12;
3107                                  const register double tmp66_1 = tmp51_0*w44;                                  con