/[escript]/trunk/ripley/src/Rectangle.cpp
ViewVC logotype

Diff of /trunk/ripley/src/Rectangle.cpp

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

revision 3770 by gross, Wed Jan 18 01:40:15 2012 UTC revision 3773 by caltinay, Wed Jan 18 04:27:53 2012 UTC
# Line 3385  void Rectangle::assemblePDESystemReduced Line 3385  void Rectangle::assemblePDESystemReduced
3385    
3386  //protected  //protected
3387  void Rectangle::assemblePDEBoundarySingle(Paso_SystemMatrix* mat,  void Rectangle::assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
3388          escript::Data& rhs, const escript::Data& A, const escript::Data& B,          escript::Data& rhs, const escript::Data& a, const escript::Data& b,
3389          const escript::Data& C, const escript::Data& D,          const escript::Data& c, const escript::Data& d,
3390          const escript::Data& X, const escript::Data& Y) const          const escript::Data& x, const escript::Data& y) const
3391  {  {
3392      const double h0 = m_l0/m_gNE0;      const double h0 = m_l0/m_gNE0;
3393      const double h1 = m_l1/m_gNE1;      const double h1 = m_l1/m_gNE1;
3394      dim_t numEq, numComp;      /* GENERATOR SNIP_PDEBC_SINGLE_PRE TOP */
3395      if (!mat)      /* GENERATOR SNIP_PDEBC_SINGLE_PRE BOTTOM */
3396          numEq=numComp=(rhs.isEmpty() ? 1 : rhs.getDataPointSize());  #pragma omp parallel
3397      else {      {
3398          numEq=mat->logical_row_block_size;          if (m_faceOffset[0] > -1) {
3399          numComp=mat->logical_col_block_size;              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring
3400      }                  bool add_EM_S=false;
3401    /* GENERATOR SNIP_PDEBC_SINGLE_PRE TOP */                  bool add_EM_F=false;
3402    const double w0 = -0.31100423396407310779*h1/pow(h0,2);                  vector<double> EM_S(4*4, 0);
3403    const double w1 = -0.39433756729740644113/h0;                  vector<double> EM_F(4, 0);
3404    const double w10 = 0.083333333333333333333*h1/pow(h0,2);  #pragma omp for nowait
3405    const double w11 = -0.5/h1;                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3406    const double w12 = -0.33333333333333333333*h1/pow(h0,2);                      const index_t e = k1;
3407    const double w13 = -0.5/h0;                      /* GENERATOR SNIP_PDEBC_SINGLE_0 TOP */
3408    const double w14 = -0.16666666666666666667*h1/pow(h0,2);                      /* GENERATOR SNIP_PDEBC_SINGLE_0 BOTTOM */
3409    const double w15 = 0.5/h0;                  }
3410    const double w16 = 0.33333333333333333333*h1/pow(h0,2);                  // ADD EM_F  and EM_S
3411    const double w17 = 1.0/h1;              } // end colouring
   const double w18 = 0.16666666666666666667*h1/pow(h0,2);  
   const double w19 = -1.0/h1;  
   const double w2 = -0.022329099369260225539*h1/pow(h0,2);  
   const double w20 = 0.083333333333333333333*h1/h0;  
   const double w21 = 0.022329099369260225539*h1/h0;  
   const double w22 = 0.31100423396407310779*h1/h0;  
   const double w23 = -0.31100423396407310779*h1/h0;  
   const double w24 = -0.39433756729740643311;  
   const double w25 = -0.022329099369260225539*h1/h0;  
   const double w26 = -0.10566243270259356689;  
   const double w27 = -0.083333333333333333333*h1/h0;  
   const double w28 = 0.39433756729740643311;  
   const double w29 = 0.10566243270259356689;  
   const double w3 = -0.10566243270259355887/h0;  
   const double w30 = 0.16666666666666666667*h1/h0;  
   const double w31 = 0.33333333333333333333*h1/h0;  
   const double w32 = -0.33333333333333333333*h1/h0;  
   const double w33 = -0.50000000000000000000;  
   const double w34 = -0.16666666666666666667*h1/h0;  
   const double w35 = 0.50000000000000000000;  
   const double w36 = 0.31100423396407310779*h1;  
   const double w37 = 0.022329099369260225539*h1;  
   const double w38 = 0.083333333333333333333*h1;  
   const double w39 = 0.33333333333333333333*h1;  
   const double w4 = -0.083333333333333333333*h1/pow(h0,2);  
   const double w40 = 0.16666666666666666667*h1;  
   const double w41 = -0.39433756729740644113*h1/h0;  
   const double w42 = -0.10566243270259355887*h1/h0;  
   const double w43 = 0.39433756729740644113*h1/h0;  
   const double w44 = 0.10566243270259355887*h1/h0;  
   const double w45 = -0.5*h1/h0;  
   const double w46 = -1.0000000000000000000;  
   const double w47 = 0.5*h1/h0;  
   const double w48 = 1.0000000000000000000;  
   const double w49 = 0.39433756729740644113*h1;  
   const double w5 = 0.39433756729740644113/h0;  
   const double w50 = 0.10566243270259355887*h1;  
   const double w51 = 0.5*h1;  
   const double w52 = -0.5/h0;  
   const double w53 = 0.10566243270259355887/h1;  
   const double w54 = -0.39433756729740644113/h1;  
   const double w55 = 0.083333333333333333333*h0/pow(h1,2);  
   const double w56 = 0.39433756729740644113/h1;  
   const double w57 = -0.10566243270259355887/h1;  
   const double w58 = -0.083333333333333333333*h0/pow(h1,2);  
   const double w59 = 0.5/h0;  
   const double w6 = 0.10566243270259355887/h0;  
   const double w60 = 0.31100423396407310779*h0/pow(h1,2);  
   const double w61 = 0.022329099369260225539*h0/pow(h1,2);  
   const double w62 = -0.022329099369260225539*h0/pow(h1,2);  
   const double w63 = -0.31100423396407310779*h0/pow(h1,2);  
   const double w64 = -1.0/h0;  
   const double w65 = 0.5/h1;  
   const double w66 = -0.5/h1;  
   const double w67 = 0.16666666666666666667*h0/pow(h1,2);  
   const double w68 = -0.16666666666666666667*h0/pow(h1,2);  
   const double w69 = 1.0/h0;  
   const double w7 = 0.31100423396407310779*h1/pow(h0,2);  
   const double w70 = 0.33333333333333333333*h0/pow(h1,2);  
   const double w71 = -0.33333333333333333333*h0/pow(h1,2);  
   const double w72 = -0.083333333333333333333*h0/h1;  
   const double w73 = -0.31100423396407310779*h0/h1;  
   const double w74 = -0.022329099369260225539*h0/h1;  
   const double w75 = 0.083333333333333333333*h0/h1;  
   const double w76 = 0.022329099369260225539*h0/h1;  
   const double w77 = 0.31100423396407310779*h0/h1;  
   const double w78 = -0.16666666666666666667*h0/h1;  
   const double w79 = -0.33333333333333333333*h0/h1;  
   const double w8 = 0.5/h1;  
   const double w80 = 0.16666666666666666667*h0/h1;  
   const double w81 = 0.33333333333333333333*h0/h1;  
   const double w82 = 0.083333333333333333333*h0;  
   const double w83 = 0.31100423396407310779*h0;  
   const double w84 = 0.022329099369260225539*h0;  
   const double w85 = 0.16666666666666666667*h0;  
   const double w86 = 0.33333333333333333333*h0;  
   const double w87 = -0.39433756729740644113*h0/h1;  
   const double w88 = -0.10566243270259355887*h0/h1;  
   const double w89 = 0.39433756729740644113*h0/h1;  
   const double w9 = 0.022329099369260225539*h1/pow(h0,2);  
   const double w90 = 0.10566243270259355887*h0/h1;  
   const double w91 = -0.5*h0/h1;  
   const double w92 = 0.5*h0/h1;  
   const double w93 = 0.39433756729740644113*h0;  
   const double w94 = 0.10566243270259355887*h0;  
   const double w95 = 0.5*h0;  
   /* GENERATOR SNIP_PDEBC_SINGLE_PRE BOTTOM */  
   #pragma omp parallel  
         {  
             if (m_faceOffset[0] > -1) {  
             for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring  
 #pragma omp for nowait  
                     for (index_t k1=k1_0; k1<m_NE1; k1+=2) {  
               /* GENERATOR SNIP_PDEBC_SINGLE_0 TOP */  
         ///////////////  
         // process A //  
         ///////////////  
         if (!A.isEmpty()) {  
             add_EM_S=true;  
             const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
             if (A.actsExpanded()) {  
                 const register double A_00_0 = A_p[INDEX3(0,0,0,2,2)];  
                 const register double A_01_0 = A_p[INDEX3(0,1,0,2,2)];  
                 const register double A_10_0 = A_p[INDEX3(1,0,0,2,2)];  
                 const register double A_11_0 = A_p[INDEX3(1,1,0,2,2)];  
                 const register double A_00_1 = A_p[INDEX3(0,0,1,2,2)];  
                 const register double A_01_1 = A_p[INDEX3(0,1,1,2,2)];  
                 const register double A_10_1 = A_p[INDEX3(1,0,1,2,2)];  
                 const register double A_11_1 = A_p[INDEX3(1,1,1,2,2)];  
                 const register double tmp1_0 = A_11_0 + A_11_1;  
                 const register double tmp2_0 = A_01_1 + A_10_1;  
                 const register double tmp0_0 = A_00_0 + A_00_1;  
                 const register double tmp3_0 = A_01_0 + A_10_0;  
                 const register double tmp7_1 = A_00_1*w0;  
                 const register double tmp16_1 = A_00_0*w9;  
                 const register double tmp23_1 = A_01_0*w1;  
                 const register double tmp4_1 = A_01_1*w6;  
                 const register double tmp13_1 = tmp2_0*w6;  
                 const register double tmp30_1 = A_10_0*w3;  
                 const register double tmp2_1 = A_10_0*w1;  
                 const register double tmp14_1 = A_00_0*w7;  
                 const register double tmp5_1 = tmp0_0*w4;  
                 const register double tmp15_1 = tmp3_0*w5;  
                 const register double tmp22_1 = A_10_0*w5;  
                 const register double tmp10_1 = A_00_0*w2;  
                 const register double tmp20_1 = tmp0_0*w10;  
                 const register double tmp29_1 = tmp2_0*w1;  
                 const register double tmp0_1 = A_10_1*w3;  
                 const register double tmp31_1 = A_10_1*w1;  
                 const register double tmp11_1 = tmp1_0*w8;  
                 const register double tmp21_1 = A_10_1*w6;  
                 const register double tmp9_1 = A_01_1*w5;  
                 const register double tmp12_1 = A_00_1*w9;  
                 const register double tmp27_1 = A_10_1*w5;  
                 const register double tmp6_1 = A_01_0*w5;  
                 const register double tmp8_1 = A_01_0*w6;  
                 const register double tmp1_1 = A_00_0*w0;  
                 const register double tmp3_1 = A_00_1*w2;  
                 const register double tmp19_1 = A_01_1*w1;  
                 const register double tmp25_1 = A_01_1*w3;  
                 const register double tmp18_1 = A_01_0*w3;  
                 const register double tmp24_1 = tmp1_0*w11;  
                 const register double tmp26_1 = A_10_0*w6;  
                 const register double tmp17_1 = A_00_1*w7;  
                 const register double tmp28_1 = tmp3_0*w3;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                 EM_S[INDEX2(1,2,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp10_1 + tmp7_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp11_1 + tmp12_1 + tmp13_1 + tmp14_1 + tmp15_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp16_1 + tmp17_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp18_1 + tmp19_1 + tmp5_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp20_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp21_1 + tmp22_1 + tmp5_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp20_1 + tmp23_1 + tmp24_1 + tmp25_1 + tmp26_1 + tmp27_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp0_1 + tmp20_1 + tmp24_1 + tmp2_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp20_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp10_1 + tmp26_1 + tmp27_1 + tmp7_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp11_1 + tmp16_1 + tmp17_1 + tmp28_1 + tmp29_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp23_1 + tmp25_1 + tmp3_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp30_1 + tmp31_1 + tmp5_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp12_1 + tmp14_1;  
             } else { /* constant data */  
                 const register double A_00 = A_p[INDEX2(0,0,2)];  
                 const register double A_01 = A_p[INDEX2(0,1,2)];  
                 const register double A_10 = A_p[INDEX2(1,0,2)];  
                 const register double A_11 = A_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = A_01 + A_10;  
                 const register double tmp5_1 = A_11*w17;  
                 const register double tmp8_1 = A_00*w18;  
                 const register double tmp0_1 = A_10*w13;  
                 const register double tmp11_1 = tmp0_0*w13;  
                 const register double tmp3_1 = A_01*w15;  
                 const register double tmp10_1 = A_11*w19;  
                 const register double tmp4_1 = A_00*w16;  
                 const register double tmp2_1 = A_00*w14;  
                 const register double tmp6_1 = tmp0_0*w15;  
                 const register double tmp1_1 = A_00*w12;  
                 const register double tmp7_1 = A_01*w13;  
                 const register double tmp9_1 = A_10*w15;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                 EM_S[INDEX2(1,2,4)]+=tmp2_1 + tmp3_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp3_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp4_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp2_1 + tmp7_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp8_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp2_1 + tmp9_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp10_1 + tmp7_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp0_1 + tmp10_1 + tmp3_1 + tmp8_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp8_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp1_1 + tmp9_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp11_1 + tmp4_1 + tmp5_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp7_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp0_1 + tmp2_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp4_1;  
             }  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             if (B.actsExpanded()) {  
                 const register double B_0_0 = B_p[INDEX2(0,0,2)];  
                 const register double B_1_0 = B_p[INDEX2(1,0,2)];  
                 const register double B_0_1 = B_p[INDEX2(0,1,2)];  
                 const register double B_1_1 = B_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = B_0_0 + B_0_1;  
                 const register double tmp7_1 = tmp0_0*w27;  
                 const register double tmp5_1 = B_1_0*w24;  
                 const register double tmp8_1 = B_1_0*w26;  
                 const register double tmp11_1 = B_1_0*w28;  
                 const register double tmp10_1 = B_1_1*w29;  
                 const register double tmp15_1 = B_0_1*w23;  
                 const register double tmp0_1 = tmp0_0*w20;  
                 const register double tmp4_1 = B_0_1*w25;  
                 const register double tmp9_1 = B_1_1*w24;  
                 const register double tmp16_1 = B_0_0*w22;  
                 const register double tmp3_1 = B_1_1*w26;  
                 const register double tmp13_1 = B_1_1*w28;  
                 const register double tmp12_1 = B_1_0*w29;  
                 const register double tmp1_1 = B_0_1*w22;  
                 const register double tmp17_1 = B_0_1*w21;  
                 const register double tmp6_1 = B_0_0*w23;  
                 const register double tmp2_1 = B_0_0*w21;  
                 const register double tmp14_1 = B_0_0*w25;  
                 EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp2_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp0_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp10_1 + tmp11_1 + tmp7_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp12_1 + tmp13_1 + tmp14_1 + tmp15_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp16_1 + tmp17_1;  
             } else { /* constant data */  
                 const register double B_0 = B_p[0];  
                 const register double B_1 = B_p[1];  
                 const register double tmp5_1 = B_1*w35;  
                 const register double tmp1_1 = B_0*w31;  
                 const register double tmp3_1 = B_1*w33;  
                 const register double tmp0_1 = B_0*w30;  
                 const register double tmp2_1 = B_0*w32;  
                 const register double tmp4_1 = B_0*w34;  
                 EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp1_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp2_1 + tmp3_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp0_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp3_1 + tmp4_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp4_1 + tmp5_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp2_1 + tmp5_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp1_1;  
             }  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             if (C.actsExpanded()) {  
                 const register double C_0_0 = C_p[INDEX2(0,0,2)];  
                 const register double C_1_0 = C_p[INDEX2(1,0,2)];  
                 const register double C_0_1 = C_p[INDEX2(0,1,2)];  
                 const register double C_1_1 = C_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = C_0_0 + C_0_1;  
                 const register double tmp14_1 = C_1_0*w29;  
                 const register double tmp9_1 = tmp0_0*w27;  
                 const register double tmp11_1 = C_1_1*w24;  
                 const register double tmp2_1 = C_1_1*w26;  
                 const register double tmp15_1 = C_1_1*w28;  
                 const register double tmp12_1 = C_0_1*w22;  
                 const register double tmp0_1 = C_0_0*w22;  
                 const register double tmp6_1 = tmp0_0*w20;  
                 const register double tmp17_1 = C_0_1*w23;  
                 const register double tmp3_1 = C_0_1*w25;  
                 const register double tmp16_1 = C_0_0*w25;  
                 const register double tmp4_1 = C_1_0*w24;  
                 const register double tmp10_1 = C_1_0*w26;  
                 const register double tmp8_1 = C_1_0*w28;  
                 const register double tmp7_1 = C_1_1*w29;  
                 const register double tmp5_1 = C_0_0*w23;  
                 const register double tmp1_1 = C_0_1*w21;  
                 const register double tmp13_1 = C_0_0*w21;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp2_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp6_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp10_1 + tmp11_1 + tmp9_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp12_1 + tmp13_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp6_1;  
             } else { /* constant data */  
                 const register double C_0 = C_p[0];  
                 const register double C_1 = C_p[1];  
                 const register double tmp3_1 = C_0*w30;  
                 const register double tmp1_1 = C_0*w32;  
                 const register double tmp5_1 = C_0*w34;  
                 const register double tmp2_1 = C_1*w33;  
                 const register double tmp4_1 = C_1*w35;  
                 const register double tmp0_1 = C_0*w31;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp1_1 + tmp2_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp3_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp4_1 + tmp5_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp2_1 + tmp5_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp0_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp1_1 + tmp4_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp3_1;  
             }  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             if (D.actsExpanded()) {  
                 const register double D_0 = D_p[0];  
                 const register double D_1 = D_p[1];  
                 const register double tmp0_0 = D_0 + D_1;  
                 const register double tmp1_1 = D_1*w37;  
                 const register double tmp4_1 = D_0*w37;  
                 const register double tmp0_1 = D_0*w36;  
                 const register double tmp3_1 = D_1*w36;  
                 const register double tmp2_1 = tmp0_0*w38;  
                 EM_S[INDEX2(0,0,4)]+=tmp0_1 + tmp1_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp2_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp2_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp3_1 + tmp4_1;  
             } else { /* constant data */  
                 const register double D_0 = D_p[0];  
                 const register double tmp0_1 = D_0*w39;  
                 const register double tmp1_1 = D_0*w40;  
                 EM_S[INDEX2(0,0,4)]+=tmp0_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp1_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp1_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp0_1;  
             }  
         }  
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             if (X.actsExpanded()) {  
                 const register double X_0_0 = X_p[INDEX2(0,0,2)];  
                 const register double X_1_0 = X_p[INDEX2(1,0,2)];  
                 const register double X_0_1 = X_p[INDEX2(0,1,2)];  
                 const register double X_1_1 = X_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = X_1_0 + X_1_1;  
                 const register double tmp3_1 = X_0_1*w44;  
                 const register double tmp1_1 = X_0_1*w42;  
                 const register double tmp8_1 = X_0_0*w44;  
                 const register double tmp4_1 = X_0_0*w43;  
                 const register double tmp7_1 = X_0_0*w42;  
                 const register double tmp5_1 = tmp0_0*w35;  
                 const register double tmp0_1 = X_0_0*w41;  
                 const register double tmp9_1 = X_0_1*w43;  
                 const register double tmp2_1 = tmp0_0*w33;  
                 const register double tmp6_1 = X_0_1*w41;  
                 EM_F[0]+=tmp0_1 + tmp1_1 + tmp2_1;  
                 EM_F[1]+=tmp3_1 + tmp4_1;  
                 EM_F[2]+=tmp5_1 + tmp6_1 + tmp7_1;  
                 EM_F[3]+=tmp8_1 + tmp9_1;  
             } else { /* constant data */  
                 const register double X_0 = X_p[0];  
                 const register double X_1 = X_p[1];  
                 const register double tmp2_1 = X_0*w47;  
                 const register double tmp1_1 = X_0*w45;  
                 const register double tmp3_1 = X_1*w48;  
                 const register double tmp0_1 = X_1*w46;  
                 EM_F[0]+=tmp0_1 + tmp1_1;  
                 EM_F[1]+=tmp2_1;  
                 EM_F[2]+=tmp1_1 + tmp3_1;  
                 EM_F[3]+=tmp2_1;  
             }  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             if (Y.actsExpanded()) {  
                 const register double Y_0 = Y_p[0];  
                 const register double Y_1 = Y_p[1];  
                 const register double tmp0_1 = Y_0*w49;  
                 const register double tmp1_1 = Y_1*w50;  
                 const register double tmp3_1 = Y_0*w50;  
                 const register double tmp2_1 = Y_1*w49;  
                 EM_F[0]+=tmp0_1 + tmp1_1;  
                 EM_F[2]+=tmp2_1 + tmp3_1;  
             } else { /* constant data */  
                 const register double Y_0 = Y_p[0];  
                 const register double tmp0_1 = Y_0*w51;  
                 EM_F[0]+=tmp0_1;  
                 EM_F[2]+=tmp0_1;  
             }  
3412          }          }
                       /* GENERATOR SNIP_PDEBC_SINGLE_0 BOTTOM */  
                     }  
                     // ADD EM_F  and EM_S  
         } // end colouring  
             }  
3413    
3414              if (m_faceOffset[1] > -1) {          if (m_faceOffset[1] > -1) {
3415              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring                          for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring            
3416  #pragma omp for nowait                  bool add_EM_S=false;
3417                      for (index_t k1=k1_0; k1<m_NE1; k1+=2) {                  bool add_EM_F=false;
3418                /* GENERATOR SNIP_PDEBC_SINGLE_1 TOP */                  vector<double> EM_S(4*4, 0);
3419          ///////////////                  vector<double> EM_F(4, 0);
3420          // process A //  #pragma omp for nowait
3421          ///////////////                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3422          if (!A.isEmpty()) {                      const index_t e = m_faceOffset[1]+k1;
3423              add_EM_S=true;                      /* GENERATOR SNIP_PDEBC_SINGLE_1 TOP */
3424              const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);                      /* GENERATOR SNIP_PDEBC_SINGLE_1 BOTTOM */
3425              if (A.actsExpanded()) {                  }
3426                  const register double A_00_0 = A_p[INDEX3(0,0,0,2,2)];                  // ADD EM_F  and EM_S
3427                  const register double A_01_0 = A_p[INDEX3(0,1,0,2,2)];              } // end colouring
                 const register double A_10_0 = A_p[INDEX3(1,0,0,2,2)];  
                 const register double A_11_0 = A_p[INDEX3(1,1,0,2,2)];  
                 const register double A_00_1 = A_p[INDEX3(0,0,1,2,2)];  
                 const register double A_01_1 = A_p[INDEX3(0,1,1,2,2)];  
                 const register double A_10_1 = A_p[INDEX3(1,0,1,2,2)];  
                 const register double A_11_1 = A_p[INDEX3(1,1,1,2,2)];  
                 const register double tmp1_0 = A_11_0 + A_11_1;  
                 const register double tmp3_0 = A_01_1 + A_10_1;  
                 const register double tmp0_0 = A_00_0 + A_00_1;  
                 const register double tmp2_0 = A_01_0 + A_10_0;  
                 const register double tmp8_1 = A_00_1*w0;  
                 const register double tmp14_1 = A_00_0*w9;  
                 const register double tmp29_1 = A_01_0*w1;  
                 const register double tmp1_1 = A_01_1*w6;  
                 const register double tmp15_1 = tmp2_0*w6;  
                 const register double tmp7_1 = A_10_0*w3;  
                 const register double tmp19_1 = A_10_0*w1;  
                 const register double tmp12_1 = A_00_0*w7;  
                 const register double tmp5_1 = tmp0_0*w4;  
                 const register double tmp17_1 = tmp3_0*w5;  
                 const register double tmp25_1 = A_10_0*w5;  
                 const register double tmp10_1 = A_00_0*w2;  
                 const register double tmp23_1 = tmp0_0*w10;  
                 const register double tmp31_1 = tmp2_0*w1;  
                 const register double tmp18_1 = A_10_1*w3;  
                 const register double tmp9_1 = A_10_1*w1;  
                 const register double tmp13_1 = tmp1_0*w8;  
                 const register double tmp24_1 = A_10_1*w6;  
                 const register double tmp27_1 = A_01_1*w5;  
                 const register double tmp11_1 = A_00_1*w9;  
                 const register double tmp6_1 = A_10_1*w5;  
                 const register double tmp2_1 = A_01_0*w5;  
                 const register double tmp26_1 = A_01_0*w6;  
                 const register double tmp0_1 = A_00_0*w0;  
                 const register double tmp3_1 = A_00_1*w2;  
                 const register double tmp20_1 = A_01_1*w1;  
                 const register double tmp28_1 = A_01_1*w3;  
                 const register double tmp22_1 = A_01_0*w3;  
                 const register double tmp21_1 = tmp1_0*w11;  
                 const register double tmp4_1 = A_10_0*w6;  
                 const register double tmp16_1 = A_00_1*w7;  
                 const register double tmp30_1 = tmp3_0*w3;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                 EM_S[INDEX2(1,2,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp10_1 + tmp7_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp11_1 + tmp12_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp13_1 + tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp18_1 + tmp19_1 + tmp5_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp20_1 + tmp21_1 + tmp22_1 + tmp23_1 + tmp24_1 + tmp25_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp26_1 + tmp27_1 + tmp5_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp23_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp23_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp1_1 + tmp21_1 + tmp23_1 + tmp2_1 + tmp7_1 + tmp9_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp10_1 + tmp20_1 + tmp22_1 + tmp8_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp14_1 + tmp16_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp24_1 + tmp25_1 + tmp3_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp28_1 + tmp29_1 + tmp5_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp11_1 + tmp12_1 + tmp13_1 + tmp30_1 + tmp31_1;  
             } else { /* constant data */  
                 const register double A_00 = A_p[INDEX2(0,0,2)];  
                 const register double A_01 = A_p[INDEX2(0,1,2)];  
                 const register double A_10 = A_p[INDEX2(1,0,2)];  
                 const register double A_11 = A_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = A_01 + A_10;  
                 const register double tmp6_1 = A_11*w17;  
                 const register double tmp9_1 = A_00*w18;  
                 const register double tmp4_1 = A_10*w13;  
                 const register double tmp11_1 = tmp0_0*w13;  
                 const register double tmp0_1 = A_01*w15;  
                 const register double tmp10_1 = A_11*w19;  
                 const register double tmp5_1 = A_00*w16;  
                 const register double tmp2_1 = A_00*w14;  
                 const register double tmp7_1 = tmp0_0*w15;  
                 const register double tmp1_1 = A_00*w12;  
                 const register double tmp8_1 = A_01*w13;  
                 const register double tmp3_1 = A_10*w15;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                 EM_S[INDEX2(1,2,4)]+=tmp2_1 + tmp3_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp4_1;  
                 EM_S[INDEX2(0,0,4)]+=tmp5_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp5_1 + tmp6_1 + tmp7_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp2_1 + tmp4_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp10_1 + tmp3_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp0_1 + tmp2_1;  
                 EM_S[INDEX2(0,2,4)]+=tmp9_1;  
                 EM_S[INDEX2(2,0,4)]+=tmp9_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp0_1 + tmp10_1 + tmp4_1 + tmp9_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp1_1 + tmp8_1;  
                 EM_S[INDEX2(2,2,4)]+=tmp5_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp3_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp2_1 + tmp8_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp11_1 + tmp5_1 + tmp6_1;  
             }  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             if (B.actsExpanded()) {  
                 const register double B_0_0 = B_p[INDEX2(0,0,2)];  
                 const register double B_1_0 = B_p[INDEX2(1,0,2)];  
                 const register double B_0_1 = B_p[INDEX2(0,1,2)];  
                 const register double B_1_1 = B_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = B_0_0 + B_0_1;  
                 const register double tmp9_1 = tmp0_0*w27;  
                 const register double tmp17_1 = B_1_0*w24;  
                 const register double tmp10_1 = B_1_0*w26;  
                 const register double tmp8_1 = B_1_0*w28;  
                 const register double tmp6_1 = B_1_1*w29;  
                 const register double tmp13_1 = B_0_1*w23;  
                 const register double tmp7_1 = tmp0_0*w20;  
                 const register double tmp0_1 = B_0_1*w25;  
                 const register double tmp11_1 = B_1_1*w24;  
                 const register double tmp14_1 = B_0_0*w22;  
                 const register double tmp16_1 = B_1_1*w26;  
                 const register double tmp4_1 = B_1_1*w28;  
                 const register double tmp5_1 = B_1_0*w29;  
                 const register double tmp3_1 = B_0_0*w21;  
                 const register double tmp15_1 = B_0_1*w21;  
                 const register double tmp1_1 = B_0_0*w23;  
                 const register double tmp2_1 = B_0_1*w22;  
                 const register double tmp12_1 = B_0_0*w25;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp2_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp6_1 + tmp7_1 + tmp8_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp9_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp10_1 + tmp11_1 + tmp7_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp12_1 + tmp13_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp9_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
             } else { /* constant data */  
                 const register double B_0 = B_p[0];  
                 const register double B_1 = B_p[1];  
                 const register double tmp1_1 = B_1*w35;  
                 const register double tmp2_1 = B_0*w31;  
                 const register double tmp5_1 = B_1*w33;  
                 const register double tmp3_1 = B_0*w30;  
                 const register double tmp0_1 = B_0*w32;  
                 const register double tmp4_1 = B_0*w34;  
                 EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp2_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp1_1 + tmp3_1;  
                 EM_S[INDEX2(2,1,4)]+=tmp4_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp3_1 + tmp5_1;  
                 EM_S[INDEX2(2,3,4)]+=tmp0_1;  
                 EM_S[INDEX2(0,3,4)]+=tmp4_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp2_1 + tmp5_1;  
             }  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             if (C.actsExpanded()) {  
                 const register double C_0_0 = C_p[INDEX2(0,0,2)];  
                 const register double C_1_0 = C_p[INDEX2(1,0,2)];  
                 const register double C_0_1 = C_p[INDEX2(0,1,2)];  
                 const register double C_1_1 = C_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = C_0_0 + C_0_1;  
                 const register double tmp7_1 = tmp0_0*w20;  
                 const register double tmp15_1 = C_0_1*w21;  
                 const register double tmp0_1 = tmp0_0*w27;  
                 const register double tmp9_1 = C_1_1*w24;  
                 const register double tmp16_1 = C_1_1*w26;  
                 const register double tmp5_1 = C_1_1*w28;  
                 const register double tmp3_1 = C_0_1*w22;  
                 const register double tmp6_1 = C_1_0*w29;  
                 const register double tmp11_1 = C_1_0*w28;  
                 const register double tmp2_1 = C_0_1*w23;  
                 const register double tmp12_1 = C_0_1*w25;  
                 const register double tmp17_1 = C_1_0*w24;  
                 const register double tmp8_1 = C_1_0*w26;  
                 const register double tmp4_1 = C_0_0*w21;  
                 const register double tmp10_1 = C_1_1*w29;  
                 const register double tmp13_1 = C_0_0*w23;  
                 const register double tmp1_1 = C_0_0*w25;  
                 const register double tmp14_1 = C_0_0*w22;  
                 EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp2_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp10_1 + tmp11_1 + tmp7_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp12_1 + tmp13_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
             } else { /* constant data */  
                 const register double C_0 = C_p[0];  
                 const register double C_1 = C_p[1];  
                 const register double tmp4_1 = C_0*w30;  
                 const register double tmp1_1 = C_0*w32;  
                 const register double tmp0_1 = C_0*w34;  
                 const register double tmp5_1 = C_1*w33;  
                 const register double tmp2_1 = C_1*w35;  
                 const register double tmp3_1 = C_0*w31;  
                 EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,2,4)]+=tmp1_1;  
                 EM_S[INDEX2(3,3,4)]+=tmp2_1 + tmp3_1;  
                 EM_S[INDEX2(3,0,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp4_1 + tmp5_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp2_1 + tmp4_1;  
                 EM_S[INDEX2(1,0,4)]+=tmp1_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp3_1 + tmp5_1;  
             }  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             if (D.actsExpanded()) {  
                 const register double D_0 = D_p[0];  
                 const register double D_1 = D_p[1];  
                 const register double tmp0_0 = D_0 + D_1;  
                 const register double tmp4_1 = D_1*w37;  
                 const register double tmp2_1 = tmp0_0*w38;  
                 const register double tmp1_1 = D_0*w37;  
                 const register double tmp3_1 = D_0*w36;  
                 const register double tmp0_1 = D_1*w36;  
                 EM_S[INDEX2(3,3,4)]+=tmp0_1 + tmp1_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp2_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp2_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp3_1 + tmp4_1;  
             } else { /* constant data */  
                 const register double D_0 = D_p[0];  
                 const register double tmp0_1 = D_0*w39;  
                 const register double tmp1_1 = D_0*w40;  
                 EM_S[INDEX2(3,3,4)]+=tmp0_1;  
                 EM_S[INDEX2(3,1,4)]+=tmp1_1;  
                 EM_S[INDEX2(1,3,4)]+=tmp1_1;  
                 EM_S[INDEX2(1,1,4)]+=tmp0_1;  
             }  
         }  
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             if (X.actsExpanded()) {  
                 const register double X_0_0 = X_p[INDEX2(0,0,2)];  
                 const register double X_1_0 = X_p[INDEX2(1,0,2)];  
                 const register double X_0_1 = X_p[INDEX2(0,1,2)];  
                 const register double X_1_1 = X_p[INDEX2(1,1,2)];  
                 const register double tmp0_0 = X_1_0 + X_1_1;  
                 const register double tmp2_1 = X_0_1*w44;  
                 const register double tmp1_1 = X_0_1*w42;  
                 const register double tmp7_1 = X_0_0*w44;  
                 const register double tmp3_1 = X_0_0*w43;  
                 const register double tmp6_1 = X_0_0*w42;  
                 const register double tmp8_1 = tmp0_0*w35;  
                 const register double tmp0_1 = X_0_0*w41;  
                 const register double tmp9_1 = X_0_1*w43;  
                 const register double tmp4_1 = tmp0_0*w33;  
                 const register double tmp5_1 = X_0_1*w41;  
                 EM_F[0]+=tmp0_1 + tmp1_1;  
                 EM_F[1]+=tmp2_1 + tmp3_1 + tmp4_1;  
                 EM_F[2]+=tmp5_1 + tmp6_1;  
                 EM_F[3]+=tmp7_1 + tmp8_1 + tmp9_1;  
             } else { /* constant data */  
                 const register double X_0 = X_p[0];  
                 const register double X_1 = X_p[1];  
                 const register double tmp1_1 = X_0*w47;  
                 const register double tmp0_1 = X_0*w45;  
                 const register double tmp3_1 = X_1*w48;  
                 const register double tmp2_1 = X_1*w46;  
                 EM_F[0]+=tmp0_1;  
                 EM_F[1]+=tmp1_1 + tmp2_1;  
                 EM_F[2]+=tmp0_1;  
                 EM_F[3]+=tmp1_1 + tmp3_1;  
             }  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             if (Y.actsExpanded()) {  
                 const register double Y_0 = Y_p[0];  
                 const register double Y_1 = Y_p[1];  
                 const register double tmp0_1 = Y_0*w49;  
                 const register double tmp1_1 = Y_1*w50;  
                 const register double tmp3_1 = Y_0*w50;  
                 const register double tmp2_1 = Y_1*w49;  
                 EM_F[1]+=tmp0_1 + tmp1_1;  
                 EM_F[3]+=tmp2_1 + tmp3_1;  
             } else { /* constant data */  
                 const register double Y_0 = Y_p[0];  
                 const register double tmp0_1 = Y_0*w51;  
                 EM_F[1]+=tmp0_1;  
                 EM_F[3]+=tmp0_1;  
             }  
3428          }          }
                       /* GENERATOR SNIP_PDEBC_SINGLE_1 BOTTOM */  
                     }  
                      // ADD EM_F  and EM_S  
                 } // end colouring  
             }  
3429    
3430              if (m_faceOffset[2] > -1) {          if (m_faceOffset[2] > -1) {
3431             for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3432                    bool add_EM_S=false;
3433                    bool add_EM_F=false;
3434                    vector<double> EM_S(4*4, 0);
3435                    vector<double> EM_F(4, 0);
3436  #pragma omp for nowait  #pragma omp for nowait
3437                    for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3438                        /* GENERATOR SNIP_PDEBC_SINGLE_2 TOP */                      const index_t e = m_faceOffset[2]+k0;
3439                        ///////////////                      /* GENERATOR SNIP_PDEBC_SINGLE_2 TOP */
3440                        // process A //                      /* GENERATOR SNIP_PDEBC_SINGLE_2 BOTTOM */
3441                        ///////////////                  }
3442                        if (!A.isEmpty()) {                  // ADD EM_F  and EM_S
3443                            add_EM_S=true;              } // end colouring
3444                            const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);          }
                           if (A.actsExpanded()) {  
                               const register double A_00_0 = A_p[INDEX3(0,0,0,2,2)];  
                               const register double A_01_0 = A_p[INDEX3(0,1,0,2,2)];  
                               const register double A_10_0 = A_p[INDEX3(1,0,0,2,2)];  
                               const register double A_11_0 = A_p[INDEX3(1,1,0,2,2)];  
                               const register double A_00_1 = A_p[INDEX3(0,0,1,2,2)];  
                               const register double A_01_1 = A_p[INDEX3(0,1,1,2,2)];  
                               const register double A_10_1 = A_p[INDEX3(1,0,1,2,2)];  
                               const register double A_11_1 = A_p[INDEX3(1,1,1,2,2)];  
                               const register double tmp1_0 = A_11_0 + A_11_1;  
                               const register double tmp2_0 = A_01_1 + A_10_1;  
                               const register double tmp0_0 = A_00_0 + A_00_1;  
                               const register double tmp3_0 = A_01_0 + A_10_0;  
                               const register double tmp27_1 = A_11_1*w62;  
                               const register double tmp23_1 = A_10_0*w56;  
                               const register double tmp15_1 = A_11_1*w60;  
                               const register double tmp4_1 = A_10_0*w54;  
                               const register double tmp12_1 = tmp0_0*w59;  
                               const register double tmp25_1 = A_01_0*w54;  
                               const register double tmp21_1 = A_10_1*w56;  
                               const register double tmp10_1 = tmp2_0*w53;  
                               const register double tmp16_1 = A_10_0*w57;  
                               const register double tmp18_1 = A_11_0*w62;  
                               const register double tmp11_1 = A_11_0*w60;  
                               const register double tmp8_1 = A_01_0*w56;  
                               const register double tmp6_1 = A_01_1*w53;  
                               const register double tmp20_1 = A_10_0*w53;  
                               const register double tmp0_1 = A_10_1*w57;  
                               const register double tmp19_1 = A_11_1*w63;  
                               const register double tmp5_1 = A_01_0*w53;  
                               const register double tmp9_1 = A_11_1*w61;  
                               const register double tmp1_1 = tmp0_0*w52;  
                               const register double tmp24_1 = A_01_1*w57;  
                               const register double tmp7_1 = tmp1_0*w58;  
                               const register double tmp17_1 = A_10_1*w54;  
                               const register double tmp29_1 = A_01_1*w54;  
                               const register double tmp3_1 = tmp1_0*w55;  
                               const register double tmp26_1 = A_11_0*w63;  
                               const register double tmp22_1 = A_10_1*w53;  
                               const register double tmp14_1 = A_11_0*w61;  
                               const register double tmp31_1 = tmp2_0*w54;  
                               const register double tmp30_1 = tmp3_0*w57;  
                               const register double tmp28_1 = A_01_0*w57;  
                               const register double tmp2_1 = A_01_1*w56;  
                               const register double tmp13_1 = tmp3_0*w56;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                               EM_S[INDEX2(1,2,4)]+=tmp6_1 + tmp7_1 + tmp8_1;  
                               EM_S[INDEX2(3,2,4)]+=tmp3_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp10_1 + tmp11_1 + tmp12_1 + tmp13_1 + tmp9_1;  
                               EM_S[INDEX2(3,3,4)]+=tmp14_1 + tmp15_1;  
                               EM_S[INDEX2(3,0,4)]+=tmp16_1 + tmp17_1 + tmp7_1;  
                               EM_S[INDEX2(3,1,4)]+=tmp18_1 + tmp19_1 + tmp20_1 + tmp21_1;  
                               EM_S[INDEX2(2,1,4)]+=tmp22_1 + tmp23_1 + tmp7_1;  
                               EM_S[INDEX2(0,2,4)]+=tmp24_1 + tmp25_1 + tmp26_1 + tmp27_1;  
                               EM_S[INDEX2(2,0,4)]+=tmp0_1 + tmp26_1 + tmp27_1 + tmp4_1;  
                               EM_S[INDEX2(1,3,4)]+=tmp18_1 + tmp19_1 + tmp2_1 + tmp5_1;  
                               EM_S[INDEX2(2,3,4)]+=tmp3_1;  
                               EM_S[INDEX2(2,2,4)]+=tmp11_1 + tmp9_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp20_1 + tmp21_1 + tmp24_1 + tmp25_1 + tmp3_1;  
                               EM_S[INDEX2(0,3,4)]+=tmp28_1 + tmp29_1 + tmp7_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp12_1 + tmp14_1 + tmp15_1 + tmp30_1 + tmp31_1;  
                           } else { /* constant data */  
                               const register double A_00 = A_p[INDEX2(0,0,2)];  
                               const register double A_01 = A_p[INDEX2(0,1,2)];  
                               const register double A_10 = A_p[INDEX2(1,0,2)];  
                               const register double A_11 = A_p[INDEX2(1,1,2)];  
                               const register double tmp0_0 = A_01 + A_10;  
                               const register double tmp0_1 = A_10*w66;  
                               const register double tmp11_1 = tmp0_0*w66;  
                               const register double tmp6_1 = A_00*w69;  
                               const register double tmp9_1 = A_10*w65;  
                               const register double tmp7_1 = A_11*w70;  
                               const register double tmp8_1 = A_11*w71;  
                               const register double tmp3_1 = A_11*w67;  
                               const register double tmp5_1 = tmp0_0*w65;  
                               const register double tmp2_1 = A_00*w64;  
                               const register double tmp4_1 = A_11*w68;  
                               const register double tmp10_1 = A_01*w66;  
                               const register double tmp1_1 = A_01*w65;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                               EM_S[INDEX2(1,2,4)]+=tmp1_1 + tmp4_1;  
                               EM_S[INDEX2(3,2,4)]+=tmp3_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp5_1 + tmp6_1 + tmp7_1;  
                               EM_S[INDEX2(3,3,4)]+=tmp7_1;  
                               EM_S[INDEX2(3,0,4)]+=tmp0_1 + tmp4_1;  
                               EM_S[INDEX2(3,1,4)]+=tmp8_1 + tmp9_1;  
                               EM_S[INDEX2(2,1,4)]+=tmp4_1 + tmp9_1;  
                               EM_S[INDEX2(0,2,4)]+=tmp10_1 + tmp8_1;  
                               EM_S[INDEX2(2,0,4)]+=tmp0_1 + tmp8_1;  
                               EM_S[INDEX2(1,3,4)]+=tmp1_1 + tmp8_1;  
                               EM_S[INDEX2(2,3,4)]+=tmp3_1;  
                               EM_S[INDEX2(2,2,4)]+=tmp7_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp10_1 + tmp2_1 + tmp3_1 + tmp9_1;  
                               EM_S[INDEX2(0,3,4)]+=tmp10_1 + tmp4_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp11_1 + tmp6_1 + tmp7_1;  
                           }  
                       }  
                       ///////////////  
                       // process B //  
                       ///////////////  
                       if (!B.isEmpty()) {  
                           add_EM_S=true;  
                           const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                           if (B.actsExpanded()) {  
                               const register double B_0_0 = B_p[INDEX2(0,0,2)];  
                               const register double B_1_0 = B_p[INDEX2(1,0,2)];  
                               const register double B_0_1 = B_p[INDEX2(0,1,2)];  
                               const register double B_1_1 = B_p[INDEX2(1,1,2)];  
                               const register double tmp0_0 = B_1_0 + B_1_1;  
                               const register double tmp15_1 = B_0_1*w28;  
                               const register double tmp14_1 = B_0_0*w29;  
                               const register double tmp9_1 = B_1_1*w77;  
                               const register double tmp8_1 = B_1_0*w76;  
                               const register double tmp16_1 = B_1_0*w74;  
                               const register double tmp7_1 = tmp0_0*w75;  
                               const register double tmp2_1 = B_0_1*w24;  
                               const register double tmp0_1 = tmp0_0*w72;  
                               const register double tmp5_1 = B_0_1*w26;  
                               const register double tmp17_1 = B_1_1*w73;  
                               const register double tmp3_1 = B_1_0*w73;  
                               const register double tmp13_1 = B_0_1*w29;  
                               const register double tmp11_1 = B_1_0*w77;  
                               const register double tmp10_1 = B_1_1*w76;  
                               const register double tmp4_1 = B_1_1*w74;  
                               const register double tmp6_1 = B_0_0*w24;  
                               const register double tmp1_1 = B_0_0*w26;  
                               const register double tmp12_1 = B_0_0*w28;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                               EM_S[INDEX2(3,0,4)]+=tmp7_1;  
                               EM_S[INDEX2(3,1,4)]+=tmp8_1 + tmp9_1;  
                               EM_S[INDEX2(2,1,4)]+=tmp7_1;  
                               EM_S[INDEX2(2,0,4)]+=tmp10_1 + tmp11_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp12_1 + tmp13_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                           } else { /* constant data */  
                               const register double B_0 = B_p[0];  
                               const register double B_1 = B_p[1];  
                               const register double tmp4_1 = B_1*w81;  
                               const register double tmp0_1 = B_0*w33;  
                               const register double tmp3_1 = B_1*w80;  
                               const register double tmp2_1 = B_1*w79;  
                               const register double tmp5_1 = B_0*w35;  
                               const register double tmp1_1 = B_1*w78;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp0_1 + tmp2_1;  
                               EM_S[INDEX2(3,0,4)]+=tmp3_1;  
                               EM_S[INDEX2(3,1,4)]+=tmp4_1;  
                               EM_S[INDEX2(2,1,4)]+=tmp3_1;  
                               EM_S[INDEX2(2,0,4)]+=tmp4_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp5_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp2_1 + tmp5_1;  
                           }  
                       }  
                       ///////////////  
                       // process C //  
                       ///////////////  
                       if (!C.isEmpty()) {  
                           add_EM_S=true;  
                           const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                           if (C.actsExpanded()) {  
                               const register double C_0_0 = C_p[INDEX2(0,0,2)];  
                               const register double C_1_0 = C_p[INDEX2(1,0,2)];  
                               const register double C_0_1 = C_p[INDEX2(0,1,2)];  
                               const register double C_1_1 = C_p[INDEX2(1,1,2)];  
                               const register double tmp0_0 = C_1_0 + C_1_1;  
                               const register double tmp1_1 = C_0_0*w28;  
                               const register double tmp14_1 = C_0_0*w29;  
                               const register double tmp9_1 = C_1_0*w77;  
                               const register double tmp8_1 = C_1_1*w76;  
                               const register double tmp5_1 = C_1_1*w74;  
                               const register double tmp3_1 = tmp0_0*w75;  
                               const register double tmp13_1 = C_0_1*w24;  
                               const register double tmp0_1 = tmp0_0*w72;  
                               const register double tmp4_1 = C_1_0*w73;  
                               const register double tmp17_1 = C_1_1*w73;  
                               const register double tmp2_1 = C_0_1*w29;  
                               const register double tmp11_1 = C_1_1*w77;  
                               const register double tmp10_1 = C_1_0*w76;  
                               const register double tmp16_1 = C_1_0*w74;  
                               const register double tmp6_1 = C_0_1*w26;  
                               const register double tmp15_1 = C_0_1*w28;  
                               const register double tmp7_1 = C_0_0*w24;  
                               const register double tmp12_1 = C_0_0*w26;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                               EM_S[INDEX2(1,2,4)]+=tmp3_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp4_1 + tmp5_1 + tmp6_1 + tmp7_1;  
                               EM_S[INDEX2(0,2,4)]+=tmp8_1 + tmp9_1;  
                               EM_S[INDEX2(1,3,4)]+=tmp10_1 + tmp11_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp12_1 + tmp13_1;  
                               EM_S[INDEX2(0,3,4)]+=tmp3_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                           } else { /* constant data */  
                               const register double C_0 = C_p[0];  
                               const register double C_1 = C_p[1];  
                               const register double tmp5_1 = C_1*w81;  
                               const register double tmp2_1 = C_1*w80;  
                               const register double tmp4_1 = C_0*w33;  
                               const register double tmp1_1 = C_1*w78;  
                               const register double tmp0_1 = C_0*w35;  
                               const register double tmp3_1 = C_1*w79;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                               EM_S[INDEX2(1,2,4)]+=tmp2_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp3_1 + tmp4_1;  
                               EM_S[INDEX2(0,2,4)]+=tmp5_1;  
                               EM_S[INDEX2(1,3,4)]+=tmp5_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp4_1;  
                               EM_S[INDEX2(0,3,4)]+=tmp2_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp0_1 + tmp3_1;  
                           }  
                       }  
                       ///////////////  
                       // process D //  
                       ///////////////  
                       if (!D.isEmpty()) {  
                           add_EM_S=true;  
                           const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                           if (D.actsExpanded()) {  
                               const register double D_0 = D_p[0];  
                               const register double D_1 = D_p[1];  
                               const register double tmp0_0 = D_0 + D_1;  
                               const register double tmp2_1 = D_1*w84;  
                               const register double tmp4_1 = D_0*w84;  
                               const register double tmp0_1 = tmp0_0*w82;  
                               const register double tmp1_1 = D_0*w83;  
                               const register double tmp3_1 = D_1*w83;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp1_1 + tmp2_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp0_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp3_1 + tmp4_1;  
                           } else { /* constant data */  
                               const register double D_0 = D_p[0];  
                               const register double tmp1_1 = D_0*w86;  
                               const register double tmp0_1 = D_0*w85;  
                               EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                               EM_S[INDEX2(0,0,4)]+=tmp1_1;  
                               EM_S[INDEX2(1,0,4)]+=tmp0_1;  
                               EM_S[INDEX2(1,1,4)]+=tmp1_1;  
                           }  
                       }  
                       ///////////////  
                       // process X //  
                       ///////////////  
                       if (!X.isEmpty()) {  
                           add_EM_F=true;  
                           const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                           if (X.actsExpanded()) {  
                               const register double X_0_0 = X_p[INDEX2(0,0,2)];  
                               const register double X_1_0 = X_p[INDEX2(1,0,2)];  
                               const register double X_0_1 = X_p[INDEX2(0,1,2)];  
                               const register double X_1_1 = X_p[INDEX2(1,1,2)];  
                               const register double tmp0_0 = X_0_0 + X_0_1;  
                               const register double tmp4_1 = X_1_0*w88;  
                               const register double tmp6_1 = X_1_1*w90;  
                               const register double tmp9_1 = X_1_1*w89;  
                               const register double tmp0_1 = X_1_1*w88;  
                               const register double tmp8_1 = X_1_0*w90;  
                               const register double tmp3_1 = tmp0_0*w35;  
                               const register double tmp5_1 = X_1_1*w87;  
                               const register double tmp7_1 = X_1_0*w89;  
                               const register double tmp2_1 = tmp0_0*w33;  
                               const register double tmp1_1 = X_1_0*w87;  
                               EM_F[0]+=tmp0_1 + tmp1_1 + tmp2_1;  
                               EM_F[1]+=tmp3_1 + tmp4_1 + tmp5_1;  
                               EM_F[2]+=tmp6_1 + tmp7_1;  
                               EM_F[3]+=tmp8_1 + tmp9_1;  
                           } else { /* constant data */  
                               const register double X_0 = X_p[0];  
                               const register double X_1 = X_p[1];  
                               const register double tmp0_1 = X_0*w46;  
                               const register double tmp3_1 = X_1*w92;  
                               const register double tmp2_1 = X_0*w48;  
                               const register double tmp1_1 = X_1*w91;  
                               EM_F[0]+=tmp0_1 + tmp1_1;  
                               EM_F[1]+=tmp1_1 + tmp2_1;  
                               EM_F[2]+=tmp3_1;  
                               EM_F[3]+=tmp3_1;  
                           }  
                       }  
                       ///////////////  
                       // process Y //  
                       ///////////////  
                       if (!Y.isEmpty()) {  
                           add_EM_F=true;  
                           const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                           if (Y.actsExpanded()) {  
                               const register double Y_0 = Y_p[0];  
                               const register double Y_1 = Y_p[1];  
                               const register double tmp0_1 = Y_0*w93;  
                               const register double tmp2_1 = Y_1*w93;  
                               const register double tmp1_1 = Y_1*w94;  
                               const register double tmp3_1 = Y_0*w94;  
                               EM_F[0]+=tmp0_1 + tmp1_1;  
                               EM_F[1]+=tmp2_1 + tmp3_1;  
                           } else { /* constant data */  
                               const register double Y_0 = Y_p[0];  
                               const register double tmp0_1 = Y_0*w95;  
                               EM_F[0]+=tmp0_1;  
                               EM_F[1]+=tmp0_1;  
                           }  
                       }  
                       /* GENERATOR SNIP_PDEBC_SINGLE_2 BOTTOM */  
                   }  
                   // ADD EM_F  and EM_S  
                } // end colouring  
             }  
3445    
3446              if (m_faceOffset[3] > -1) {          if (m_faceOffset[3] > -1) {
3447               for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3448                    bool add_EM_S=false;
3449                    bool add_EM_F=false;
3450                    vector<double> EM_S(4*4, 0);
3451                    vector<double> EM_F(4, 0);
3452  #pragma omp for nowait  #pragma omp for nowait
3453                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3454                         /* GENERATOR SNIP_PDEBC_SINGLE_3 TOP */                      const index_t e = m_faceOffset[3]+k0;
3455                         ///////////////                      /* GENERATOR SNIP_PDEBC_SINGLE_3 TOP */
3456                         // process A //                      /* GENERATOR SNIP_PDEBC_SINGLE_3 BOTTOM */
                        ///////////////  
                        if (!A.isEmpty()) {  
                            add_EM_S=true;  
                            const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
                            if (A.actsExpanded()) {  
                                const register double A_00_0 = A_p[INDEX3(0,0,0,2,2)];  
                                const register double A_01_0 = A_p[INDEX3(0,1,0,2,2)];  
                                const register double A_10_0 = A_p[INDEX3(1,0,0,2,2)];  
                                const register double A_11_0 = A_p[INDEX3(1,1,0,2,2)];  
                                const register double A_00_1 = A_p[INDEX3(0,0,1,2,2)];  
                                const register double A_01_1 = A_p[INDEX3(0,1,1,2,2)];  
                                const register double A_10_1 = A_p[INDEX3(1,0,1,2,2)];  
                                const register double A_11_1 = A_p[INDEX3(1,1,1,2,2)];  
                                const register double tmp0_0 = A_11_0 + A_11_1;  
                                const register double tmp3_0 = A_01_1 + A_10_1;  
                                const register double tmp1_0 = A_00_0 + A_00_1;  
                                const register double tmp2_0 = A_01_0 + A_10_0;  
                                const register double tmp24_1 = A_11_1*w62;  
                                const register double tmp27_1 = A_10_0*w56;  
                                const register double tmp11_1 = A_11_1*w60;  
                                const register double tmp31_1 = A_10_0*w54;  
                                const register double tmp16_1 = A_01_1*w57;  
                                const register double tmp3_1 = A_10_1*w56;  
                                const register double tmp12_1 = tmp2_0*w53;  
                                const register double tmp4_1 = A_10_0*w57;  
                                const register double tmp21_1 = A_11_0*w62;  
                                const register double tmp10_1 = A_11_0*w60;  
                                const register double tmp6_1 = A_01_0*w56;  
                                const register double tmp5_1 = tmp1_0*w52;  
                                const register double tmp14_1 = tmp1_0*w59;  
                                const register double tmp8_1 = A_01_1*w53;  
                                const register double tmp1_1 = A_10_0*w53;  
                                const register double tmp2_1 = tmp0_0*w58;  
                                const register double tmp30_1 = A_10_1*w57;  
                                const register double tmp20_1 = A_11_1*w63;  
                                const register double tmp22_1 = A_01_0*w53;  
                                const register double tmp9_1 = A_11_1*w61;  
                                const register double tmp17_1 = A_01_0*w54;  
                                const register double tmp7_1 = A_10_1*w54;  
                                const register double tmp19_1 = A_01_1*w54;  
                                const register double tmp25_1 = A_11_0*w63;  
                                const register double tmp26_1 = A_10_1*w53;  
                                const register double tmp13_1 = A_11_0*w61;  
                                const register double tmp23_1 = A_01_1*w56;  
                                const register double tmp29_1 = tmp2_0*w54;  
                                const register double tmp28_1 = tmp3_0*w57;  
                                const register double tmp18_1 = A_01_0*w57;  
                                const register double tmp0_1 = tmp0_0*w55;  
                                const register double tmp15_1 = tmp3_0*w56;  
                                EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                                EM_S[INDEX2(1,2,4)]+=tmp1_1 + tmp2_1 + tmp3_1;  
                                EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp4_1 + tmp5_1 + tmp6_1 + tmp7_1 + tmp8_1;  
                                EM_S[INDEX2(0,0,4)]+=tmp10_1 + tmp9_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp11_1 + tmp12_1 + tmp13_1 + tmp14_1 + tmp15_1;  
                                EM_S[INDEX2(3,0,4)]+=tmp16_1 + tmp17_1 + tmp2_1;  
                                EM_S[INDEX2(3,1,4)]+=tmp18_1 + tmp19_1 + tmp20_1 + tmp21_1;  
                                EM_S[INDEX2(2,1,4)]+=tmp22_1 + tmp23_1 + tmp2_1;  
                                EM_S[INDEX2(0,2,4)]+=tmp24_1 + tmp25_1 + tmp26_1 + tmp27_1;  
                                EM_S[INDEX2(2,0,4)]+=tmp24_1 + tmp25_1 + tmp6_1 + tmp8_1;  
                                EM_S[INDEX2(1,3,4)]+=tmp20_1 + tmp21_1 + tmp4_1 + tmp7_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp18_1 + tmp19_1 + tmp26_1 + tmp27_1 + tmp5_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp10_1 + tmp14_1 + tmp28_1 + tmp29_1 + tmp9_1;  
                                EM_S[INDEX2(1,0,4)]+=tmp0_1;  
                                EM_S[INDEX2(0,3,4)]+=tmp2_1 + tmp30_1 + tmp31_1;  
                                EM_S[INDEX2(1,1,4)]+=tmp11_1 + tmp13_1;  
                            } else { /* constant data */  
                                const register double A_00 = A_p[INDEX2(0,0,2)];  
                                const register double A_01 = A_p[INDEX2(0,1,2)];  
                                const register double A_10 = A_p[INDEX2(1,0,2)];  
                                const register double A_11 = A_p[INDEX2(1,1,2)];  
                                const register double tmp0_0 = A_01 + A_10;  
                                const register double tmp3_1 = A_10*w66;  
                                const register double tmp11_1 = tmp0_0*w66;  
                                const register double tmp6_1 = A_11*w70;  
                                const register double tmp1_1 = A_10*w65;  
                                const register double tmp8_1 = A_00*w69;  
                                const register double tmp10_1 = A_11*w71;  
                                const register double tmp0_1 = A_11*w67;  
                                const register double tmp7_1 = tmp0_0*w65;  
                                const register double tmp5_1 = A_00*w64;  
                                const register double tmp2_1 = A_11*w68;  
                                const register double tmp9_1 = A_01*w66;  
                                const register double tmp4_1 = A_01*w65;  
                                EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                                EM_S[INDEX2(1,2,4)]+=tmp1_1 + tmp2_1;  
                                EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                                EM_S[INDEX2(0,0,4)]+=tmp6_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp6_1 + tmp7_1 + tmp8_1;  
                                EM_S[INDEX2(3,0,4)]+=tmp2_1 + tmp9_1;  
                                EM_S[INDEX2(3,1,4)]+=tmp10_1 + tmp9_1;  
                                EM_S[INDEX2(2,1,4)]+=tmp2_1 + tmp4_1;  
                                EM_S[INDEX2(0,2,4)]+=tmp10_1 + tmp1_1;  
                                EM_S[INDEX2(2,0,4)]+=tmp10_1 + tmp4_1;  
                                EM_S[INDEX2(1,3,4)]+=tmp10_1 + tmp3_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp1_1 + tmp5_1 + tmp9_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp11_1 + tmp6_1 + tmp8_1;  
                                EM_S[INDEX2(1,0,4)]+=tmp0_1;  
                                EM_S[INDEX2(0,3,4)]+=tmp2_1 + tmp3_1;  
                                EM_S[INDEX2(1,1,4)]+=tmp6_1;  
                            }  
                        }  
                        ///////////////  
                        // process B //  
                        ///////////////  
                        if (!B.isEmpty()) {  
                            add_EM_S=true;  
                            const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                            if (B.actsExpanded()) {  
                                const register double B_0_0 = B_p[INDEX2(0,0,2)];  
                                const register double B_1_0 = B_p[INDEX2(1,0,2)];  
                                const register double B_0_1 = B_p[INDEX2(0,1,2)];  
                                const register double B_1_1 = B_p[INDEX2(1,1,2)];  
                                const register double tmp0_0 = B_1_0 + B_1_1;  
                                const register double tmp8_1 = B_1_0*w73;  
                                const register double tmp4_1 = B_0_0*w29;  
                                const register double tmp7_1 = B_1_1*w77;  
                                const register double tmp6_1 = B_1_0*w76;  
                                const register double tmp11_1 = B_1_0*w74;  
                                const register double tmp3_1 = tmp0_0*w75;  
                                const register double tmp13_1 = B_0_1*w24;  
                                const register double tmp0_1 = tmp0_0*w72;  
                                const register double tmp14_1 = B_0_1*w26;  
                                const register double tmp10_1 = B_1_1*w73;  
                                const register double tmp5_1 = B_0_1*w28;  
                                const register double tmp1_1 = B_0_1*w29;  
                                const register double tmp15_1 = B_1_0*w77;  
                                const register double tmp17_1 = B_1_1*w76;  
                                const register double tmp9_1 = B_1_1*w74;  
                                const register double tmp16_1 = B_0_0*w24;  
                                const register double tmp12_1 = B_0_0*w26;  
                                const register double tmp2_1 = B_0_0*w28;  
                                EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                                EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp2_1 + tmp3_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp4_1 + tmp5_1 + tmp6_1 + tmp7_1;  
                                EM_S[INDEX2(0,2,4)]+=tmp8_1 + tmp9_1;  
                                EM_S[INDEX2(1,3,4)]+=tmp10_1 + tmp11_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp12_1 + tmp13_1 + tmp3_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                                EM_S[INDEX2(0,3,4)]+=tmp0_1;  
                            } else { /* constant data */  
                                const register double B_0 = B_p[0];  
                                const register double B_1 = B_p[1];  
                                const register double tmp3_1 = B_1*w81;  
                                const register double tmp5_1 = B_0*w33;  
                                const register double tmp2_1 = B_1*w80;  
                                const register double tmp4_1 = B_1*w79;  
                                const register double tmp1_1 = B_0*w35;  
                                const register double tmp0_1 = B_1*w78;  
                                EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                                EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp2_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp3_1;  
                                EM_S[INDEX2(0,2,4)]+=tmp4_1;  
                                EM_S[INDEX2(1,3,4)]+=tmp4_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp2_1 + tmp5_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp3_1 + tmp5_1;  
                                EM_S[INDEX2(0,3,4)]+=tmp0_1;  
                            }  
                        }  
                        ///////////////  
                        // process C //  
                        ///////////////  
                        if (!C.isEmpty()) {  
                            add_EM_S=true;  
                            const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                            if (C.actsExpanded()) {  
                                const register double C_0_0 = C_p[INDEX2(0,0,2)];  
                                const register double C_1_0 = C_p[INDEX2(1,0,2)];  
                                const register double C_0_1 = C_p[INDEX2(0,1,2)];  
                                const register double C_1_1 = C_p[INDEX2(1,1,2)];  
                                const register double tmp0_0 = C_1_0 + C_1_1;  
                                const register double tmp13_1 = C_0_0*w28;  
                                const register double tmp3_1 = C_0_0*w29;  
                                const register double tmp15_1 = C_1_0*w77;  
                                const register double tmp17_1 = C_1_1*w76;  
                                const register double tmp11_1 = C_1_1*w74;  
                                const register double tmp0_1 = tmp0_0*w75;  
                                const register double tmp2_1 = C_0_1*w24;  
                                const register double tmp7_1 = tmp0_0*w72;  
                                const register double tmp4_1 = C_0_1*w28;  
                                const register double tmp8_1 = C_1_1*w73;  
                                const register double tmp12_1 = C_0_1*w29;  
                                const register double tmp6_1 = C_1_1*w77;  
                                const register double tmp5_1 = C_1_0*w76;  
                                const register double tmp9_1 = C_1_0*w74;  
                                const register double tmp14_1 = C_0_1*w26;  
                                const register double tmp10_1 = C_1_0*w73;  
                                const register double tmp16_1 = C_0_0*w24;  
                                const register double tmp1_1 = C_0_0*w26;  
                                EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                                EM_S[INDEX2(3,0,4)]+=tmp7_1;  
                                EM_S[INDEX2(3,1,4)]+=tmp8_1 + tmp9_1;  
                                EM_S[INDEX2(2,1,4)]+=tmp7_1;  
                                EM_S[INDEX2(2,0,4)]+=tmp10_1 + tmp11_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp12_1 + tmp13_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                            } else { /* constant data */  
                                const register double C_0 = C_p[0];  
                                const register double C_1 = C_p[1];  
                                const register double tmp3_1 = C_1*w81;  
                                const register double tmp0_1 = C_1*w80;  
                                const register double tmp4_1 = C_1*w78;  
                                const register double tmp1_1 = C_0*w33;  
                                const register double tmp2_1 = C_0*w35;  
                                const register double tmp5_1 = C_1*w79;  
                                EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp1_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp2_1 + tmp3_1;  
                                EM_S[INDEX2(3,0,4)]+=tmp4_1;  
                                EM_S[INDEX2(3,1,4)]+=tmp5_1;  
                                EM_S[INDEX2(2,1,4)]+=tmp4_1;  
                                EM_S[INDEX2(2,0,4)]+=tmp5_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp2_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp1_1 + tmp3_1;  
                            }  
                        }  
                        ///////////////  
                        // process D //  
                        ///////////////  
                        if (!D.isEmpty()) {  
                            add_EM_S=true;  
                            const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                            if (D.actsExpanded()) {  
                                const register double D_0 = D_p[0];  
                                const register double D_1 = D_p[1];  
                                const register double tmp0_0 = D_0 + D_1;  
                                const register double tmp4_1 = D_1*w84;  
                                const register double tmp2_1 = D_0*w84;  
                                const register double tmp0_1 = tmp0_0*w82;  
                                const register double tmp3_1 = D_0*w83;  
                                const register double tmp1_1 = D_1*w83;  
                                EM_S[INDEX2(3,2,4)]+=tmp0_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp2_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp0_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp3_1 + tmp4_1;  
                            } else { /* constant data */  
                                const register double D_0 = D_p[0];  
                                const register double tmp1_1 = D_0*w86;  
                                const register double tmp0_1 = D_0*w85;  
                                EM_S[INDEX2(3,2,4)]+=tmp0_1;  
                                EM_S[INDEX2(3,3,4)]+=tmp1_1;  
                                EM_S[INDEX2(2,3,4)]+=tmp0_1;  
                                EM_S[INDEX2(2,2,4)]+=tmp1_1;  
                            }  
                        }  
                        ///////////////  
                        // process X //  
                        ///////////////  
                        if (!X.isEmpty()) {  
                            add_EM_F=true;  
                            const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                            if (X.actsExpanded()) {  
                                const register double X_0_0 = X_p[INDEX2(0,0,2)];  
                                const register double X_1_0 = X_p[INDEX2(1,0,2)];  
                                const register double X_0_1 = X_p[INDEX2(0,1,2)];  
                                const register double X_1_1 = X_p[INDEX2(1,1,2)];  
                                const register double tmp0_0 = X_0_0 + X_0_1;  
                                const register double tmp2_1 = X_1_0*w88;  
                                const register double tmp4_1 = X_1_1*w90;  
                                const register double tmp9_1 = X_1_1*w89;  
                                const register double tmp0_1 = X_1_1*w88;  
                                const register double tmp8_1 = X_1_0*w90;  
                                const register double tmp7_1 = tmp0_0*w35;  
                                const register double tmp3_1 = X_1_1*w87;  
                                const register double tmp6_1 = X_1_0*w89;  
                                const register double tmp5_1 = tmp0_0*w33;  
                                const register double tmp1_1 = X_1_0*w87;  
                                EM_F[0]+=tmp0_1 + tmp1_1;  
                                EM_F[1]+=tmp2_1 + tmp3_1;  
                                EM_F[2]+=tmp4_1 + tmp5_1 + tmp6_1;  
                                EM_F[3]+=tmp7_1 + tmp8_1 + tmp9_1;  
                            } else { /* constant data */  
                                const register double X_0 = X_p[0];  
                                const register double X_1 = X_p[1];  
                                const register double tmp1_1 = X_0*w46;  
                                const register double tmp2_1 = X_1*w92;  
                                const register double tmp3_1 = X_0*w48;  
                                const register double tmp0_1 = X_1*w91;  
                                EM_F[0]+=tmp0_1;  
                                EM_F[1]+=tmp0_1;  
                                EM_F[2]+=tmp1_1 + tmp2_1;  
                                EM_F[3]+=tmp2_1 + tmp3_1;  
                            }  
                        }  
                        ///////////////  
                        // process Y //  
                        ///////////////  
                        if (!Y.isEmpty()) {  
                            add_EM_F=true;  
                            const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                            if (Y.actsExpanded()) {  
                                const register double Y_0 = Y_p[0];  
                                const register double Y_1 = Y_p[1];  
                                const register double tmp0_1 = Y_0*w93;  
                                const register double tmp2_1 = Y_1*w93;  
                                const register double tmp1_1 = Y_1*w94;  
                                const register double tmp3_1 = Y_0*w94;  
                                EM_F[2]+=tmp0_1 + tmp1_1;  
                                EM_F[3]+=tmp2_1 + tmp3_1;  
                            } else { /* constant data */  
                                const register double Y_0 = Y_p[0];  
                                const register double tmp0_1 = Y_0*w95;  
                                EM_F[2]+=tmp0_1;  
                                EM_F[3]+=tmp0_1;  
                            }  
                        }  
                       /* GENERATOR SNIP_PDEBC_SINGLE_3 BOTTOM */  
3457                  }                  }
3458                  // ADD EM_F  and EM_S                  // ADD EM_F  and EM_S
3459                  } // end colouring              } // end colouring
3460              }          }
3461          } // end of parallel section      } // end of parallel section
           
3462  }  }
3463    
3464  //protected  //protected
3465  void Rectangle::assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,  void Rectangle::assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
3466          escript::Data& rhs, const escript::Data& A, const escript::Data& B,          escript::Data& rhs, const escript::Data& a, const escript::Data& b,
3467          const escript::Data& C, const escript::Data& D,          const escript::Data& c, const escript::Data& d,
3468          const escript::Data& X, const escript::Data& Y) const          const escript::Data& x, const escript::Data& y) const
3469  {  {
3470      const double h0 = m_l0/m_gNE0;      const double h0 = m_l0/m_gNE0;
3471      const double h1 = m_l1/m_gNE1;      const double h1 = m_l1/m_gNE1;
     dim_t numEq, numComp;  
     if (!mat)  
         numEq=numComp=(rhs.isEmpty() ? 1 : rhs.getDataPointSize());  
     else {  
         numEq=mat->logical_row_block_size;  
         numComp=mat->logical_col_block_size;  
     }  
3472      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_PRE TOP */      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_PRE TOP */
3473      const double w0 = -0.25*h1/pow(h0,2);      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_PRE BOTTOM */
3474      const double w1 = -0.5/h0;  #pragma omp parallel
3475      const double w10 = 0.25*h1;      {
3476      const double w11 = -0.5*h1/h0;          if (m_faceOffset[0] > -1) {
3477      const double w12 = -1.0000000000000000000;              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring
3478      const double w13 = 0.5*h1/h0;                  bool add_EM_S=false;
3479      const double w14 = 1.0000000000000000000;                  bool add_EM_F=false;
3480      const double w15 = 0.5*h1;                  vector<double> EM_S(4*4, 0);
3481      const double w16 = -1/h0;                  vector<double> EM_F(4, 0);
3482      const double w17 = 0.5/h1;  #pragma omp for nowait
3483      const double w18 = -0.5/h1;                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3484      const double w19 = 0.25*h0/pow(h1,2);                      const index_t e = k1;
3485      const double w2 = 0.5/h0;                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_0 TOP */
3486      const double w20 = -0.25*h0/pow(h1,2);                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_0 BOTTOM */
3487      const double w21 = 1.0/h0;                  }
3488      const double w22 = -0.25*h0/h1;                  // ADD EM_F  and EM_S
3489      const double w23 = 0.25*h0/h1;              } // end colouring
     const double w24 = 0.25*h0;  
     const double w25 = -0.5*h0/h1;  
     const double w26 = 0.5*h0/h1;  
     const double w27 = 0.5*h0;  
     const double w3 = 0.25*h1/pow(h0,2);  
     const double w4 = 1.0/h1;  
     const double w5 = -1/h1;  
     const double w6 = 0.25*h1/h0;  
     const double w7 = -0.25*h1/h0;  
     const double w8 = -0.50000000000000000000;  
     const double w9 = 0.50000000000000000000;  
   /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_PRE BOTTOM */  
   #pragma omp parallel  
         {  
             if (m_faceOffset[0] > -1) {  
             for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring  
 #pragma omp for nowait  
                     for (index_t k1=k1_0; k1<m_NE1; k1+=2) {  
               /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_0 TOP */  
         ///////////////  
         // process A //  
         ///////////////  
         if (!A.isEmpty()) {  
             add_EM_S=true;  
             const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
             const register double A_00 = A_p[INDEX2(0,0,2)];  
             const register double A_01 = A_p[INDEX2(0,1,2)];  
             const register double A_10 = A_p[INDEX2(1,0,2)];  
             const register double A_11 = A_p[INDEX2(1,1,2)];  
             const register double tmp0_0 = A_01 + A_10;  
             const register double tmp6_1 = A_01*w1;  
             const register double tmp5_1 = tmp0_0*w2;  
             const register double tmp7_1 = A_10*w2;  
             const register double tmp0_1 = A_00*w0;  
             const register double tmp9_1 = tmp0_0*w1;  
             const register double tmp8_1 = A_11*w5;  
             const register double tmp2_1 = A_01*w2;  
             const register double tmp4_1 = A_11*w4;  
             const register double tmp1_1 = A_10*w1;  
             const register double tmp3_1 = A_00*w3;  
             EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
             EM_S[INDEX2(1,2,4)]+=tmp0_1 + tmp2_1;  
             EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp2_1;  
             EM_S[INDEX2(0,0,4)]+=tmp3_1 + tmp4_1 + tmp5_1;  
             EM_S[INDEX2(3,3,4)]+=tmp3_1;  
             EM_S[INDEX2(3,0,4)]+=tmp0_1 + tmp6_1;  
             EM_S[INDEX2(3,1,4)]+=tmp3_1;  
             EM_S[INDEX2(2,1,4)]+=tmp0_1 + tmp7_1;  
             EM_S[INDEX2(0,2,4)]+=tmp3_1 + tmp6_1 + tmp7_1 + tmp8_1;  
             EM_S[INDEX2(2,0,4)]+=tmp1_1 + tmp2_1 + tmp3_1 + tmp8_1;  
             EM_S[INDEX2(1,3,4)]+=tmp3_1;  
             EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp7_1;  
             EM_S[INDEX2(2,2,4)]+=tmp3_1 + tmp4_1 + tmp9_1;  
             EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp6_1;  
             EM_S[INDEX2(0,3,4)]+=tmp0_1 + tmp1_1;  
             EM_S[INDEX2(1,1,4)]+=tmp3_1;  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             const register double B_0 = B_p[0];  
             const register double B_1 = B_p[1];  
             const register double tmp2_1 = B_0*w7;  
             const register double tmp1_1 = B_1*w8;  
             const register double tmp0_1 = B_0*w6;  
             const register double tmp3_1 = B_1*w9;  
             EM_S[INDEX2(1,2,4)]+=tmp0_1;  
             EM_S[INDEX2(3,2,4)]+=tmp0_1;  
             EM_S[INDEX2(0,0,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(3,0,4)]+=tmp0_1;  
             EM_S[INDEX2(0,2,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(2,0,4)]+=tmp2_1 + tmp3_1;  
             EM_S[INDEX2(2,2,4)]+=tmp2_1 + tmp3_1;  
             EM_S[INDEX2(1,0,4)]+=tmp0_1;  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             const register double C_0 = C_p[0];  
             const register double C_1 = C_p[1];  
             const register double tmp1_1 = C_1*w8;  
             const register double tmp3_1 = C_1*w9;  
             const register double tmp0_1 = C_0*w6;  
             const register double tmp2_1 = C_0*w7;  
             EM_S[INDEX2(0,1,4)]+=tmp0_1;  
             EM_S[INDEX2(0,0,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(2,1,4)]+=tmp0_1;  
             EM_S[INDEX2(0,2,4)]+=tmp2_1 + tmp3_1;  
             EM_S[INDEX2(2,0,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(2,3,4)]+=tmp0_1;  
             EM_S[INDEX2(2,2,4)]+=tmp2_1 + tmp3_1;  
             EM_S[INDEX2(0,3,4)]+=tmp0_1;  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             const register double D_0 = D_p[0];  
             const register double tmp0_1 = D_0*w10;  
             EM_S[INDEX2(0,0,4)]+=tmp0_1;  
             EM_S[INDEX2(0,2,4)]+=tmp0_1;  
             EM_S[INDEX2(2,0,4)]+=tmp0_1;  
             EM_S[INDEX2(2,2,4)]+=tmp0_1;  
         }  
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             const register double X_0 = X_p[0];  
             const register double X_1 = X_p[1];  
             const register double tmp0_1 = X_0*w11;  
             const register double tmp2_1 = X_0*w13;  
             const register double tmp1_1 = X_1*w12;  
             const register double tmp3_1 = X_1*w14;  
             EM_F[0]+=tmp0_1 + tmp1_1;  
             EM_F[1]+=tmp2_1;  
             EM_F[2]+=tmp0_1 + tmp3_1;  
             EM_F[3]+=tmp2_1;  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             const register double Y_0 = Y_p[0];  
             const register double tmp0_1 = Y_0*w15;  
             EM_F[0]+=tmp0_1;  
             EM_F[2]+=tmp0_1;  
3490          }          }
                       /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_0 BOTTOM */  
                     }  
                     // ADD EM_F  and EM_S  
         } // end colouring  
             }  
3491    
3492              if (m_faceOffset[1] > -1) {          if (m_faceOffset[1] > -1) {
3493              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring                          for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring            
3494  #pragma omp for nowait                  bool add_EM_S=false;
3495                      for (index_t k1=k1_0; k1<m_NE1; k1+=2) {                  bool add_EM_F=false;
3496                /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_1 TOP */                  vector<double> EM_S(4*4, 0);
3497          ///////////////                  vector<double> EM_F(4, 0);
3498          // process A //  #pragma omp for nowait
3499          ///////////////                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3500          if (!A.isEmpty()) {                      const index_t e = m_faceOffset[1]+k1;
3501              add_EM_S=true;                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_1 TOP */
3502              const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_1 BOTTOM */
3503              const register double A_00 = A_p[INDEX2(0,0,2)];                  }
3504              const register double A_01 = A_p[INDEX2(0,1,2)];                  // ADD EM_F  and EM_S
3505              const register double A_10 = A_p[INDEX2(1,0,2)];              } // end colouring
             const register double A_11 = A_p[INDEX2(1,1,2)];  
             const register double tmp0_0 = A_01 + A_10;  
             const register double tmp7_1 = A_01*w1;  
             const register double tmp6_1 = tmp0_0*w2;  
             const register double tmp2_1 = A_10*w2;  
             const register double tmp0_1 = A_00*w0;  
             const register double tmp9_1 = tmp0_0*w1;  
             const register double tmp8_1 = A_11*w5;  
             const register double tmp1_1 = A_01*w2;  
             const register double tmp5_1 = A_11*w4;  
             const register double tmp3_1 = A_10*w1;  
             const register double tmp4_1 = A_00*w3;  
             EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
             EM_S[INDEX2(1,2,4)]+=tmp0_1 + tmp2_1;  
             EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp3_1;  
             EM_S[INDEX2(0,0,4)]+=tmp4_1;  
             EM_S[INDEX2(3,3,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
             EM_S[INDEX2(3,0,4)]+=tmp0_1 + tmp3_1;  
             EM_S[INDEX2(3,1,4)]+=tmp2_1 + tmp4_1 + tmp7_1 + tmp8_1;  
             EM_S[INDEX2(2,1,4)]+=tmp0_1 + tmp1_1;  
             EM_S[INDEX2(0,2,4)]+=tmp4_1;  
             EM_S[INDEX2(2,0,4)]+=tmp4_1;  
             EM_S[INDEX2(1,3,4)]+=tmp1_1 + tmp3_1 + tmp4_1 + tmp8_1;  
             EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp7_1;  
             EM_S[INDEX2(2,2,4)]+=tmp4_1;  
             EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp2_1;  
             EM_S[INDEX2(0,3,4)]+=tmp0_1 + tmp7_1;  
             EM_S[INDEX2(1,1,4)]+=tmp4_1 + tmp5_1 + tmp9_1;  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             const register double B_0 = B_p[0];  
             const register double B_1 = B_p[1];  
             const register double tmp0_1 = B_0*w7;  
             const register double tmp3_1 = B_1*w8;  
             const register double tmp1_1 = B_1*w9;  
             const register double tmp2_1 = B_0*w6;  
             EM_S[INDEX2(0,1,4)]+=tmp0_1;  
             EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(3,1,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(2,1,4)]+=tmp0_1;  
             EM_S[INDEX2(1,3,4)]+=tmp2_1 + tmp3_1;  
             EM_S[INDEX2(2,3,4)]+=tmp0_1;  
             EM_S[INDEX2(0,3,4)]+=tmp0_1;  
             EM_S[INDEX2(1,1,4)]+=tmp2_1 + tmp3_1;  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             const register double C_0 = C_p[0];  
             const register double C_1 = C_p[1];  
             const register double tmp3_1 = C_1*w8;  
             const register double tmp2_1 = C_0*w6;  
             const register double tmp1_1 = C_1*w9;  
             const register double tmp0_1 = C_0*w7;  
             EM_S[INDEX2(1,2,4)]+=tmp0_1;  
             EM_S[INDEX2(3,2,4)]+=tmp0_1;  
             EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(3,0,4)]+=tmp0_1;  
             EM_S[INDEX2(3,1,4)]+=tmp2_1 + tmp3_1;  
             EM_S[INDEX2(1,3,4)]+=tmp1_1 + tmp2_1;  
             EM_S[INDEX2(1,0,4)]+=tmp0_1;  
             EM_S[INDEX2(1,1,4)]+=tmp2_1 + tmp3_1;  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             const register double D_0 = D_p[0];  
             const register double tmp0_1 = D_0*w10;  
             EM_S[INDEX2(3,3,4)]+=tmp0_1;  
             EM_S[INDEX2(3,1,4)]+=tmp0_1;  
             EM_S[INDEX2(1,3,4)]+=tmp0_1;  
             EM_S[INDEX2(1,1,4)]+=tmp0_1;  
         }  
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             const register double X_0 = X_p[0];  
             const register double X_1 = X_p[1];  
             const register double tmp0_1 = X_0*w11;  
             const register double tmp1_1 = X_0*w13;  
             const register double tmp2_1 = X_1*w12;  
             const register double tmp3_1 = X_1*w14;  
             EM_F[0]+=tmp0_1;  
             EM_F[1]+=tmp1_1 + tmp2_1;  
             EM_F[2]+=tmp0_1;  
             EM_F[3]+=tmp1_1 + tmp3_1;  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             const register double Y_0 = Y_p[0];  
             const register double tmp0_1 = Y_0*w15;  
             EM_F[1]+=tmp0_1;  
             EM_F[3]+=tmp0_1;  
3506          }          }
                       /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_1 BOTTOM */  
                     }  
                      // ADD EM_F  and EM_S  
                 } // end colouring  
             }  
3507    
3508              if (m_faceOffset[2] > -1) {          if (m_faceOffset[2] > -1) {
3509             for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3510                    bool add_EM_S=false;
3511                    bool add_EM_F=false;
3512                    vector<double> EM_S(4*4, 0);
3513                    vector<double> EM_F(4, 0);
3514  #pragma omp for nowait  #pragma omp for nowait
3515                    for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3516                        /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_2 TOP */                      const index_t e = m_faceOffset[2]+k0;
3517                        ///////////////                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_2 TOP */
3518                        // process A //                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_2 BOTTOM */
3519                        ///////////////                  }
3520                        if (!A.isEmpty()) {                  // ADD EM_F  and EM_S
3521                            add_EM_S=true;              } // end colouring
3522                            const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);          }
                           const register double A_00 = A_p[INDEX2(0,0,2)];  
                           const register double A_01 = A_p[INDEX2(0,1,2)];  
                           const register double A_10 = A_p[INDEX2(1,0,2)];  
                           const register double A_11 = A_p[INDEX2(1,1,2)];  
                           const register double tmp0_0 = A_01 + A_10;  
                           const register double tmp7_1 = A_10*w17;  
                           const register double tmp3_1 = A_01*w17;  
                           const register double tmp5_1 = A_00*w21;  
                           const register double tmp1_1 = A_11*w19;  
                           const register double tmp2_1 = A_00*w16;  
                           const register double tmp9_1 = tmp0_0*w18;  
                           const register double tmp6_1 = tmp0_0*w17;  
                           const register double tmp8_1 = A_01*w18;  
                           const register double tmp4_1 = A_11*w20;  
                           const register double tmp0_1 = A_10*w18;  
                           EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                           EM_S[INDEX2(1,2,4)]+=tmp3_1 + tmp4_1;  
                           EM_S[INDEX2(3,2,4)]+=tmp1_1;  
                           EM_S[INDEX2(0,0,4)]+=tmp1_1 + tmp5_1 + tmp6_1;  
                           EM_S[INDEX2(3,3,4)]+=tmp1_1;  
                           EM_S[INDEX2(3,0,4)]+=tmp0_1 + tmp4_1;  
                           EM_S[INDEX2(3,1,4)]+=tmp4_1 + tmp7_1;  
                           EM_S[INDEX2(2,1,4)]+=tmp4_1 + tmp7_1;  
                           EM_S[INDEX2(0,2,4)]+=tmp4_1 + tmp8_1;  
                           EM_S[INDEX2(2,0,4)]+=tmp0_1 + tmp4_1;  
                           EM_S[INDEX2(1,3,4)]+=tmp3_1 + tmp4_1;  
                           EM_S[INDEX2(2,3,4)]+=tmp1_1;  
                           EM_S[INDEX2(2,2,4)]+=tmp1_1;  
                           EM_S[INDEX2(1,0,4)]+=tmp1_1 + tmp2_1 + tmp7_1 + tmp8_1;  
                           EM_S[INDEX2(0,3,4)]+=tmp4_1 + tmp8_1;  
                           EM_S[INDEX2(1,1,4)]+=tmp1_1 + tmp5_1 + tmp9_1;  
                       }  
                       ///////////////  
                       // process B //  
                       ///////////////  
                       if (!B.isEmpty()) {  
                           add_EM_S=true;  
                           const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                           const register double B_0 = B_p[0];  
                           const register double B_1 = B_p[1];  
                           const register double tmp1_1 = B_0*w8;  
                           const register double tmp2_1 = B_1*w23;  
                           const register double tmp0_1 = B_1*w22;  
                           const register double tmp3_1 = B_0*w9;  
                           EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                           EM_S[INDEX2(0,0,4)]+=tmp0_1 + tmp1_1;  
                           EM_S[INDEX2(3,0,4)]+=tmp2_1;  
                           EM_S[INDEX2(3,1,4)]+=tmp2_1;  
                           EM_S[INDEX2(2,1,4)]+=tmp2_1;  
                           EM_S[INDEX2(2,0,4)]+=tmp2_1;  
                           EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp3_1;  
                           EM_S[INDEX2(1,1,4)]+=tmp0_1 + tmp3_1;  
                       }  
                       ///////////////  
                       // process C //  
                       ///////////////  
                       if (!C.isEmpty()) {  
                           add_EM_S=true;  
                           const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                           const register double C_0 = C_p[0];  
                           const register double C_1 = C_p[1];  
                           const register double tmp2_1 = C_1*w23;  
                           const register double tmp0_1 = C_1*w22;  
                           const register double tmp1_1 = C_0*w9;  
                           const register double tmp3_1 = C_0*w8;  
                           EM_S[INDEX2(0,1,4)]+=tmp0_1 + tmp1_1;  
                           EM_S[INDEX2(1,2,4)]+=tmp2_1;  
                           EM_S[INDEX2(0,0,4)]+=tmp0_1 + tmp3_1;  
                           EM_S[INDEX2(0,2,4)]+=tmp2_1;  
                           EM_S[INDEX2(1,3,4)]+=tmp2_1;  
                           EM_S[INDEX2(1,0,4)]+=tmp0_1 + tmp3_1;  
                           EM_S[INDEX2(0,3,4)]+=tmp2_1;  
                           EM_S[INDEX2(1,1,4)]+=tmp0_1 + tmp1_1;  
                       }  
                       ///////////////  
                       // process D //  
                       ///////////////  
                       if (!D.isEmpty()) {  
                           add_EM_S=true;  
                           const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                           const register double D_0 = D_p[0];  
                           const register double tmp0_1 = D_0*w24;  
                           EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                           EM_S[INDEX2(0,0,4)]+=tmp0_1;  
                           EM_S[INDEX2(1,0,4)]+=tmp0_1;  
                           EM_S[INDEX2(1,1,4)]+=tmp0_1;  
                       }  
                       ///////////////  
                       // process X //  
                       ///////////////  
                       if (!X.isEmpty()) {  
                           add_EM_F=true;  
                           const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                           const register double X_0 = X_p[0];  
                           const register double X_1 = X_p[1];  
                           const register double tmp1_1 = X_0*w12;  
                           const register double tmp2_1 = X_0*w14;  
                           const register double tmp0_1 = X_1*w25;  
                           const register double tmp3_1 = X_1*w26;  
                           EM_F[0]+=tmp0_1 + tmp1_1;  
                           EM_F[1]+=tmp0_1 + tmp2_1;  
                           EM_F[2]+=tmp3_1;  
                           EM_F[3]+=tmp3_1;  
                       }  
                       ///////////////  
                       // process Y //  
                       ///////////////  
                       if (!Y.isEmpty()) {  
                           add_EM_F=true;  
                           const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                           const register double Y_0 = Y_p[0];  
                           const register double tmp0_1 = Y_0*w27;  
                           EM_F[0]+=tmp0_1;  
                           EM_F[1]+=tmp0_1;  
                       }  
                       /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_2 BOTTOM */  
                   }  
                   // ADD EM_F  and EM_S  
                } // end colouring  
             }  
3523    
3524              if (m_faceOffset[3] > -1) {          if (m_faceOffset[3] > -1) {
3525               for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3526                    bool add_EM_S=false;
3527                    bool add_EM_F=false;
3528                    vector<double> EM_S(4*4, 0);
3529                    vector<double> EM_F(4, 0);
3530  #pragma omp for nowait  #pragma omp for nowait
3531                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3532                         /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_3 TOP */                      const index_t e = m_faceOffset[3]+k0;
3533                         ///////////////                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_3 TOP */
3534                         // process A //                      /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_3 BOTTOM */
                        ///////////////  
                        if (!A.isEmpty()) {  
                            add_EM_S=true;  
                            const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
                            const register double A_00 = A_p[INDEX2(0,0,2)];  
                            const register double A_01 = A_p[INDEX2(0,1,2)];  
                            const register double A_10 = A_p[INDEX2(1,0,2)];  
                            const register double A_11 = A_p[INDEX2(1,1,2)];  
                            const register double tmp0_0 = A_01 + A_10;  
                            const register double tmp2_1 = A_10*w17;  
                            const register double tmp5_1 = A_01*w17;  
                            const register double tmp6_1 = A_00*w21;  
                            const register double tmp0_1 = A_11*w19;  
                            const register double tmp4_1 = A_00*w16;  
                            const register double tmp9_1 = tmp0_0*w18;  
                            const register double tmp7_1 = tmp0_0*w17;  
                            const register double tmp8_1 = A_01*w18;  
                            const register double tmp1_1 = A_11*w20;  
                            const register double tmp3_1 = A_10*w18;  
                            EM_S[INDEX2(0,1,4)]+=tmp0_1;  
                            EM_S[INDEX2(1,2,4)]+=tmp1_1 + tmp2_1;  
                            EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                            EM_S[INDEX2(0,0,4)]+=tmp0_1;  
                            EM_S[INDEX2(3,3,4)]+=tmp0_1 + tmp6_1 + tmp7_1;  
                            EM_S[INDEX2(3,0,4)]+=tmp1_1 + tmp8_1;  
                            EM_S[INDEX2(3,1,4)]+=tmp1_1 + tmp8_1;  
                            EM_S[INDEX2(2,1,4)]+=tmp1_1 + tmp5_1;  
                            EM_S[INDEX2(0,2,4)]+=tmp1_1 + tmp2_1;  
                            EM_S[INDEX2(2,0,4)]+=tmp1_1 + tmp5_1;  
                            EM_S[INDEX2(1,3,4)]+=tmp1_1 + tmp3_1;  
                            EM_S[INDEX2(2,3,4)]+=tmp0_1 + tmp2_1 + tmp4_1 + tmp8_1;  
                            EM_S[INDEX2(2,2,4)]+=tmp0_1 + tmp6_1 + tmp9_1;  
                            EM_S[INDEX2(1,0,4)]+=tmp0_1;  
                            EM_S[INDEX2(0,3,4)]+=tmp1_1 + tmp3_1;  
                            EM_S[INDEX2(1,1,4)]+=tmp0_1;  
                        }  
                        ///////////////  
                        // process B //  
                        ///////////////  
                        if (!B.isEmpty()) {  
                            add_EM_S=true;  
                            const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                            const register double B_0 = B_p[0];  
                            const register double B_1 = B_p[1];  
                            const register double tmp3_1 = B_0*w8;  
                            const register double tmp2_1 = B_1*w23;  
                            const register double tmp0_1 = B_1*w22;  
                            const register double tmp1_1 = B_0*w9;  
                            EM_S[INDEX2(1,2,4)]+=tmp0_1;  
                            EM_S[INDEX2(3,2,4)]+=tmp1_1 + tmp2_1;  
                            EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp2_1;  
                            EM_S[INDEX2(0,2,4)]+=tmp0_1;  
                            EM_S[INDEX2(1,3,4)]+=tmp0_1;  
                            EM_S[INDEX2(2,3,4)]+=tmp2_1 + tmp3_1;  
                            EM_S[INDEX2(2,2,4)]+=tmp2_1 + tmp3_1;  
                            EM_S[INDEX2(0,3,4)]+=tmp0_1;  
                        }  
                        ///////////////  
                        // process C //  
                        ///////////////  
                        if (!C.isEmpty()) {  
                            add_EM_S=true;  
                            const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                            const register double C_0 = C_p[0];  
                            const register double C_1 = C_p[1];  
                            const register double tmp1_1 = C_1*w23;  
                            const register double tmp3_1 = C_1*w22;  
                            const register double tmp0_1 = C_0*w8;  
                            const register double tmp2_1 = C_0*w9;  
                            EM_S[INDEX2(3,2,4)]+=tmp0_1 + tmp1_1;  
                            EM_S[INDEX2(3,3,4)]+=tmp1_1 + tmp2_1;  
                            EM_S[INDEX2(3,0,4)]+=tmp3_1;  
                            EM_S[INDEX2(3,1,4)]+=tmp3_1;  
                            EM_S[INDEX2(2,1,4)]+=tmp3_1;  
                            EM_S[INDEX2(2,0,4)]+=tmp3_1;  
                            EM_S[INDEX2(2,3,4)]+=tmp1_1 + tmp2_1;  
                            EM_S[INDEX2(2,2,4)]+=tmp0_1 + tmp1_1;  
                        }  
                        ///////////////  
                        // process D //  
                        ///////////////  
                        if (!D.isEmpty()) {  
                            add_EM_S=true;  
                            const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                            const register double D_0 = D_p[0];  
                            const register double tmp0_1 = D_0*w24;  
                            EM_S[INDEX2(3,2,4)]+=tmp0_1;  
                            EM_S[INDEX2(3,3,4)]+=tmp0_1;  
                            EM_S[INDEX2(2,3,4)]+=tmp0_1;  
                            EM_S[INDEX2(2,2,4)]+=tmp0_1;  
                        }  
                        ///////////////  
                        // process X //  
                        ///////////////  
                        if (!X.isEmpty()) {  
                            add_EM_F=true;  
                            const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                            const register double X_0 = X_p[0];  
                            const register double X_1 = X_p[1];  
                            const register double tmp2_1 = X_0*w12;  
                            const register double tmp1_1 = X_1*w26;  
                            const register double tmp0_1 = X_1*w25;  
                            const register double tmp3_1 = X_0*w14;  
                            EM_F[0]+=tmp0_1;  
                            EM_F[1]+=tmp0_1;  
                            EM_F[2]+=tmp1_1 + tmp2_1;  
                            EM_F[3]+=tmp1_1 + tmp3_1;  
                        }  
                        ///////////////  
                        // process Y //  
                        ///////////////  
                        if (!Y.isEmpty()) {  
                            add_EM_F=true;  
                            const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                            const register double Y_0 = Y_p[0];  
                            const register double tmp0_1 = Y_0*w27;  
                            EM_F[2]+=tmp0_1;  
                            EM_F[3]+=tmp0_1;  
                        }  
                       /* GENERATOR SNIP_PDEBC_SINGLE_REDUCED_3 BOTTOM */  
3535                  }                  }
3536                  // ADD EM_F  and EM_S                  // ADD EM_F  and EM_S
3537                  } // end colouring              } // end colouring
3538              }          }
3539          } // end of parallel section      } // end of parallel section
   
3540  }  }
3541    
3542  //protected  //protected
3543  void Rectangle::assemblePDEBoundarySystem(Paso_SystemMatrix* mat,  void Rectangle::assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
3544          escript::Data& rhs, const escript::Data& A, const escript::Data& B,          escript::Data& rhs, const escript::Data& a, const escript::Data& b,
3545          const escript::Data& C, const escript::Data& D,          const escript::Data& c, const escript::Data& d,
3546          const escript::Data& X, const escript::Data& Y) const          const escript::Data& x, const escript::Data& y) const
3547  {  {
3548      const double h0 = m_l0/m_gNE0;      const double h0 = m_l0/m_gNE0;
3549      const double h1 = m_l1/m_gNE1;      const double h1 = m_l1/m_gNE1;
# Line 5367  void Rectangle::assemblePDEBoundarySyste Line 3555  void Rectangle::assemblePDEBoundarySyste
3555          numComp=mat->logical_col_block_size;          numComp=mat->logical_col_block_size;
3556      }      }
3557      /* GENERATOR SNIP_PDEBC_SYSTEM_PRE TOP */      /* GENERATOR SNIP_PDEBC_SYSTEM_PRE TOP */
3558      const double w0 = -0.31100423396407310779*h1/pow(h0,2);      /* GENERATOR SNIP_PDEBC_SYSTEM_PRE BOTTOM */
3559      const double w1 = -0.39433756729740644113/h0;  #pragma omp parallel
3560      const double w10 = 0.083333333333333333333*h1/pow(h0,2);      {
3561      const double w11 = -0.5/h1;          if (m_faceOffset[0] > -1) {
3562      const double w12 = -0.33333333333333333333*h1/pow(h0,2);              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring
3563      const double w13 = -0.5/h0;                  bool add_EM_S=false;
3564      const double w14 = -0.16666666666666666667*h1/pow(h0,2);                  bool add_EM_F=false;
3565      const double w15 = 0.5/h0;                  vector<double> EM_S(4*4, 0);
3566      const double w16 = 0.33333333333333333333*h1/pow(h0,2);                  vector<double> EM_F(4, 0);
3567      const double w17 = 1.0/h1;  #pragma omp for nowait
3568      const double w18 = 0.16666666666666666667*h1/pow(h0,2);                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3569      const double w19 = -1.0/h1;                      const index_t e = k1;
3570      const double w2 = -0.022329099369260225539*h1/pow(h0,2);                      /* GENERATOR SNIP_PDEBC_SYSTEM_0 TOP */
3571      const double w20 = 0.083333333333333333333*h1/h0;                      /* GENERATOR SNIP_PDEBC_SYSTEM_0 BOTTOM */
     const double w21 = 0.022329099369260225539*h1/h0;  
     const double w22 = 0.31100423396407310779*h1/h0;  
     const double w23 = -0.31100423396407310779*h1/h0;  
     const double w24 = -0.39433756729740643311;  
     const double w25 = -0.022329099369260225539*h1/h0;  
     const double w26 = -0.10566243270259356689;  
     const double w27 = -0.083333333333333333333*h1/h0;  
     const double w28 = 0.39433756729740643311;  
     const double w29 = 0.10566243270259356689;  
     const double w3 = -0.10566243270259355887/h0;  
     const double w30 = 0.16666666666666666667*h1/h0;  
     const double w31 = 0.33333333333333333333*h1/h0;  
     const double w32 = -0.33333333333333333333*h1/h0;  
     const double w33 = -0.50000000000000000000;  
     const double w34 = -0.16666666666666666667*h1/h0;  
     const double w35 = 0.50000000000000000000;  
     const double w36 = 0.31100423396407310779*h1;  
     const double w37 = 0.022329099369260225539*h1;  
     const double w38 = 0.083333333333333333333*h1;  
     const double w39 = 0.33333333333333333333*h1;  
     const double w4 = -0.083333333333333333333*h1/pow(h0,2);  
     const double w40 = 0.16666666666666666667*h1;  
     const double w41 = -0.39433756729740644113*h1/h0;  
     const double w42 = -0.10566243270259355887*h1/h0;  
     const double w43 = 0.39433756729740644113*h1/h0;  
     const double w44 = 0.10566243270259355887*h1/h0;  
     const double w45 = -0.5*h1/h0;  
     const double w46 = -1.0000000000000000000;  
     const double w47 = 0.5*h1/h0;  
     const double w48 = 1.0000000000000000000;  
     const double w49 = 0.39433756729740644113*h1;  
     const double w5 = 0.39433756729740644113/h0;  
     const double w50 = 0.10566243270259355887*h1;  
     const double w51 = 0.5*h1;  
     const double w52 = -0.5/h0;  
     const double w53 = 0.10566243270259355887/h1;  
     const double w54 = -0.39433756729740644113/h1;  
     const double w55 = 0.083333333333333333333*h0/pow(h1,2);  
     const double w56 = 0.39433756729740644113/h1;  
     const double w57 = -0.10566243270259355887/h1;  
     const double w58 = -0.083333333333333333333*h0/pow(h1,2);  
     const double w59 = 0.5/h0;  
     const double w6 = 0.10566243270259355887/h0;  
     const double w60 = 0.31100423396407310779*h0/pow(h1,2);  
     const double w61 = 0.022329099369260225539*h0/pow(h1,2);  
     const double w62 = -0.022329099369260225539*h0/pow(h1,2);  
     const double w63 = -0.31100423396407310779*h0/pow(h1,2);  
     const double w64 = -1.0/h0;  
     const double w65 = 0.5/h1;  
     const double w66 = -0.5/h1;  
     const double w67 = 0.16666666666666666667*h0/pow(h1,2);  
     const double w68 = -0.16666666666666666667*h0/pow(h1,2);  
     const double w69 = 1.0/h0;  
     const double w7 = 0.31100423396407310779*h1/pow(h0,2);  
     const double w70 = 0.33333333333333333333*h0/pow(h1,2);  
     const double w71 = -0.33333333333333333333*h0/pow(h1,2);  
     const double w72 = -0.083333333333333333333*h0/h1;  
     const double w73 = -0.31100423396407310779*h0/h1;  
     const double w74 = -0.022329099369260225539*h0/h1;  
     const double w75 = 0.083333333333333333333*h0/h1;  
     const double w76 = 0.022329099369260225539*h0/h1;  
     const double w77 = 0.31100423396407310779*h0/h1;  
     const double w78 = -0.16666666666666666667*h0/h1;  
     const double w79 = -0.33333333333333333333*h0/h1;  
     const double w8 = 0.5/h1;  
     const double w80 = 0.16666666666666666667*h0/h1;  
     const double w81 = 0.33333333333333333333*h0/h1;  
     const double w82 = 0.083333333333333333333*h0;  
     const double w83 = 0.31100423396407310779*h0;  
     const double w84 = 0.022329099369260225539*h0;  
     const double w85 = 0.16666666666666666667*h0;  
     const double w86 = 0.33333333333333333333*h0;  
     const double w87 = -0.39433756729740644113*h0/h1;  
     const double w88 = -0.10566243270259355887*h0/h1;  
     const double w89 = 0.39433756729740644113*h0/h1;  
     const double w9 = 0.022329099369260225539*h1/pow(h0,2);  
     const double w90 = 0.10566243270259355887*h0/h1;  
     const double w91 = -0.5*h0/h1;  
     const double w92 = 0.5*h0/h1;  
     const double w93 = 0.39433756729740644113*h0;  
     const double w94 = 0.10566243270259355887*h0;  
     const double w95 = 0.5*h0;  
   /* GENERATOR SNIP_PDEBC_SYSTEM_PRE BOTTOM */  
   #pragma omp parallel  
         {  
             if (m_faceOffset[0] > -1) {  
             for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring  
 #pragma omp for nowait  
                     for (index_t k1=k1_0; k1<m_NE1; k1+=2) {  
               /* GENERATOR SNIP_PDEBC_SYSTEM_0 TOP */  
         ///////////////  
         // process A //  
         ///////////////  
         if (!A.isEmpty()) {  
             add_EM_S=true;  
             const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
             if (A.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double A_00_0 = A_p[INDEX5(k,0,m,0,0, numEq,2,numComp,2)];  
                         const register double A_01_0 = A_p[INDEX5(k,0,m,1,0, numEq,2,numComp,2)];  
                         const register double A_10_0 = A_p[INDEX5(k,1,m,0,0, numEq,2,numComp,2)];  
                         const register double A_11_0 = A_p[INDEX5(k,1,m,1,0, numEq,2,numComp,2)];  
                         const register double A_00_1 = A_p[INDEX5(k,0,m,0,1, numEq,2,numComp,2)];  
                         const register double A_01_1 = A_p[INDEX5(k,0,m,1,1, numEq,2,numComp,2)];  
                         const register double A_10_1 = A_p[INDEX5(k,1,m,0,1, numEq,2,numComp,2)];  
                         const register double A_11_1 = A_p[INDEX5(k,1,m,1,1, numEq,2,numComp,2)];  
                         const register double tmp1_0 = A_11_0 + A_11_1;  
                         const register double tmp2_0 = A_01_1 + A_10_1;  
                         const register double tmp0_0 = A_00_0 + A_00_1;  
                         const register double tmp3_0 = A_01_0 + A_10_0;  
                         const register double tmp7_1 = A_00_1*w0;  
                         const register double tmp16_1 = A_00_0*w9;  
                         const register double tmp23_1 = A_01_0*w1;  
                         const register double tmp4_1 = A_01_1*w6;  
                         const register double tmp13_1 = tmp2_0*w6;  
                         const register double tmp30_1 = A_10_0*w3;  
                         const register double tmp2_1 = A_10_0*w1;  
                         const register double tmp14_1 = A_00_0*w7;  
                         const register double tmp5_1 = tmp0_0*w4;  
                         const register double tmp15_1 = tmp3_0*w5;  
                         const register double tmp22_1 = A_10_0*w5;  
                         const register double tmp10_1 = A_00_0*w2;  
                         const register double tmp20_1 = tmp0_0*w10;  
                         const register double tmp29_1 = tmp2_0*w1;  
                         const register double tmp0_1 = A_10_1*w3;  
                         const register double tmp31_1 = A_10_1*w1;  
                         const register double tmp11_1 = tmp1_0*w8;  
                         const register double tmp21_1 = A_10_1*w6;  
                         const register double tmp9_1 = A_01_1*w5;  
                         const register double tmp12_1 = A_00_1*w9;  
                         const register double tmp27_1 = A_10_1*w5;  
                         const register double tmp6_1 = A_01_0*w5;  
                         const register double tmp8_1 = A_01_0*w6;  
                         const register double tmp1_1 = A_00_0*w0;  
                         const register double tmp3_1 = A_00_1*w2;  
                         const register double tmp19_1 = A_01_1*w1;  
                         const register double tmp25_1 = A_01_1*w3;  
                         const register double tmp18_1 = A_01_0*w3;  
                         const register double tmp24_1 = tmp1_0*w11;  
                         const register double tmp26_1 = A_10_0*w6;  
                         const register double tmp17_1 = A_00_1*w7;  
                         const register double tmp28_1 = tmp3_0*w3;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp10_1 + tmp7_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp11_1 + tmp12_1 + tmp13_1 + tmp14_1 + tmp15_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp16_1 + tmp17_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp18_1 + tmp19_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp20_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp21_1 + tmp22_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp20_1 + tmp23_1 + tmp24_1 + tmp25_1 + tmp26_1 + tmp27_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp0_1 + tmp20_1 + tmp24_1 + tmp2_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp20_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp10_1 + tmp26_1 + tmp27_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp11_1 + tmp16_1 + tmp17_1 + tmp28_1 + tmp29_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp23_1 + tmp25_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp30_1 + tmp31_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp12_1 + tmp14_1;  
                     }  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                           for (index_t m=0; m<numComp; m++) {  
                               const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                         const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                         const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                         const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                         const register double tmp0_0 = A_01 + A_10;  
                         const register double tmp5_1 = A_11*w17;  
                         const register double tmp8_1 = A_00*w18;  
                         const register double tmp0_1 = A_10*w13;  
                         const register double tmp11_1 = tmp0_0*w13;  
                         const register double tmp3_1 = A_01*w15;  
                         const register double tmp10_1 = A_11*w19;  
                         const register double tmp4_1 = A_00*w16;  
                         const register double tmp2_1 = A_00*w14;  
                         const register double tmp6_1 = tmp0_0*w15;  
                         const register double tmp1_1 = A_00*w12;  
                         const register double tmp7_1 = A_01*w13;  
                         const register double tmp9_1 = A_10*w15;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp4_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp2_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp8_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp2_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp10_1 + tmp7_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp0_1 + tmp10_1 + tmp3_1 + tmp8_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp8_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp1_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp11_1 + tmp4_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp4_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             if (B.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double B_0_0 = B_p[INDEX4(k,0,m,0, numEq,2,numComp)];  
                         const register double B_1_0 = B_p[INDEX4(k,1,m,0, numEq,2,numComp)];  
                         const register double B_0_1 = B_p[INDEX4(k,0,m,1, numEq,2,numComp)];  
                         const register double B_1_1 = B_p[INDEX4(k,1,m,1, numEq,2,numComp)];  
                         const register double tmp0_0 = B_0_0 + B_0_1;  
                         const register double tmp7_1 = tmp0_0*w27;  
                         const register double tmp5_1 = B_1_0*w24;  
                         const register double tmp8_1 = B_1_0*w26;  
                         const register double tmp11_1 = B_1_0*w28;  
                         const register double tmp10_1 = B_1_1*w29;  
                         const register double tmp15_1 = B_0_1*w23;  
                         const register double tmp0_1 = tmp0_0*w20;  
                         const register double tmp4_1 = B_0_1*w25;  
                         const register double tmp9_1 = B_1_1*w24;  
                         const register double tmp16_1 = B_0_0*w22;  
                         const register double tmp3_1 = B_1_1*w26;  
                         const register double tmp13_1 = B_1_1*w28;  
                         const register double tmp12_1 = B_1_0*w29;  
                         const register double tmp1_1 = B_0_1*w22;  
                         const register double tmp17_1 = B_0_1*w21;  
                         const register double tmp6_1 = B_0_0*w23;  
                         const register double tmp2_1 = B_0_0*w21;  
                         const register double tmp14_1 = B_0_0*w25;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp10_1 + tmp11_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp12_1 + tmp13_1 + tmp14_1 + tmp15_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp16_1 + tmp17_1;  
                     }  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                         const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                         const register double tmp5_1 = B_1*w35;  
                         const register double tmp1_1 = B_0*w31;  
                         const register double tmp3_1 = B_1*w33;  
                         const register double tmp0_1 = B_0*w30;  
                         const register double tmp2_1 = B_0*w32;  
                         const register double tmp4_1 = B_0*w34;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp4_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp2_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             if (C.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double C_0_0 = C_p[INDEX4(k,m,0, 0, numEq,numComp,2)];  
                         const register double C_1_0 = C_p[INDEX4(k,m,1, 0, numEq,numComp,2)];  
                         const register double C_0_1 = C_p[INDEX4(k,m,0, 1, numEq,numComp,2)];  
                         const register double C_1_1 = C_p[INDEX4(k,m,1, 1, numEq,numComp,2)];  
                         const register double tmp0_0 = C_0_0 + C_0_1;  
                         const register double tmp14_1 = C_1_0*w29;  
                         const register double tmp9_1 = tmp0_0*w27;  
                         const register double tmp11_1 = C_1_1*w24;  
                         const register double tmp2_1 = C_1_1*w26;  
                         const register double tmp15_1 = C_1_1*w28;  
                         const register double tmp12_1 = C_0_1*w22;  
                         const register double tmp0_1 = C_0_0*w22;  
                         const register double tmp6_1 = tmp0_0*w20;  
                         const register double tmp17_1 = C_0_1*w23;  
                         const register double tmp3_1 = C_0_1*w25;  
                         const register double tmp16_1 = C_0_0*w25;  
                         const register double tmp4_1 = C_1_0*w24;  
                         const register double tmp10_1 = C_1_0*w26;  
                         const register double tmp8_1 = C_1_0*w28;  
                         const register double tmp7_1 = C_1_1*w29;  
                         const register double tmp5_1 = C_0_0*w23;  
                         const register double tmp1_1 = C_0_1*w21;  
                         const register double tmp13_1 = C_0_0*w21;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp2_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp6_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp10_1 + tmp11_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp12_1 + tmp13_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp6_1;  
                     }  
3572                  }                  }
3573              } else { /* constant data */                  // ADD EM_F  and EM_S
3574                  for (index_t k=0; k<numEq; k++) {              } // end colouring
                     for (index_t m=0; m<numComp; m++) {  
                         const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                         const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                         const register double tmp3_1 = C_0*w30;  
                         const register double tmp1_1 = C_0*w32;  
                         const register double tmp5_1 = C_0*w34;  
                         const register double tmp2_1 = C_1*w33;  
                         const register double tmp4_1 = C_1*w35;  
                         const register double tmp0_1 = C_0*w31;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp3_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp4_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp2_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp1_1 + tmp4_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp3_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             if (D.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double D_0 = D_p[INDEX3(k, m, 0, numEq, numComp)];  
                         const register double D_1 = D_p[INDEX3(k, m, 1, numEq, numComp)];  
                         const register double tmp0_0 = D_0 + D_1;  
                         const register double tmp1_1 = D_1*w37;  
                         const register double tmp4_1 = D_0*w37;  
                         const register double tmp0_1 = D_0*w36;  
                         const register double tmp3_1 = D_1*w36;  
                         const register double tmp2_1 = tmp0_0*w38;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp2_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp2_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                     }  
                  }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                         const register double tmp0_1 = D_0*w39;  
                         const register double tmp1_1 = D_0*w40;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp0_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             if (X.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double X_0_0 = X_p[INDEX3(k, 0, 0, numEq, 2)];  
                     const register double X_1_0 = X_p[INDEX3(k, 1, 0, numEq, 2)];  
                     const register double X_0_1 = X_p[INDEX3(k, 0, 1, numEq, 2)];  
                     const register double X_1_1 = X_p[INDEX3(k, 1, 1, numEq, 2)];  
                     const register double tmp0_0 = X_1_0 + X_1_1;  
                     const register double tmp3_1 = X_0_1*w44;  
                     const register double tmp1_1 = X_0_1*w42;  
                     const register double tmp8_1 = X_0_0*w44;  
                     const register double tmp4_1 = X_0_0*w43;  
                     const register double tmp7_1 = X_0_0*w42;  
                     const register double tmp5_1 = tmp0_0*w35;  
                     const register double tmp0_1 = X_0_0*w41;  
                     const register double tmp9_1 = X_0_1*w43;  
                     const register double tmp2_1 = tmp0_0*w33;  
                     const register double tmp6_1 = X_0_1*w41;  
                     EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                     EM_F[INDEX2(k,1,numEq)]+=tmp3_1 + tmp4_1;  
                     EM_F[INDEX2(k,2,numEq)]+=tmp5_1 + tmp6_1 + tmp7_1;  
                     EM_F[INDEX2(k,3,numEq)]+=tmp8_1 + tmp9_1;  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                     const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                     const register double tmp2_1 = X_0*w47;  
                     const register double tmp1_1 = X_0*w45;  
                     const register double tmp3_1 = X_1*w48;  
                     const register double tmp0_1 = X_1*w46;  
                     EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                     EM_F[INDEX2(k,1,numEq)]+=tmp2_1;  
                     EM_F[INDEX2(k,2,numEq)]+=tmp1_1 + tmp3_1;  
                     EM_F[INDEX2(k,3,numEq)]+=tmp2_1;  
                 }  
             }  
3575          }          }
3576          ///////////////  
3577          // process Y //          if (m_faceOffset[1] > -1) {
3578          ///////////////              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring            
3579          if (!Y.isEmpty()) {                  bool add_EM_S=false;
3580              add_EM_F=true;                  bool add_EM_F=false;
3581              const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);                  vector<double> EM_S(4*4, 0);
3582              if (Y.actsExpanded()) {                  vector<double> EM_F(4, 0);
3583                  for (index_t k=0; k<numEq; k++) {  #pragma omp for nowait
3584                      const register double Y_0 = Y_p[INDEX2(k, 0, numEq)];                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3585                      const register double Y_1 = Y_p[INDEX2(k, 1, numEq)];                      const index_t e = m_faceOffset[1]+k1;
3586                      const register double tmp0_1 = Y_0*w49;                      /* GENERATOR SNIP_PDEBC_SYSTEM_1 TOP */
3587                      const register double tmp1_1 = Y_1*w50;                      /* GENERATOR SNIP_PDEBC_SYSTEM_1 BOTTOM */
                     const register double tmp3_1 = Y_0*w50;  
                     const register double tmp2_1 = Y_1*w49;  
                     EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                     EM_F[INDEX2(k,2,numEq)]+=tmp2_1 + tmp3_1;  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double Y_0 = Y_p[k];  
                     const register double tmp0_1 = Y_0*w51;  
                     EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                     EM_F[INDEX2(k,2,numEq)]+=tmp0_1;  
3588                  }                  }
3589              }                  // ADD EM_F  and EM_S
3590                } // end colouring
3591          }          }
                       /* GENERATOR SNIP_PDEBC_SYSTEM_0 BOTTOM */  
                     }  
                     // ADD EM_F  and EM_S  
         } // end colouring  
             }  
3592    
3593              if (m_faceOffset[1] > -1) {          if (m_faceOffset[2] > -1) {
3594              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring                          for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3595                    bool add_EM_S=false;
3596                    bool add_EM_F=false;
3597                    vector<double> EM_S(4*4, 0);
3598                    vector<double> EM_F(4, 0);
3599  #pragma omp for nowait  #pragma omp for nowait
3600                      for (index_t k1=k1_0; k1<m_NE1; k1+=2) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3601                /* GENERATOR SNIP_PDEBC_SYSTEM_1 TOP */                      const index_t e = m_faceOffset[2]+k0;
3602          ///////////////                      /* GENERATOR SNIP_PDEBC_SYSTEM_2 TOP */
3603          // process A //                      /* GENERATOR SNIP_PDEBC_SYSTEM_2 BOTTOM */
         ///////////////  
         if (!A.isEmpty()) {  
             add_EM_S=true;  
             const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
             if (A.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double A_00_0 = A_p[INDEX5(k,0,m,0,0, numEq,2,numComp,2)];  
                         const register double A_01_0 = A_p[INDEX5(k,0,m,1,0, numEq,2,numComp,2)];  
                         const register double A_10_0 = A_p[INDEX5(k,1,m,0,0, numEq,2,numComp,2)];  
                         const register double A_11_0 = A_p[INDEX5(k,1,m,1,0, numEq,2,numComp,2)];  
                         const register double A_00_1 = A_p[INDEX5(k,0,m,0,1, numEq,2,numComp,2)];  
                         const register double A_01_1 = A_p[INDEX5(k,0,m,1,1, numEq,2,numComp,2)];  
                         const register double A_10_1 = A_p[INDEX5(k,1,m,0,1, numEq,2,numComp,2)];  
                         const register double A_11_1 = A_p[INDEX5(k,1,m,1,1, numEq,2,numComp,2)];  
                         const register double tmp1_0 = A_11_0 + A_11_1;  
                         const register double tmp3_0 = A_01_1 + A_10_1;  
                         const register double tmp0_0 = A_00_0 + A_00_1;  
                         const register double tmp2_0 = A_01_0 + A_10_0;  
                         const register double tmp8_1 = A_00_1*w0;  
                         const register double tmp14_1 = A_00_0*w9;  
                         const register double tmp29_1 = A_01_0*w1;  
                         const register double tmp1_1 = A_01_1*w6;  
                         const register double tmp15_1 = tmp2_0*w6;  
                         const register double tmp7_1 = A_10_0*w3;  
                         const register double tmp19_1 = A_10_0*w1;  
                         const register double tmp12_1 = A_00_0*w7;  
                         const register double tmp5_1 = tmp0_0*w4;  
                         const register double tmp17_1 = tmp3_0*w5;  
                         const register double tmp25_1 = A_10_0*w5;  
                         const register double tmp10_1 = A_00_0*w2;  
                         const register double tmp23_1 = tmp0_0*w10;  
                         const register double tmp31_1 = tmp2_0*w1;  
                         const register double tmp18_1 = A_10_1*w3;  
                         const register double tmp9_1 = A_10_1*w1;  
                         const register double tmp13_1 = tmp1_0*w8;  
                         const register double tmp24_1 = A_10_1*w6;  
                         const register double tmp27_1 = A_01_1*w5;  
                         const register double tmp11_1 = A_00_1*w9;  
                         const register double tmp6_1 = A_10_1*w5;  
                         const register double tmp2_1 = A_01_0*w5;  
                         const register double tmp26_1 = A_01_0*w6;  
                         const register double tmp0_1 = A_00_0*w0;  
                         const register double tmp3_1 = A_00_1*w2;  
                         const register double tmp20_1 = A_01_1*w1;  
                         const register double tmp28_1 = A_01_1*w3;  
                         const register double tmp22_1 = A_01_0*w3;  
                         const register double tmp21_1 = tmp1_0*w11;  
                         const register double tmp4_1 = A_10_0*w6;  
                         const register double tmp16_1 = A_00_1*w7;  
                         const register double tmp30_1 = tmp3_0*w3;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp10_1 + tmp7_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp11_1 + tmp12_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp13_1 + tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp18_1 + tmp19_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp20_1 + tmp21_1 + tmp22_1 + tmp23_1 + tmp24_1 + tmp25_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp26_1 + tmp27_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp23_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp23_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp1_1 + tmp21_1 + tmp23_1 + tmp2_1 + tmp7_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp10_1 + tmp20_1 + tmp22_1 + tmp8_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp14_1 + tmp16_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp24_1 + tmp25_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp28_1 + tmp29_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp11_1 + tmp12_1 + tmp13_1 + tmp30_1 + tmp31_1;  
                     }  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                           for (index_t m=0; m<numComp; m++) {  
                               const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                         const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                         const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                         const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                         const register double tmp0_0 = A_01 + A_10;  
                         const register double tmp6_1 = A_11*w17;  
                         const register double tmp9_1 = A_00*w18;  
                         const register double tmp4_1 = A_10*w13;  
                         const register double tmp11_1 = tmp0_0*w13;  
                         const register double tmp0_1 = A_01*w15;  
                         const register double tmp10_1 = A_11*w19;  
                         const register double tmp5_1 = A_00*w16;  
                         const register double tmp2_1 = A_00*w14;  
                         const register double tmp7_1 = tmp0_0*w15;  
                         const register double tmp1_1 = A_00*w12;  
                         const register double tmp8_1 = A_01*w13;  
                         const register double tmp3_1 = A_10*w15;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp4_1;  
                         EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp5_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp5_1 + tmp6_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp2_1 + tmp4_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp10_1 + tmp3_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                         EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp9_1;  
                         EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp9_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp0_1 + tmp10_1 + tmp4_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp1_1 + tmp8_1;  
                         EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp5_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp2_1 + tmp8_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp11_1 + tmp5_1 + tmp6_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             if (B.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double B_0_0 = B_p[INDEX4(k,0,m,0, numEq,2,numComp)];  
                         const register double B_1_0 = B_p[INDEX4(k,1,m,0, numEq,2,numComp)];  
                         const register double B_0_1 = B_p[INDEX4(k,0,m,1, numEq,2,numComp)];  
                         const register double B_1_1 = B_p[INDEX4(k,1,m,1, numEq,2,numComp)];  
                         const register double tmp0_0 = B_0_0 + B_0_1;  
                         const register double tmp9_1 = tmp0_0*w27;  
                         const register double tmp17_1 = B_1_0*w24;  
                         const register double tmp10_1 = B_1_0*w26;  
                         const register double tmp8_1 = B_1_0*w28;  
                         const register double tmp6_1 = B_1_1*w29;  
                         const register double tmp13_1 = B_0_1*w23;  
                         const register double tmp7_1 = tmp0_0*w20;  
                         const register double tmp0_1 = B_0_1*w25;  
                         const register double tmp11_1 = B_1_1*w24;  
                         const register double tmp14_1 = B_0_0*w22;  
                         const register double tmp16_1 = B_1_1*w26;  
                         const register double tmp4_1 = B_1_1*w28;  
                         const register double tmp5_1 = B_1_0*w29;  
                         const register double tmp3_1 = B_0_0*w21;  
                         const register double tmp15_1 = B_0_1*w21;  
                         const register double tmp1_1 = B_0_0*w23;  
                         const register double tmp2_1 = B_0_1*w22;  
                         const register double tmp12_1 = B_0_0*w25;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp2_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp6_1 + tmp7_1 + tmp8_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp9_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp10_1 + tmp11_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp12_1 + tmp13_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp9_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                     }  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                         const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                         const register double tmp1_1 = B_1*w35;  
                         const register double tmp2_1 = B_0*w31;  
                         const register double tmp5_1 = B_1*w33;  
                         const register double tmp3_1 = B_0*w30;  
                         const register double tmp0_1 = B_0*w32;  
                         const register double tmp4_1 = B_0*w34;  
                         EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp4_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp3_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp4_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp2_1 + tmp5_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             if (C.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double C_0_0 = C_p[INDEX4(k,m,0, 0, numEq,numComp,2)];  
                         const register double C_1_0 = C_p[INDEX4(k,m,1, 0, numEq,numComp,2)];  
                         const register double C_0_1 = C_p[INDEX4(k,m,0, 1, numEq,numComp,2)];  
                         const register double C_1_1 = C_p[INDEX4(k,m,1, 1, numEq,numComp,2)];  
                         const register double tmp0_0 = C_0_0 + C_0_1;  
                         const register double tmp7_1 = tmp0_0*w20;  
                         const register double tmp15_1 = C_0_1*w21;  
                         const register double tmp0_1 = tmp0_0*w27;  
                         const register double tmp9_1 = C_1_1*w24;  
                         const register double tmp16_1 = C_1_1*w26;  
                         const register double tmp5_1 = C_1_1*w28;  
                         const register double tmp3_1 = C_0_1*w22;  
                         const register double tmp6_1 = C_1_0*w29;  
                         const register double tmp11_1 = C_1_0*w28;  
                         const register double tmp2_1 = C_0_1*w23;  
                         const register double tmp12_1 = C_0_1*w25;  
                         const register double tmp17_1 = C_1_0*w24;  
                         const register double tmp8_1 = C_1_0*w26;  
                         const register double tmp4_1 = C_0_0*w21;  
                         const register double tmp10_1 = C_1_1*w29;  
                         const register double tmp13_1 = C_0_0*w23;  
                         const register double tmp1_1 = C_0_0*w25;  
                         const register double tmp14_1 = C_0_0*w22;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp10_1 + tmp11_1 + tmp7_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp12_1 + tmp13_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                     }  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                         const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                         const register double tmp4_1 = C_0*w30;  
                         const register double tmp1_1 = C_0*w32;  
                         const register double tmp0_1 = C_0*w34;  
                         const register double tmp5_1 = C_1*w33;  
                         const register double tmp2_1 = C_1*w35;  
                         const register double tmp3_1 = C_0*w31;  
                         EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                         EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp4_1 + tmp5_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp2_1 + tmp4_1;  
                         EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp3_1 + tmp5_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             if (D.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double D_0 = D_p[INDEX3(k, m, 0, numEq, numComp)];  
                         const register double D_1 = D_p[INDEX3(k, m, 1, numEq, numComp)];  
                         const register double tmp0_0 = D_0 + D_1;  
                         const register double tmp4_1 = D_1*w37;  
                         const register double tmp2_1 = tmp0_0*w38;  
                         const register double tmp1_1 = D_0*w37;  
                         const register double tmp3_1 = D_0*w36;  
                         const register double tmp0_1 = D_1*w36;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp2_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp2_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                     }  
                  }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     for (index_t m=0; m<numComp; m++) {  
                         const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                         const register double tmp0_1 = D_0*w39;  
                         const register double tmp1_1 = D_0*w40;  
                         EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp0_1;  
                         EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp1_1;  
                         EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1;  
                     }  
                 }  
             }  
         }  
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             if (X.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double X_0_0 = X_p[INDEX3(k, 0, 0, numEq, 2)];  
                     const register double X_1_0 = X_p[INDEX3(k, 1, 0, numEq, 2)];  
                     const register double X_0_1 = X_p[INDEX3(k, 0, 1, numEq, 2)];  
                     const register double X_1_1 = X_p[INDEX3(k, 1, 1, numEq, 2)];  
                     const register double tmp0_0 = X_1_0 + X_1_1;  
                     const register double tmp2_1 = X_0_1*w44;  
                     const register double tmp1_1 = X_0_1*w42;  
                     const register double tmp7_1 = X_0_0*w44;  
                     const register double tmp3_1 = X_0_0*w43;  
                     const register double tmp6_1 = X_0_0*w42;  
                     const register double tmp8_1 = tmp0_0*w35;  
                     const register double tmp0_1 = X_0_0*w41;  
                     const register double tmp9_1 = X_0_1*w43;  
                     const register double tmp4_1 = tmp0_0*w33;  
                     const register double tmp5_1 = X_0_1*w41;  
                     EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                     EM_F[INDEX2(k,1,numEq)]+=tmp2_1 + tmp3_1 + tmp4_1;  
                     EM_F[INDEX2(k,2,numEq)]+=tmp5_1 + tmp6_1;  
                     EM_F[INDEX2(k,3,numEq)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                     const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                     const register double tmp1_1 = X_0*w47;  
                     const register double tmp0_1 = X_0*w45;  
                     const register double tmp3_1 = X_1*w48;  
                     const register double tmp2_1 = X_1*w46;  
                     EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                     EM_F[INDEX2(k,1,numEq)]+=tmp1_1 + tmp2_1;  
                     EM_F[INDEX2(k,2,numEq)]+=tmp0_1;  
                     EM_F[INDEX2(k,3,numEq)]+=tmp1_1 + tmp3_1;  
                 }  
             }  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             if (Y.actsExpanded()) {  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double Y_0 = Y_p[INDEX2(k, 0, numEq)];  
                     const register double Y_1 = Y_p[INDEX2(k, 1, numEq)];  
                     const register double tmp0_1 = Y_0*w49;  
                     const register double tmp1_1 = Y_1*w50;  
                     const register double tmp3_1 = Y_0*w50;  
                     const register double tmp2_1 = Y_1*w49;  
                     EM_F[INDEX2(k,1,numEq)]+=tmp0_1 + tmp1_1;  
                     EM_F[INDEX2(k,3,numEq)]+=tmp2_1 + tmp3_1;  
                 }  
             } else { /* constant data */  
                 for (index_t k=0; k<numEq; k++) {  
                     const register double Y_0 = Y_p[k];  
                     const register double tmp0_1 = Y_0*w51;  
                     EM_F[INDEX2(k,1,numEq)]+=tmp0_1;  
                     EM_F[INDEX2(k,3,numEq)]+=tmp0_1;  
3604                  }                  }
3605              }                  // ADD EM_F  and EM_S
3606                } // end colouring
3607          }          }
                       /* GENERATOR SNIP_PDEBC_SYSTEM_1 BOTTOM */  
                     }  
                      // ADD EM_F  and EM_S  
                 } // end colouring  
             }  
3608    
3609              if (m_faceOffset[2] > -1) {          if (m_faceOffset[3] > -1) {
3610             for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3611  #pragma omp for nowait                  bool add_EM_S=false;
3612                    for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  bool add_EM_F=false;
3613                        /* GENERATOR SNIP_PDEBC_SYSTEM_2 TOP */                  vector<double> EM_S(4*4, 0);
3614                        ///////////////                  vector<double> EM_F(4, 0);
                       // process A //  
                       ///////////////  
                       if (!A.isEmpty()) {  
                           add_EM_S=true;  
                           const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
                           if (A.actsExpanded()) {  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double A_00_0 = A_p[INDEX5(k,0,m,0,0, numEq,2,numComp,2)];  
                                       const register double A_01_0 = A_p[INDEX5(k,0,m,1,0, numEq,2,numComp,2)];  
                                       const register double A_10_0 = A_p[INDEX5(k,1,m,0,0, numEq,2,numComp,2)];  
                                       const register double A_11_0 = A_p[INDEX5(k,1,m,1,0, numEq,2,numComp,2)];  
                                       const register double A_00_1 = A_p[INDEX5(k,0,m,0,1, numEq,2,numComp,2)];  
                                       const register double A_01_1 = A_p[INDEX5(k,0,m,1,1, numEq,2,numComp,2)];  
                                       const register double A_10_1 = A_p[INDEX5(k,1,m,0,1, numEq,2,numComp,2)];  
                                       const register double A_11_1 = A_p[INDEX5(k,1,m,1,1, numEq,2,numComp,2)];  
                                       const register double tmp1_0 = A_11_0 + A_11_1;  
                                       const register double tmp2_0 = A_01_1 + A_10_1;  
                                       const register double tmp0_0 = A_00_0 + A_00_1;  
                                       const register double tmp3_0 = A_01_0 + A_10_0;  
                                       const register double tmp27_1 = A_11_1*w62;  
                                       const register double tmp23_1 = A_10_0*w56;  
                                       const register double tmp15_1 = A_11_1*w60;  
                                       const register double tmp4_1 = A_10_0*w54;  
                                       const register double tmp12_1 = tmp0_0*w59;  
                                       const register double tmp25_1 = A_01_0*w54;  
                                       const register double tmp21_1 = A_10_1*w56;  
                                       const register double tmp10_1 = tmp2_0*w53;  
                                       const register double tmp16_1 = A_10_0*w57;  
                                       const register double tmp18_1 = A_11_0*w62;  
                                       const register double tmp11_1 = A_11_0*w60;  
                                       const register double tmp8_1 = A_01_0*w56;  
                                       const register double tmp6_1 = A_01_1*w53;  
                                       const register double tmp20_1 = A_10_0*w53;  
                                       const register double tmp0_1 = A_10_1*w57;  
                                       const register double tmp19_1 = A_11_1*w63;  
                                       const register double tmp5_1 = A_01_0*w53;  
                                       const register double tmp9_1 = A_11_1*w61;  
                                       const register double tmp1_1 = tmp0_0*w52;  
                                       const register double tmp24_1 = A_01_1*w57;  
                                       const register double tmp7_1 = tmp1_0*w58;  
                                       const register double tmp17_1 = A_10_1*w54;  
                                       const register double tmp29_1 = A_01_1*w54;  
                                       const register double tmp3_1 = tmp1_0*w55;  
                                       const register double tmp26_1 = A_11_0*w63;  
                                       const register double tmp22_1 = A_10_1*w53;  
                                       const register double tmp14_1 = A_11_0*w61;  
                                       const register double tmp31_1 = tmp2_0*w54;  
                                       const register double tmp30_1 = tmp3_0*w57;  
                                       const register double tmp28_1 = A_01_0*w57;  
                                       const register double tmp2_1 = A_01_1*w56;  
                                       const register double tmp13_1 = tmp3_0*w56;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                                       EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp6_1 + tmp7_1 + tmp8_1;  
                                       EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp10_1 + tmp11_1 + tmp12_1 + tmp13_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp14_1 + tmp15_1;  
                                       EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp16_1 + tmp17_1 + tmp7_1;  
                                       EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp18_1 + tmp19_1 + tmp20_1 + tmp21_1;  
                                       EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp22_1 + tmp23_1 + tmp7_1;  
                                       EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp24_1 + tmp25_1 + tmp26_1 + tmp27_1;  
                                       EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp0_1 + tmp26_1 + tmp27_1 + tmp4_1;  
                                       EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp18_1 + tmp19_1 + tmp2_1 + tmp5_1;  
                                       EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp11_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp20_1 + tmp21_1 + tmp24_1 + tmp25_1 + tmp3_1;  
                                       EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp28_1 + tmp29_1 + tmp7_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp12_1 + tmp14_1 + tmp15_1 + tmp30_1 + tmp31_1;  
                                   }  
                               }  
                           } else { /* constant data */  
                               for (index_t k=0; k<numEq; k++) {  
                                         for (index_t m=0; m<numComp; m++) {  
                                             const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                                       const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                                       const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                                       const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                                       const register double tmp0_0 = A_01 + A_10;  
                                       const register double tmp0_1 = A_10*w66;  
                                       const register double tmp11_1 = tmp0_0*w66;  
                                       const register double tmp6_1 = A_00*w69;  
                                       const register double tmp9_1 = A_10*w65;  
                                       const register double tmp7_1 = A_11*w70;  
                                       const register double tmp8_1 = A_11*w71;  
                                       const register double tmp3_1 = A_11*w67;  
                                       const register double tmp5_1 = tmp0_0*w65;  
                                       const register double tmp2_1 = A_00*w64;  
                                       const register double tmp4_1 = A_11*w68;  
                                       const register double tmp10_1 = A_01*w66;  
                                       const register double tmp1_1 = A_01*w65;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                                       EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp1_1 + tmp4_1;  
                                       EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp5_1 + tmp6_1 + tmp7_1;  
                                       EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp7_1;  
                                       EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1 + tmp4_1;  
                                       EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp8_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp4_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp10_1 + tmp8_1;  
                                       EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp0_1 + tmp8_1;  
                                       EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp1_1 + tmp8_1;  
                                       EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp7_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp10_1 + tmp2_1 + tmp3_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp10_1 + tmp4_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp11_1 + tmp6_1 + tmp7_1;  
                                   }  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process B //  
                       ///////////////  
                       if (!B.isEmpty()) {  
                           add_EM_S=true;  
                           const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                           if (B.actsExpanded()) {  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double B_0_0 = B_p[INDEX4(k,0,m,0, numEq,2,numComp)];  
                                       const register double B_1_0 = B_p[INDEX4(k,1,m,0, numEq,2,numComp)];  
                                       const register double B_0_1 = B_p[INDEX4(k,0,m,1, numEq,2,numComp)];  
                                       const register double B_1_1 = B_p[INDEX4(k,1,m,1, numEq,2,numComp)];  
                                       const register double tmp0_0 = B_1_0 + B_1_1;  
                                       const register double tmp15_1 = B_0_1*w28;  
                                       const register double tmp14_1 = B_0_0*w29;  
                                       const register double tmp9_1 = B_1_1*w77;  
                                       const register double tmp8_1 = B_1_0*w76;  
                                       const register double tmp16_1 = B_1_0*w74;  
                                       const register double tmp7_1 = tmp0_0*w75;  
                                       const register double tmp2_1 = B_0_1*w24;  
                                       const register double tmp0_1 = tmp0_0*w72;  
                                       const register double tmp5_1 = B_0_1*w26;  
                                       const register double tmp17_1 = B_1_1*w73;  
                                       const register double tmp3_1 = B_1_0*w73;  
                                       const register double tmp13_1 = B_0_1*w29;  
                                       const register double tmp11_1 = B_1_0*w77;  
                                       const register double tmp10_1 = B_1_1*w76;  
                                       const register double tmp4_1 = B_1_1*w74;  
                                       const register double tmp6_1 = B_0_0*w24;  
                                       const register double tmp1_1 = B_0_0*w26;  
                                       const register double tmp12_1 = B_0_0*w28;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                                       EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp7_1;  
                                       EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp8_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp7_1;  
                                       EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp10_1 + tmp11_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp12_1 + tmp13_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                                   }  
                               }  
                           } else { /* constant data */  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                                       const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                                       const register double tmp4_1 = B_1*w81;  
                                       const register double tmp0_1 = B_0*w33;  
                                       const register double tmp3_1 = B_1*w80;  
                                       const register double tmp2_1 = B_1*w79;  
                                       const register double tmp5_1 = B_0*w35;  
                                       const register double tmp1_1 = B_1*w78;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                                       EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp4_1;  
                                       EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp4_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp5_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp2_1 + tmp5_1;  
                                   }  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process C //  
                       ///////////////  
                       if (!C.isEmpty()) {  
                           add_EM_S=true;  
                           const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                           if (C.actsExpanded()) {  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double C_0_0 = C_p[INDEX4(k,m,0, 0, numEq,numComp,2)];  
                                       const register double C_1_0 = C_p[INDEX4(k,m,1, 0, numEq,numComp,2)];  
                                       const register double C_0_1 = C_p[INDEX4(k,m,0, 1, numEq,numComp,2)];  
                                       const register double C_1_1 = C_p[INDEX4(k,m,1, 1, numEq,numComp,2)];  
                                       const register double tmp0_0 = C_1_0 + C_1_1;  
                                       const register double tmp1_1 = C_0_0*w28;  
                                       const register double tmp14_1 = C_0_0*w29;  
                                       const register double tmp9_1 = C_1_0*w77;  
                                       const register double tmp8_1 = C_1_1*w76;  
                                       const register double tmp5_1 = C_1_1*w74;  
                                       const register double tmp3_1 = tmp0_0*w75;  
                                       const register double tmp13_1 = C_0_1*w24;  
                                       const register double tmp0_1 = tmp0_0*w72;  
                                       const register double tmp4_1 = C_1_0*w73;  
                                       const register double tmp17_1 = C_1_1*w73;  
                                       const register double tmp2_1 = C_0_1*w29;  
                                       const register double tmp11_1 = C_1_1*w77;  
                                       const register double tmp10_1 = C_1_0*w76;  
                                       const register double tmp16_1 = C_1_0*w74;  
                                       const register double tmp6_1 = C_0_1*w26;  
                                       const register double tmp15_1 = C_0_1*w28;  
                                       const register double tmp7_1 = C_0_0*w24;  
                                       const register double tmp12_1 = C_0_0*w26;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                                       EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp6_1 + tmp7_1;  
                                       EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp8_1 + tmp9_1;  
                                       EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp10_1 + tmp11_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp12_1 + tmp13_1;  
                                       EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp3_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                                   }  
                               }  
                           } else { /* constant data */  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                                       const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                                       const register double tmp5_1 = C_1*w81;  
                                       const register double tmp2_1 = C_1*w80;  
                                       const register double tmp4_1 = C_0*w33;  
                                       const register double tmp1_1 = C_1*w78;  
                                       const register double tmp0_1 = C_0*w35;  
                                       const register double tmp3_1 = C_1*w79;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                       EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp2_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                                       EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp5_1;  
                                       EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp5_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp4_1;  
                                       EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp2_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                                   }  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process D //  
                       ///////////////  
                       if (!D.isEmpty()) {  
                           add_EM_S=true;  
                           const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                           if (D.actsExpanded()) {  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double D_0 = D_p[INDEX3(k, m, 0, numEq, numComp)];  
                                       const register double D_1 = D_p[INDEX3(k, m, 1, numEq, numComp)];  
                                       const register double tmp0_0 = D_0 + D_1;  
                                       const register double tmp2_1 = D_1*w84;  
                                       const register double tmp4_1 = D_0*w84;  
                                       const register double tmp0_1 = tmp0_0*w82;  
                                       const register double tmp1_1 = D_0*w83;  
                                       const register double tmp3_1 = D_1*w83;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                                   }  
                                }  
                           } else { /* constant data */  
                               for (index_t k=0; k<numEq; k++) {  
                                   for (index_t m=0; m<numComp; m++) {  
                                       const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                                       const register double tmp1_1 = D_0*w86;  
                                       const register double tmp0_1 = D_0*w85;  
                                       EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                                       EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp1_1;  
                                       EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                                       EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp1_1;  
                                   }  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process X //  
                       ///////////////  
                       if (!X.isEmpty()) {  
                           add_EM_F=true;  
                           const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                           if (X.actsExpanded()) {  
                               for (index_t k=0; k<numEq; k++) {  
                                   const register double X_0_0 = X_p[INDEX3(k, 0, 0, numEq, 2)];  
                                   const register double X_1_0 = X_p[INDEX3(k, 1, 0, numEq, 2)];  
                                   const register double X_0_1 = X_p[INDEX3(k, 0, 1, numEq, 2)];  
                                   const register double X_1_1 = X_p[INDEX3(k, 1, 1, numEq, 2)];  
                                   const register double tmp0_0 = X_0_0 + X_0_1;  
                                   const register double tmp4_1 = X_1_0*w88;  
                                   const register double tmp6_1 = X_1_1*w90;  
                                   const register double tmp9_1 = X_1_1*w89;  
                                   const register double tmp0_1 = X_1_1*w88;  
                                   const register double tmp8_1 = X_1_0*w90;  
                                   const register double tmp3_1 = tmp0_0*w35;  
                                   const register double tmp5_1 = X_1_1*w87;  
                                   const register double tmp7_1 = X_1_0*w89;  
                                   const register double tmp2_1 = tmp0_0*w33;  
                                   const register double tmp1_1 = X_1_0*w87;  
                                   EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                                   EM_F[INDEX2(k,1,numEq)]+=tmp3_1 + tmp4_1 + tmp5_1;  
                                   EM_F[INDEX2(k,2,numEq)]+=tmp6_1 + tmp7_1;  
                                   EM_F[INDEX2(k,3,numEq)]+=tmp8_1 + tmp9_1;  
                               }  
                           } else { /* constant data */  
                               for (index_t k=0; k<numEq; k++) {  
                                   const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                                   const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                                   const register double tmp0_1 = X_0*w46;  
                                   const register double tmp3_1 = X_1*w92;  
                                   const register double tmp2_1 = X_0*w48;  
                                   const register double tmp1_1 = X_1*w91;  
                                   EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                                   EM_F[INDEX2(k,1,numEq)]+=tmp1_1 + tmp2_1;  
                                   EM_F[INDEX2(k,2,numEq)]+=tmp3_1;  
                                   EM_F[INDEX2(k,3,numEq)]+=tmp3_1;  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process Y //  
                       ///////////////  
                       if (!Y.isEmpty()) {  
                           add_EM_F=true;  
                           const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                           if (Y.actsExpanded()) {  
                               for (index_t k=0; k<numEq; k++) {  
                                   const register double Y_0 = Y_p[INDEX2(k, 0, numEq)];  
                                   const register double Y_1 = Y_p[INDEX2(k, 1, numEq)];  
                                   const register double tmp0_1 = Y_0*w93;  
                                   const register double tmp2_1 = Y_1*w93;  
                                   const register double tmp1_1 = Y_1*w94;  
                                   const register double tmp3_1 = Y_0*w94;  
                                   EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                                   EM_F[INDEX2(k,1,numEq)]+=tmp2_1 + tmp3_1;  
                               }  
                           } else { /* constant data */  
                               for (index_t k=0; k<numEq; k++) {  
                                   const register double Y_0 = Y_p[k];  
                                   const register double tmp0_1 = Y_0*w95;  
                                   EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                                   EM_F[INDEX2(k,1,numEq)]+=tmp0_1;  
                               }  
                           }  
                       }  
                       /* GENERATOR SNIP_PDEBC_SYSTEM_2 BOTTOM */  
                   }  
                   // ADD EM_F  and EM_S  
                } // end colouring  
             }  
   
             if (m_faceOffset[3] > -1) {  
              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring  
3615  #pragma omp for nowait  #pragma omp for nowait
3616                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3617                         /* GENERATOR SNIP_PDEBC_SYSTEM_3 TOP */                      const index_t e = m_faceOffset[3]+k0;
3618                         ///////////////                      /* GENERATOR SNIP_PDEBC_SYSTEM_3 TOP */
3619                         // process A //                      /* GENERATOR SNIP_PDEBC_SYSTEM_3 BOTTOM */
                        ///////////////  
                        if (!A.isEmpty()) {  
                            add_EM_S=true;  
                            const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
                            if (A.actsExpanded()) {  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double A_00_0 = A_p[INDEX5(k,0,m,0,0, numEq,2,numComp,2)];  
                                        const register double A_01_0 = A_p[INDEX5(k,0,m,1,0, numEq,2,numComp,2)];  
                                        const register double A_10_0 = A_p[INDEX5(k,1,m,0,0, numEq,2,numComp,2)];  
                                        const register double A_11_0 = A_p[INDEX5(k,1,m,1,0, numEq,2,numComp,2)];  
                                        const register double A_00_1 = A_p[INDEX5(k,0,m,0,1, numEq,2,numComp,2)];  
                                        const register double A_01_1 = A_p[INDEX5(k,0,m,1,1, numEq,2,numComp,2)];  
                                        const register double A_10_1 = A_p[INDEX5(k,1,m,0,1, numEq,2,numComp,2)];  
                                        const register double A_11_1 = A_p[INDEX5(k,1,m,1,1, numEq,2,numComp,2)];  
                                        const register double tmp0_0 = A_11_0 + A_11_1;  
                                        const register double tmp3_0 = A_01_1 + A_10_1;  
                                        const register double tmp1_0 = A_00_0 + A_00_1;  
                                        const register double tmp2_0 = A_01_0 + A_10_0;  
                                        const register double tmp24_1 = A_11_1*w62;  
                                        const register double tmp27_1 = A_10_0*w56;  
                                        const register double tmp11_1 = A_11_1*w60;  
                                        const register double tmp31_1 = A_10_0*w54;  
                                        const register double tmp16_1 = A_01_1*w57;  
                                        const register double tmp3_1 = A_10_1*w56;  
                                        const register double tmp12_1 = tmp2_0*w53;  
                                        const register double tmp4_1 = A_10_0*w57;  
                                        const register double tmp21_1 = A_11_0*w62;  
                                        const register double tmp10_1 = A_11_0*w60;  
                                        const register double tmp6_1 = A_01_0*w56;  
                                        const register double tmp5_1 = tmp1_0*w52;  
                                        const register double tmp14_1 = tmp1_0*w59;  
                                        const register double tmp8_1 = A_01_1*w53;  
                                        const register double tmp1_1 = A_10_0*w53;  
                                        const register double tmp2_1 = tmp0_0*w58;  
                                        const register double tmp30_1 = A_10_1*w57;  
                                        const register double tmp20_1 = A_11_1*w63;  
                                        const register double tmp22_1 = A_01_0*w53;  
                                        const register double tmp9_1 = A_11_1*w61;  
                                        const register double tmp17_1 = A_01_0*w54;  
                                        const register double tmp7_1 = A_10_1*w54;  
                                        const register double tmp19_1 = A_01_1*w54;  
                                        const register double tmp25_1 = A_11_0*w63;  
                                        const register double tmp26_1 = A_10_1*w53;  
                                        const register double tmp13_1 = A_11_0*w61;  
                                        const register double tmp23_1 = A_01_1*w56;  
                                        const register double tmp29_1 = tmp2_0*w54;  
                                        const register double tmp28_1 = tmp3_0*w57;  
                                        const register double tmp18_1 = A_01_0*w57;  
                                        const register double tmp0_1 = tmp0_0*w55;  
                                        const register double tmp15_1 = tmp3_0*w56;  
                                        EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp4_1 + tmp5_1 + tmp6_1 + tmp7_1 + tmp8_1;  
                                        EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp10_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp11_1 + tmp12_1 + tmp13_1 + tmp14_1 + tmp15_1;  
                                        EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp16_1 + tmp17_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp18_1 + tmp19_1 + tmp20_1 + tmp21_1;  
                                        EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp22_1 + tmp23_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp24_1 + tmp25_1 + tmp26_1 + tmp27_1;  
                                        EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp24_1 + tmp25_1 + tmp6_1 + tmp8_1;  
                                        EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp20_1 + tmp21_1 + tmp4_1 + tmp7_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp18_1 + tmp19_1 + tmp26_1 + tmp27_1 + tmp5_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp10_1 + tmp14_1 + tmp28_1 + tmp29_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp2_1 + tmp30_1 + tmp31_1;  
                                        EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp11_1 + tmp13_1;  
                                    }  
                                }  
                            } else { /* constant data */  
                                for (index_t k=0; k<numEq; k++) {  
                                          for (index_t m=0; m<numComp; m++) {  
                                              const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                                        const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                                        const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                                        const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                                        const register double tmp0_0 = A_01 + A_10;  
                                        const register double tmp3_1 = A_10*w66;  
                                        const register double tmp11_1 = tmp0_0*w66;  
                                        const register double tmp6_1 = A_11*w70;  
                                        const register double tmp1_1 = A_10*w65;  
                                        const register double tmp8_1 = A_00*w69;  
                                        const register double tmp10_1 = A_11*w71;  
                                        const register double tmp0_1 = A_11*w67;  
                                        const register double tmp7_1 = tmp0_0*w65;  
                                        const register double tmp5_1 = A_00*w64;  
                                        const register double tmp2_1 = A_11*w68;  
                                        const register double tmp9_1 = A_01*w66;  
                                        const register double tmp4_1 = A_01*w65;  
                                        EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                                        EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp6_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp6_1 + tmp7_1 + tmp8_1;  
                                        EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp2_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp10_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp2_1 + tmp4_1;  
                                        EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp10_1 + tmp1_1;  
                                        EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp10_1 + tmp4_1;  
                                        EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp10_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp5_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp11_1 + tmp6_1 + tmp8_1;  
                                        EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp6_1;  
                                    }  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process B //  
                        ///////////////  
                        if (!B.isEmpty()) {  
                            add_EM_S=true;  
                            const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                            if (B.actsExpanded()) {  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double B_0_0 = B_p[INDEX4(k,0,m,0, numEq,2,numComp)];  
                                        const register double B_1_0 = B_p[INDEX4(k,1,m,0, numEq,2,numComp)];  
                                        const register double B_0_1 = B_p[INDEX4(k,0,m,1, numEq,2,numComp)];  
                                        const register double B_1_1 = B_p[INDEX4(k,1,m,1, numEq,2,numComp)];  
                                        const register double tmp0_0 = B_1_0 + B_1_1;  
                                        const register double tmp8_1 = B_1_0*w73;  
                                        const register double tmp4_1 = B_0_0*w29;  
                                        const register double tmp7_1 = B_1_1*w77;  
                                        const register double tmp6_1 = B_1_0*w76;  
                                        const register double tmp11_1 = B_1_0*w74;  
                                        const register double tmp3_1 = tmp0_0*w75;  
                                        const register double tmp13_1 = B_0_1*w24;  
                                        const register double tmp0_1 = tmp0_0*w72;  
                                        const register double tmp14_1 = B_0_1*w26;  
                                        const register double tmp10_1 = B_1_1*w73;  
                                        const register double tmp5_1 = B_0_1*w28;  
                                        const register double tmp1_1 = B_0_1*w29;  
                                        const register double tmp15_1 = B_1_0*w77;  
                                        const register double tmp17_1 = B_1_1*w76;  
                                        const register double tmp9_1 = B_1_1*w74;  
                                        const register double tmp16_1 = B_0_0*w24;  
                                        const register double tmp12_1 = B_0_0*w26;  
                                        const register double tmp2_1 = B_0_0*w28;  
                                        EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp6_1 + tmp7_1;  
                                        EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp8_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp10_1 + tmp11_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp12_1 + tmp13_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                                        EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1;  
                                    }  
                                }  
                            } else { /* constant data */  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                                        const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                                        const register double tmp3_1 = B_1*w81;  
                                        const register double tmp5_1 = B_0*w33;  
                                        const register double tmp2_1 = B_1*w80;  
                                        const register double tmp4_1 = B_1*w79;  
                                        const register double tmp1_1 = B_0*w35;  
                                        const register double tmp0_1 = B_1*w78;  
                                        EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp4_1;  
                                        EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp4_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp2_1 + tmp5_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp3_1 + tmp5_1;  
                                        EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1;  
                                    }  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process C //  
                        ///////////////  
                        if (!C.isEmpty()) {  
                            add_EM_S=true;  
                            const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                            if (C.actsExpanded()) {  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double C_0_0 = C_p[INDEX4(k,m,0, 0, numEq,numComp,2)];  
                                        const register double C_1_0 = C_p[INDEX4(k,m,1, 0, numEq,numComp,2)];  
                                        const register double C_0_1 = C_p[INDEX4(k,m,0, 1, numEq,numComp,2)];  
                                        const register double C_1_1 = C_p[INDEX4(k,m,1, 1, numEq,numComp,2)];  
                                        const register double tmp0_0 = C_1_0 + C_1_1;  
                                        const register double tmp13_1 = C_0_0*w28;  
                                        const register double tmp3_1 = C_0_0*w29;  
                                        const register double tmp15_1 = C_1_0*w77;  
                                        const register double tmp17_1 = C_1_1*w76;  
                                        const register double tmp11_1 = C_1_1*w74;  
                                        const register double tmp0_1 = tmp0_0*w75;  
                                        const register double tmp2_1 = C_0_1*w24;  
                                        const register double tmp7_1 = tmp0_0*w72;  
                                        const register double tmp4_1 = C_0_1*w28;  
                                        const register double tmp8_1 = C_1_1*w73;  
                                        const register double tmp12_1 = C_0_1*w29;  
                                        const register double tmp6_1 = C_1_1*w77;  
                                        const register double tmp5_1 = C_1_0*w76;  
                                        const register double tmp9_1 = C_1_0*w74;  
                                        const register double tmp14_1 = C_0_1*w26;  
                                        const register double tmp10_1 = C_1_0*w73;  
                                        const register double tmp16_1 = C_0_0*w24;  
                                        const register double tmp1_1 = C_0_0*w26;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp3_1 + tmp4_1 + tmp5_1 + tmp6_1;  
                                        EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp7_1;  
                                        EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp8_1 + tmp9_1;  
                                        EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp7_1;  
                                        EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp10_1 + tmp11_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp12_1 + tmp13_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp14_1 + tmp15_1 + tmp16_1 + tmp17_1;  
                                    }  
                                }  
                            } else { /* constant data */  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                                        const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                                        const register double tmp3_1 = C_1*w81;  
                                        const register double tmp0_1 = C_1*w80;  
                                        const register double tmp4_1 = C_1*w78;  
                                        const register double tmp1_1 = C_0*w33;  
                                        const register double tmp2_1 = C_0*w35;  
                                        const register double tmp5_1 = C_1*w79;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                                        EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp4_1;  
                                        EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp5_1;  
                                        EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp4_1;  
                                        EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp5_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                                    }  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process D //  
                        ///////////////  
                        if (!D.isEmpty()) {  
                            add_EM_S=true;  
                            const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                            if (D.actsExpanded()) {  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double D_0 = D_p[INDEX3(k, m, 0, numEq, numComp)];  
                                        const register double D_1 = D_p[INDEX3(k, m, 1, numEq, numComp)];  
                                        const register double tmp0_0 = D_0 + D_1;  
                                        const register double tmp4_1 = D_1*w84;  
                                        const register double tmp2_1 = D_0*w84;  
                                        const register double tmp0_1 = tmp0_0*w82;  
                                        const register double tmp3_1 = D_0*w83;  
                                        const register double tmp1_1 = D_1*w83;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                                    }  
                                 }  
                            } else { /* constant data */  
                                for (index_t k=0; k<numEq; k++) {  
                                    for (index_t m=0; m<numComp; m++) {  
                                        const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                                        const register double tmp1_1 = D_0*w86;  
                                        const register double tmp0_1 = D_0*w85;  
                                        EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1;  
                                        EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                                        EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp1_1;  
                                    }  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process X //  
                        ///////////////  
                        if (!X.isEmpty()) {  
                            add_EM_F=true;  
                            const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                            if (X.actsExpanded()) {  
                                for (index_t k=0; k<numEq; k++) {  
                                    const register double X_0_0 = X_p[INDEX3(k, 0, 0, numEq, 2)];  
                                    const register double X_1_0 = X_p[INDEX3(k, 1, 0, numEq, 2)];  
                                    const register double X_0_1 = X_p[INDEX3(k, 0, 1, numEq, 2)];  
                                    const register double X_1_1 = X_p[INDEX3(k, 1, 1, numEq, 2)];  
                                    const register double tmp0_0 = X_0_0 + X_0_1;  
                                    const register double tmp2_1 = X_1_0*w88;  
                                    const register double tmp4_1 = X_1_1*w90;  
                                    const register double tmp9_1 = X_1_1*w89;  
                                    const register double tmp0_1 = X_1_1*w88;  
                                    const register double tmp8_1 = X_1_0*w90;  
                                    const register double tmp7_1 = tmp0_0*w35;  
                                    const register double tmp3_1 = X_1_1*w87;  
                                    const register double tmp6_1 = X_1_0*w89;  
                                    const register double tmp5_1 = tmp0_0*w33;  
                                    const register double tmp1_1 = X_1_0*w87;  
                                    EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                                    EM_F[INDEX2(k,1,numEq)]+=tmp2_1 + tmp3_1;  
                                    EM_F[INDEX2(k,2,numEq)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                                    EM_F[INDEX2(k,3,numEq)]+=tmp7_1 + tmp8_1 + tmp9_1;  
                                }  
                            } else { /* constant data */  
                                for (index_t k=0; k<numEq; k++) {  
                                    const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                                    const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                                    const register double tmp1_1 = X_0*w46;  
                                    const register double tmp2_1 = X_1*w92;  
                                    const register double tmp3_1 = X_0*w48;  
                                    const register double tmp0_1 = X_1*w91;  
                                    EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                                    EM_F[INDEX2(k,1,numEq)]+=tmp0_1;  
                                    EM_F[INDEX2(k,2,numEq)]+=tmp1_1 + tmp2_1;  
                                    EM_F[INDEX2(k,3,numEq)]+=tmp2_1 + tmp3_1;  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process Y //  
                        ///////////////  
                        if (!Y.isEmpty()) {  
                            add_EM_F=true;  
                            const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                            if (Y.actsExpanded()) {  
                                for (index_t k=0; k<numEq; k++) {  
                                    const register double Y_0 = Y_p[INDEX2(k, 0, numEq)];  
                                    const register double Y_1 = Y_p[INDEX2(k, 1, numEq)];  
                                    const register double tmp0_1 = Y_0*w93;  
                                    const register double tmp2_1 = Y_1*w93;  
                                    const register double tmp1_1 = Y_1*w94;  
                                    const register double tmp3_1 = Y_0*w94;  
                                    EM_F[INDEX2(k,2,numEq)]+=tmp0_1 + tmp1_1;  
                                    EM_F[INDEX2(k,3,numEq)]+=tmp2_1 + tmp3_1;  
                                }  
                            } else { /* constant data */  
                                for (index_t k=0; k<numEq; k++) {  
                                    const register double Y_0 = Y_p[k];  
                                    const register double tmp0_1 = Y_0*w95;  
                                    EM_F[INDEX2(k,2,numEq)]+=tmp0_1;  
                                    EM_F[INDEX2(k,3,numEq)]+=tmp0_1;  
                                }  
                            }  
                        }  
                       /* GENERATOR SNIP_PDEBC_SYSTEM_3 BOTTOM */  
3620                  }                  }
3621                  // ADD EM_F  and EM_S                  // ADD EM_F  and EM_S
3622                  } // end colouring              } // end colouring
3623              }          }
3624          } // end of parallel section      } // end of parallel section
   
3625  }  }
3626    
3627  //protected  //protected
3628  void Rectangle::assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,  void Rectangle::assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
3629          escript::Data& rhs, const escript::Data& A, const escript::Data& B,          escript::Data& rhs, const escript::Data& a, const escript::Data& b,
3630          const escript::Data& C, const escript::Data& D,          const escript::Data& c, const escript::Data& d,
3631          const escript::Data& X, const escript::Data& Y) const          const escript::Data& x, const escript::Data& y) const
3632  {  {
3633      const double h0 = m_l0/m_gNE0;      const double h0 = m_l0/m_gNE0;
3634      const double h1 = m_l1/m_gNE1;      const double h1 = m_l1/m_gNE1;
# Line 6916  void Rectangle::assemblePDEBoundarySyste Line 3639  void Rectangle::assemblePDEBoundarySyste
3639          numEq=mat->logical_row_block_size;          numEq=mat->logical_row_block_size;
3640          numComp=mat->logical_col_block_size;          numComp=mat->logical_col_block_size;
3641      }      }
3642        /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_PRE TOP */      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_PRE TOP */
3643        const double w0 = -0.25*h1/pow(h0,2);      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_PRE BOTTOM */
3644        const double w1 = -0.5/h0;  #pragma omp parallel
3645        const double w10 = 0.25*h1;      {
3646        const double w11 = -0.5*h1/h0;          if (m_faceOffset[0] > -1) {
3647        const double w12 = -1.0000000000000000000;              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring
3648        const double w13 = 0.5*h1/h0;                  bool add_EM_S=false;
3649        const double w14 = 1.0000000000000000000;                  bool add_EM_F=false;
3650        const double w15 = 0.5*h1;                  vector<double> EM_S(4*4, 0);
3651        const double w16 = -1/h0;                  vector<double> EM_F(4, 0);
3652        const double w17 = 0.5/h1;  #pragma omp for nowait
3653        const double w18 = -0.5/h1;                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3654        const double w19 = 0.25*h0/pow(h1,2);                      const index_t e = k1;
3655        const double w2 = 0.5/h0;                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_0 TOP */
3656        const double w20 = -0.25*h0/pow(h1,2);                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_0 BOTTOM */
       const double w21 = 1.0/h0;  
       const double w22 = -0.25*h0/h1;  
       const double w23 = 0.25*h0/h1;  
       const double w24 = 0.25*h0;  
       const double w25 = -0.5*h0/h1;  
       const double w26 = 0.5*h0/h1;  
       const double w27 = 0.5*h0;  
       const double w3 = 0.25*h1/pow(h0,2);  
       const double w4 = 1.0/h1;  
       const double w5 = -1/h1;  
       const double w6 = 0.25*h1/h0;  
       const double w7 = -0.25*h1/h0;  
       const double w8 = -0.50000000000000000000;  
       const double w9 = 0.50000000000000000000;  
   /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_PRE BOTTOM */  
   #pragma omp parallel  
         {  
             if (m_faceOffset[0] > -1) {  
             for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring  
 #pragma omp for nowait  
                     for (index_t k1=k1_0; k1<m_NE1; k1+=2) {  
               /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_0 TOP */  
         ///////////////  
         // process A //  
         ///////////////  
         if (!A.isEmpty()) {  
             add_EM_S=true;  
             const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                       for (index_t m=0; m<numComp; m++) {  
                           const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                     const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                     const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                     const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                     const register double tmp0_0 = A_01 + A_10;  
                     const register double tmp6_1 = A_01*w1;  
                     const register double tmp5_1 = tmp0_0*w2;  
                     const register double tmp7_1 = A_10*w2;  
                     const register double tmp0_1 = A_00*w0;  
                     const register double tmp9_1 = tmp0_0*w1;  
                     const register double tmp8_1 = A_11*w5;  
                     const register double tmp2_1 = A_01*w2;  
                     const register double tmp4_1 = A_11*w4;  
                     const register double tmp1_1 = A_10*w1;  
                     const register double tmp3_1 = A_00*w3;  
                     EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                     EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp3_1 + tmp4_1 + tmp5_1;  
                     EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp3_1;  
                     EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1 + tmp6_1;  
                     EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp3_1;  
                     EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp0_1 + tmp7_1;  
                     EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp3_1 + tmp6_1 + tmp7_1 + tmp8_1;  
                     EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1 + tmp3_1 + tmp8_1;  
                     EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp3_1;  
                     EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp7_1;  
                     EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp3_1 + tmp4_1 + tmp9_1;  
                     EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp6_1;  
                     EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                     EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp3_1;  
3657                  }                  }
3658              }                  // ADD EM_F  and EM_S
3659          }              } // end colouring
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 for (index_t m=0; m<numComp; m++) {  
                     const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                     const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                     const register double tmp2_1 = B_0*w7;  
                     const register double tmp1_1 = B_1*w8;  
                     const register double tmp0_1 = B_0*w6;  
                     const register double tmp3_1 = B_1*w9;  
                     EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                 }  
             }  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 for (index_t m=0; m<numComp; m++) {  
                     const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                     const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                     const register double tmp1_1 = C_1*w8;  
                     const register double tmp3_1 = C_1*w9;  
                     const register double tmp0_1 = C_0*w6;  
                     const register double tmp2_1 = C_0*w7;  
                     EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1;  
                 }  
             }  
3660          }          }
3661          ///////////////  
3662          // process D //          if (m_faceOffset[1] > -1) {
3663          ///////////////              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring            
3664          if (!D.isEmpty()) {                  bool add_EM_S=false;
3665              add_EM_S=true;                  bool add_EM_F=false;
3666              const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);                  vector<double> EM_S(4*4, 0);
3667              for (index_t k=0; k<numEq; k++) {                  vector<double> EM_F(4, 0);
3668                  for (index_t m=0; m<numComp; m++) {  #pragma omp for nowait
3669                      const register double D_0 = D_p[INDEX2(k, m, numEq)];                  for (index_t k1=k1_0; k1<m_NE1; k1+=2) {
3670                      const register double tmp0_1 = D_0*w10;                      const index_t e = m_faceOffset[1]+k1;
3671                      EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1;                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_1 TOP */
3672                      EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp0_1;                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_1 BOTTOM */
                     EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp0_1;  
3673                  }                  }
3674              }                  // ADD EM_F  and EM_S
3675          }              } // end colouring
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                 const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                 const register double tmp0_1 = X_0*w11;  
                 const register double tmp2_1 = X_0*w13;  
                 const register double tmp1_1 = X_1*w12;  
                 const register double tmp3_1 = X_1*w14;  
                 EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                 EM_F[INDEX2(k,1,numEq)]+=tmp2_1;  
                 EM_F[INDEX2(k,2,numEq)]+=tmp0_1 + tmp3_1;  
                 EM_F[INDEX2(k,3,numEq)]+=tmp2_1;  
             }  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 const register double Y_0 = Y_p[k];  
                 const register double tmp0_1 = Y_0*w15;  
                 EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                 EM_F[INDEX2(k,2,numEq)]+=tmp0_1;  
             }  
3676          }          }
                       /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_0 BOTTOM */  
                     }  
                     // ADD EM_F  and EM_S  
         } // end colouring  
             }  
3677    
3678              if (m_faceOffset[1] > -1) {          if (m_faceOffset[2] > -1) {
3679              for (index_t k1_0=0; k1_0<2; k1_0++) { // colouring                          for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3680                    bool add_EM_S=false;
3681                    bool add_EM_F=false;
3682                    vector<double> EM_S(4*4, 0);
3683                    vector<double> EM_F(4, 0);
3684  #pragma omp for nowait  #pragma omp for nowait
3685                      for (index_t k1=k1_0; k1<m_NE1; k1+=2) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3686                /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_1 TOP */                      const index_t e = m_faceOffset[2]+k0;
3687          ///////////////                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_2 TOP */
3688          // process A //                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_2 BOTTOM */
         ///////////////  
         if (!A.isEmpty()) {  
             add_EM_S=true;  
             const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                       for (index_t m=0; m<numComp; m++) {  
                           const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                     const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                     const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                     const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                     const register double tmp0_0 = A_01 + A_10;  
                     const register double tmp7_1 = A_01*w1;  
                     const register double tmp6_1 = tmp0_0*w2;  
                     const register double tmp2_1 = A_10*w2;  
                     const register double tmp0_1 = A_00*w0;  
                     const register double tmp9_1 = tmp0_0*w1;  
                     const register double tmp8_1 = A_11*w5;  
                     const register double tmp1_1 = A_01*w2;  
                     const register double tmp5_1 = A_11*w4;  
                     const register double tmp3_1 = A_10*w1;  
                     const register double tmp4_1 = A_00*w3;  
                     EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                     EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp4_1;  
                     EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp6_1;  
                     EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp2_1 + tmp4_1 + tmp7_1 + tmp8_1;  
                     EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                     EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp4_1;  
                     EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp4_1;  
                     EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp1_1 + tmp3_1 + tmp4_1 + tmp8_1;  
                     EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp7_1;  
                     EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp4_1;  
                     EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1 + tmp7_1;  
                     EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp4_1 + tmp5_1 + tmp9_1;  
                 }  
             }  
         }  
         ///////////////  
         // process B //  
         ///////////////  
         if (!B.isEmpty()) {  
             add_EM_S=true;  
             const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 for (index_t m=0; m<numComp; m++) {  
                     const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                     const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                     const register double tmp0_1 = B_0*w7;  
                     const register double tmp3_1 = B_1*w8;  
                     const register double tmp1_1 = B_1*w9;  
                     const register double tmp2_1 = B_0*w6;  
                     EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                 }  
             }  
         }  
         ///////////////  
         // process C //  
         ///////////////  
         if (!C.isEmpty()) {  
             add_EM_S=true;  
             const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 for (index_t m=0; m<numComp; m++) {  
                     const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                     const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                     const register double tmp3_1 = C_1*w8;  
                     const register double tmp2_1 = C_0*w6;  
                     const register double tmp1_1 = C_1*w9;  
                     const register double tmp0_1 = C_0*w7;  
                     EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                     EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                     EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                 }  
             }  
         }  
         ///////////////  
         // process D //  
         ///////////////  
         if (!D.isEmpty()) {  
             add_EM_S=true;  
             const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 for (index_t m=0; m<numComp; m++) {  
                     const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                     const register double tmp0_1 = D_0*w10;  
                     EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp0_1;  
                     EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1;  
3689                  }                  }
3690              }                  // ADD EM_F  and EM_S
3691          }              } // end colouring
         ///////////////  
         // process X //  
         ///////////////  
         if (!X.isEmpty()) {  
             add_EM_F=true;  
             const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                 const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                 const register double tmp0_1 = X_0*w11;  
                 const register double tmp1_1 = X_0*w13;  
                 const register double tmp2_1 = X_1*w12;  
                 const register double tmp3_1 = X_1*w14;  
                 EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                 EM_F[INDEX2(k,1,numEq)]+=tmp1_1 + tmp2_1;  
                 EM_F[INDEX2(k,2,numEq)]+=tmp0_1;  
                 EM_F[INDEX2(k,3,numEq)]+=tmp1_1 + tmp3_1;  
             }  
         }  
         ///////////////  
         // process Y //  
         ///////////////  
         if (!Y.isEmpty()) {  
             add_EM_F=true;  
             const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
             for (index_t k=0; k<numEq; k++) {  
                 const register double Y_0 = Y_p[k];  
                 const register double tmp0_1 = Y_0*w15;  
                 EM_F[INDEX2(k,1,numEq)]+=tmp0_1;  
                 EM_F[INDEX2(k,3,numEq)]+=tmp0_1;  
             }  
3692          }          }
                       /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_1 BOTTOM */  
                     }  
                      // ADD EM_F  and EM_S  
                 } // end colouring  
             }  
3693    
3694              if (m_faceOffset[2] > -1) {          if (m_faceOffset[3] > -1) {
3695             for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring
3696  #pragma omp for nowait                  bool add_EM_S=false;
3697                    for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  bool add_EM_F=false;
3698                        /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_2 TOP */                  vector<double> EM_S(4*4, 0);
3699                        ///////////////                  vector<double> EM_F(4, 0);
                       // process A //  
                       ///////////////  
                       if (!A.isEmpty()) {  
                           add_EM_S=true;  
                           const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
                           for (index_t k=0; k<numEq; k++) {  
                                     for (index_t m=0; m<numComp; m++) {  
                                         const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                                   const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                                   const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                                   const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                                   const register double tmp0_0 = A_01 + A_10;  
                                   const register double tmp7_1 = A_10*w17;  
                                   const register double tmp3_1 = A_01*w17;  
                                   const register double tmp5_1 = A_00*w21;  
                                   const register double tmp1_1 = A_11*w19;  
                                   const register double tmp2_1 = A_00*w16;  
                                   const register double tmp9_1 = tmp0_0*w18;  
                                   const register double tmp6_1 = tmp0_0*w17;  
                                   const register double tmp8_1 = A_01*w18;  
                                   const register double tmp4_1 = A_11*w20;  
                                   const register double tmp0_1 = A_10*w18;  
                                   EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1 + tmp2_1 + tmp3_1;  
                                   EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                                   EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1;  
                                   EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp1_1 + tmp5_1 + tmp6_1;  
                                   EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1;  
                                   EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp0_1 + tmp4_1;  
                                   EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp4_1 + tmp7_1;  
                                   EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp4_1 + tmp7_1;  
                                   EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp4_1 + tmp8_1;  
                                   EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp0_1 + tmp4_1;  
                                   EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp3_1 + tmp4_1;  
                                   EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp1_1;  
                                   EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp1_1;  
                                   EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp1_1 + tmp2_1 + tmp7_1 + tmp8_1;  
                                   EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp4_1 + tmp8_1;  
                                   EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp1_1 + tmp5_1 + tmp9_1;  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process B //  
                       ///////////////  
                       if (!B.isEmpty()) {  
                           add_EM_S=true;  
                           const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                           for (index_t k=0; k<numEq; k++) {  
                               for (index_t m=0; m<numComp; m++) {  
                                   const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                                   const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                                   const register double tmp1_1 = B_0*w8;  
                                   const register double tmp2_1 = B_1*w23;  
                                   const register double tmp0_1 = B_1*w22;  
                                   const register double tmp3_1 = B_0*w9;  
                                   EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                   EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                   EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                                   EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process C //  
                       ///////////////  
                       if (!C.isEmpty()) {  
                           add_EM_S=true;  
                           const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                           for (index_t k=0; k<numEq; k++) {  
                               for (index_t m=0; m<numComp; m++) {  
                                   const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                                   const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                                   const register double tmp2_1 = C_1*w23;  
                                   const register double tmp0_1 = C_1*w22;  
                                   const register double tmp1_1 = C_0*w9;  
                                   const register double tmp3_1 = C_0*w8;  
                                   EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                   EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                                   EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1 + tmp3_1;  
                                   EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp2_1;  
                                   EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process D //  
                       ///////////////  
                       if (!D.isEmpty()) {  
                           add_EM_S=true;  
                           const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                           for (index_t k=0; k<numEq; k++) {  
                               for (index_t m=0; m<numComp; m++) {  
                                   const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                                   const register double tmp0_1 = D_0*w24;  
                                   EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                                   EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1;  
                                   EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                                   EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1;  
                               }  
                           }  
                       }  
                       ///////////////  
                       // process X //  
                       ///////////////  
                       if (!X.isEmpty()) {  
                           add_EM_F=true;  
                           const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                           for (index_t k=0; k<numEq; k++) {  
                               const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                               const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                               const register double tmp1_1 = X_0*w12;  
                               const register double tmp2_1 = X_0*w14;  
                               const register double tmp0_1 = X_1*w25;  
                               const register double tmp3_1 = X_1*w26;  
                               EM_F[INDEX2(k,0,numEq)]+=tmp0_1 + tmp1_1;  
                               EM_F[INDEX2(k,1,numEq)]+=tmp0_1 + tmp2_1;  
                               EM_F[INDEX2(k,2,numEq)]+=tmp3_1;  
                               EM_F[INDEX2(k,3,numEq)]+=tmp3_1;  
                           }  
                       }  
                       ///////////////  
                       // process Y //  
                       ///////////////  
                       if (!Y.isEmpty()) {  
                           add_EM_F=true;  
                           const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                           for (index_t k=0; k<numEq; k++) {  
                               const register double Y_0 = Y_p[k];  
                               const register double tmp0_1 = Y_0*w27;  
                               EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                               EM_F[INDEX2(k,1,numEq)]+=tmp0_1;  
                           }  
                       }  
                       /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_2 BOTTOM */  
                   }  
                   // ADD EM_F  and EM_S  
                } // end colouring  
             }  
   
             if (m_faceOffset[3] > -1) {  
              for (index_t k0_0=0; k0_0<2; k0_0++) { // colouring  
3700  #pragma omp for nowait  #pragma omp for nowait
3701                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {                  for (index_t k0 = 0; k0 < m_NE0; ++k0) {
3702                         /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_3 TOP */                      const index_t e = m_faceOffset[3]+k0;
3703                         ///////////////                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_3 TOP */
3704                         // process A //                      /* GENERATOR SNIP_PDEBC_SYSTEM_REDUCED_3 BOTTOM */
                        ///////////////  
                        if (!A.isEmpty()) {  
                            add_EM_S=true;  
                            const double* A_p=const_cast<escript::Data*>(&A)->getSampleDataRO(e);  
                            for (index_t k=0; k<numEq; k++) {  
                                      for (index_t m=0; m<numComp; m++) {  
                                          const register double A_00 = A_p[INDEX4(k,0,m,0, numEq,2, numComp)];  
                                    const register double A_01 = A_p[INDEX4(k,0,m,1, numEq,2, numComp)];  
                                    const register double A_10 = A_p[INDEX4(k,1,m,0, numEq,2, numComp)];  
                                    const register double A_11 = A_p[INDEX4(k,1,m,1, numEq,2, numComp)];  
                                    const register double tmp0_0 = A_01 + A_10;  
                                    const register double tmp2_1 = A_10*w17;  
                                    const register double tmp5_1 = A_01*w17;  
                                    const register double tmp6_1 = A_00*w21;  
                                    const register double tmp0_1 = A_11*w19;  
                                    const register double tmp4_1 = A_00*w16;  
                                    const register double tmp9_1 = tmp0_0*w18;  
                                    const register double tmp7_1 = tmp0_0*w17;  
                                    const register double tmp8_1 = A_01*w18;  
                                    const register double tmp1_1 = A_11*w20;  
                                    const register double tmp3_1 = A_10*w18;  
                                    EM_S[INDEX4(k,m,0,1,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                    EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp3_1 + tmp4_1 + tmp5_1;  
                                    EM_S[INDEX4(k,m,0,0,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp0_1 + tmp6_1 + tmp7_1;  
                                    EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp1_1 + tmp8_1;  
                                    EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp1_1 + tmp8_1;  
                                    EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp1_1 + tmp5_1;  
                                    EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                    EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp1_1 + tmp5_1;  
                                    EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                                    EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1 + tmp2_1 + tmp4_1 + tmp8_1;  
                                    EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp0_1 + tmp6_1 + tmp9_1;  
                                    EM_S[INDEX4(k,m,1,0,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp1_1 + tmp3_1;  
                                    EM_S[INDEX4(k,m,1,1,numEq,numComp,4)]+=tmp0_1;  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process B //  
                        ///////////////  
                        if (!B.isEmpty()) {  
                            add_EM_S=true;  
                            const double* B_p=const_cast<escript::Data*>(&B)->getSampleDataRO(e);  
                            for (index_t k=0; k<numEq; k++) {  
                                for (index_t m=0; m<numComp; m++) {  
                                    const register double B_0 = B_p[INDEX3(k,0,m, numEq, 2)];  
                                    const register double B_1 = B_p[INDEX3(k,1,m, numEq, 2)];  
                                    const register double tmp3_1 = B_0*w8;  
                                    const register double tmp2_1 = B_1*w23;  
                                    const register double tmp0_1 = B_1*w22;  
                                    const register double tmp1_1 = B_0*w9;  
                                    EM_S[INDEX4(k,m,1,2,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                    EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                    EM_S[INDEX4(k,m,0,2,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,1,3,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                                    EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp2_1 + tmp3_1;  
                                    EM_S[INDEX4(k,m,0,3,numEq,numComp,4)]+=tmp0_1;  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process C //  
                        ///////////////  
                        if (!C.isEmpty()) {  
                            add_EM_S=true;  
                            const double* C_p=const_cast<escript::Data*>(&C)->getSampleDataRO(e);  
                            for (index_t k=0; k<numEq; k++) {  
                                for (index_t m=0; m<numComp; m++) {  
                                    const register double C_0 = C_p[INDEX3(k, m, 0, numEq, numComp)];  
                                    const register double C_1 = C_p[INDEX3(k, m, 1, numEq, numComp)];  
                                    const register double tmp1_1 = C_1*w23;  
                                    const register double tmp3_1 = C_1*w22;  
                                    const register double tmp0_1 = C_0*w8;  
                                    const register double tmp2_1 = C_0*w9;  
                                    EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                    EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                    EM_S[INDEX4(k,m,3,0,numEq,numComp,4)]+=tmp3_1;  
                                    EM_S[INDEX4(k,m,3,1,numEq,numComp,4)]+=tmp3_1;  
                                    EM_S[INDEX4(k,m,2,1,numEq,numComp,4)]+=tmp3_1;  
                                    EM_S[INDEX4(k,m,2,0,numEq,numComp,4)]+=tmp3_1;  
                                    EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp1_1 + tmp2_1;  
                                    EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp0_1 + tmp1_1;  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process D //  
                        ///////////////  
                        if (!D.isEmpty()) {  
                            add_EM_S=true;  
                            const double* D_p=const_cast<escript::Data*>(&D)->getSampleDataRO(e);  
                            for (index_t k=0; k<numEq; k++) {  
                                for (index_t m=0; m<numComp; m++) {  
                                    const register double D_0 = D_p[INDEX2(k, m, numEq)];  
                                    const register double tmp0_1 = D_0*w24;  
                                    EM_S[INDEX4(k,m,3,2,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,3,3,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,2,3,numEq,numComp,4)]+=tmp0_1;  
                                    EM_S[INDEX4(k,m,2,2,numEq,numComp,4)]+=tmp0_1;  
                                }  
                            }  
                        }  
                        ///////////////  
                        // process X //  
                        ///////////////  
                        if (!X.isEmpty()) {  
                            add_EM_F=true;  
                            const double* X_p=const_cast<escript::Data*>(&X)->getSampleDataRO(e);  
                            for (index_t k=0; k<numEq; k++) {  
                                const register double X_0 = X_p[INDEX2(k, 0, numEq)];  
                                const register double X_1 = X_p[INDEX2(k, 1, numEq)];  
                                const register double tmp2_1 = X_0*w12;  
                                const register double tmp1_1 = X_1*w26;  
                                const register double tmp0_1 = X_1*w25;  
                                const register double tmp3_1 = X_0*w14;  
                                EM_F[INDEX2(k,0,numEq)]+=tmp0_1;  
                                EM_F[INDEX2(k,1,numEq)]+=tmp0_1;  
                                EM_F[INDEX2(k,2,numEq)]+=tmp1_1 + tmp2_1;  
                                EM_F[INDEX2(k,3,numEq)]+=tmp1_1 + tmp3_1;  
                            }  
                        }  
                        ///////////////  
                        // process Y //  
                        ///////////////  
                        if (!Y.isEmpty()) {  
                            add_EM_F=true;  
                            const double* Y_p=const_cast<escript::Data*>(&Y)->getSampleDataRO(e);  
                            for (index_t k=0; k<numEq; k++) {  
                                const register double Y_0 = Y_p[k];  
                                const register double tmp0_1 = Y_0*w27;  
                                EM_F[INDEX2(k,2,numEq)]+=tmp0_1;  
                                EM_F[INDEX2(k,3,numEq)]+=tmp0_1;