~ubuntu-branches/ubuntu/raring/ffc/raring

« back to all changes in this revision

Viewing changes to test/regression/references/VectorLaplaceGradCurl.h

  • Committer: Bazaar Package Importer
  • Author(s): Johannes Ring
  • Date: 2010-07-01 19:54:32 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20100701195432-xz3gw5nprdj79jcb
Tags: 0.9.3-1
* New upstream release.
* debian/control:
  - Minor fix in Vcs fields.
  - Bump Standards-Version to 3.9.0 (no changes needed).
  - Update version for python-ufc, python-fiat, and python-ufl in
    Depends field.
* Switch to dpkg-source 3.0 (quilt) format.
* Update debian/copyright and debian/copyright_hints.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// This code conforms with the UFC specification version 1.4
2
 
// and was automatically generated by FFC version 0.9.2.
 
1
// This code conforms with the UFC specification version 1.4.1
 
2
// and was automatically generated by FFC version 0.9.3.
3
3
// 
4
4
// This code was generated with the following parameters:
5
5
// 
124
124
    
125
125
    // Reset values.
126
126
    *values = 0.00000000;
127
 
    
128
 
    // Map degree of freedom to element degree of freedom
129
 
    const unsigned int dof = i;
130
 
    
131
 
    // Array of basisvalues.
132
 
    double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
133
 
    
134
 
    // Declare helper variables.
135
 
    unsigned int rr = 0;
136
 
    unsigned int ss = 0;
137
 
    unsigned int tt = 0;
138
 
    double tmp5 = 0.00000000;
139
 
    double tmp6 = 0.00000000;
140
 
    double tmp7 = 0.00000000;
141
 
    double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
142
 
    double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
143
 
    double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
144
 
    double tmp3 = 0.50000000*(1.00000000 - Z);
145
 
    double tmp4 = tmp3*tmp3;
146
 
    
147
 
    // Compute basisvalues.
148
 
    basisvalues[0] = 1.00000000;
149
 
    basisvalues[1] = tmp0;
150
 
    for (unsigned int r = 1; r < 2; r++)
151
 
    {
152
 
      rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
153
 
      ss = r*(r + 1)*(r + 2)/6;
154
 
      tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
155
 
      basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
156
 
    }// end loop over 'r'
157
 
    for (unsigned int r = 0; r < 2; r++)
158
 
    {
159
 
      rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
160
 
      ss = r*(r + 1)*(r + 2)/6;
161
 
      basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
162
 
    }// end loop over 'r'
163
 
    for (unsigned int r = 0; r < 1; r++)
164
 
    {
165
 
      for (unsigned int s = 1; s < 2 - r; s++)
166
 
      {
167
 
        rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
168
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
169
 
        tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
170
 
        tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
171
 
        tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
172
 
        tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
173
 
        basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
174
 
      }// end loop over 's'
175
 
    }// end loop over 'r'
176
 
    for (unsigned int r = 0; r < 2; r++)
177
 
    {
178
 
      for (unsigned int s = 0; s < 2 - r; s++)
179
 
      {
180
 
        rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
181
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
182
 
        basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
183
 
      }// end loop over 's'
184
 
    }// end loop over 'r'
185
 
    for (unsigned int r = 0; r < 1; r++)
186
 
    {
187
 
      for (unsigned int s = 0; s < 1 - r; s++)
188
 
      {
189
 
        for (unsigned int t = 1; t < 2 - r - s; t++)
190
 
        {
191
 
          rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
192
 
          ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
193
 
          tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
194
 
          tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
195
 
          tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
196
 
          tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
197
 
          basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
198
 
        }// end loop over 't'
199
 
      }// end loop over 's'
200
 
    }// end loop over 'r'
201
 
    for (unsigned int r = 0; r < 3; r++)
202
 
    {
203
 
      for (unsigned int s = 0; s < 3 - r; s++)
204
 
      {
205
 
        for (unsigned int t = 0; t < 3 - r - s; t++)
206
 
        {
207
 
          rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
208
 
          basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
209
 
        }// end loop over 't'
210
 
      }// end loop over 's'
211
 
    }// end loop over 'r'
212
 
    
213
 
    // Table(s) of coefficients.
214
 
    static const double coefficients0[10][10] = \
215
 
    {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
216
 
    {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
217
 
    {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
218
 
    {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
219
 
    {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
220
 
    {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
221
 
    {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
222
 
    {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
223
 
    {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
224
 
    {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
225
 
    
226
 
    // Compute value(s).
227
 
    for (unsigned int r = 0; r < 10; r++)
228
 
    {
229
 
      *values += coefficients0[dof][r]*basisvalues[r];
230
 
    }// end loop over 'r'
 
127
    switch (i)
 
128
    {
 
129
    case 0:
 
130
      {
 
131
        
 
132
      // Array of basisvalues.
 
133
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
134
      
 
135
      // Declare helper variables.
 
136
      unsigned int rr = 0;
 
137
      unsigned int ss = 0;
 
138
      unsigned int tt = 0;
 
139
      double tmp5 = 0.00000000;
 
140
      double tmp6 = 0.00000000;
 
141
      double tmp7 = 0.00000000;
 
142
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
143
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
144
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
145
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
146
      double tmp4 = tmp3*tmp3;
 
147
      
 
148
      // Compute basisvalues.
 
149
      basisvalues[0] = 1.00000000;
 
150
      basisvalues[1] = tmp0;
 
151
      for (unsigned int r = 1; r < 2; r++)
 
152
      {
 
153
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
154
        ss = r*(r + 1)*(r + 2)/6;
 
155
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
156
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
157
      }// end loop over 'r'
 
158
      for (unsigned int r = 0; r < 2; r++)
 
159
      {
 
160
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
161
        ss = r*(r + 1)*(r + 2)/6;
 
162
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
163
      }// end loop over 'r'
 
164
      for (unsigned int r = 0; r < 1; r++)
 
165
      {
 
166
        for (unsigned int s = 1; s < 2 - r; s++)
 
167
        {
 
168
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
169
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
170
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
171
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
172
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
173
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
174
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
175
        }// end loop over 's'
 
176
      }// end loop over 'r'
 
177
      for (unsigned int r = 0; r < 2; r++)
 
178
      {
 
179
        for (unsigned int s = 0; s < 2 - r; s++)
 
180
        {
 
181
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
182
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
183
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
184
        }// end loop over 's'
 
185
      }// end loop over 'r'
 
186
      for (unsigned int r = 0; r < 1; r++)
 
187
      {
 
188
        for (unsigned int s = 0; s < 1 - r; s++)
 
189
        {
 
190
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
191
          {
 
192
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
193
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
194
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
195
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
196
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
197
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
198
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
199
          }// end loop over 't'
 
200
        }// end loop over 's'
 
201
      }// end loop over 'r'
 
202
      for (unsigned int r = 0; r < 3; r++)
 
203
      {
 
204
        for (unsigned int s = 0; s < 3 - r; s++)
 
205
        {
 
206
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
207
          {
 
208
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
209
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
210
          }// end loop over 't'
 
211
        }// end loop over 's'
 
212
      }// end loop over 'r'
 
213
      
 
214
      // Table(s) of coefficients.
 
215
      static const double coefficients0[10] = \
 
216
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
217
      
 
218
      // Compute value(s).
 
219
      for (unsigned int r = 0; r < 10; r++)
 
220
      {
 
221
        *values += coefficients0[r]*basisvalues[r];
 
222
      }// end loop over 'r'
 
223
        break;
 
224
      }
 
225
    case 1:
 
226
      {
 
227
        
 
228
      // Array of basisvalues.
 
229
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
230
      
 
231
      // Declare helper variables.
 
232
      unsigned int rr = 0;
 
233
      unsigned int ss = 0;
 
234
      unsigned int tt = 0;
 
235
      double tmp5 = 0.00000000;
 
236
      double tmp6 = 0.00000000;
 
237
      double tmp7 = 0.00000000;
 
238
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
239
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
240
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
241
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
242
      double tmp4 = tmp3*tmp3;
 
243
      
 
244
      // Compute basisvalues.
 
245
      basisvalues[0] = 1.00000000;
 
246
      basisvalues[1] = tmp0;
 
247
      for (unsigned int r = 1; r < 2; r++)
 
248
      {
 
249
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
250
        ss = r*(r + 1)*(r + 2)/6;
 
251
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
252
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
253
      }// end loop over 'r'
 
254
      for (unsigned int r = 0; r < 2; r++)
 
255
      {
 
256
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
257
        ss = r*(r + 1)*(r + 2)/6;
 
258
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
259
      }// end loop over 'r'
 
260
      for (unsigned int r = 0; r < 1; r++)
 
261
      {
 
262
        for (unsigned int s = 1; s < 2 - r; s++)
 
263
        {
 
264
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
265
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
266
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
267
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
268
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
269
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
270
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
271
        }// end loop over 's'
 
272
      }// end loop over 'r'
 
273
      for (unsigned int r = 0; r < 2; r++)
 
274
      {
 
275
        for (unsigned int s = 0; s < 2 - r; s++)
 
276
        {
 
277
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
278
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
279
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
280
        }// end loop over 's'
 
281
      }// end loop over 'r'
 
282
      for (unsigned int r = 0; r < 1; r++)
 
283
      {
 
284
        for (unsigned int s = 0; s < 1 - r; s++)
 
285
        {
 
286
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
287
          {
 
288
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
289
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
290
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
291
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
292
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
293
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
294
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
295
          }// end loop over 't'
 
296
        }// end loop over 's'
 
297
      }// end loop over 'r'
 
298
      for (unsigned int r = 0; r < 3; r++)
 
299
      {
 
300
        for (unsigned int s = 0; s < 3 - r; s++)
 
301
        {
 
302
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
303
          {
 
304
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
305
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
306
          }// end loop over 't'
 
307
        }// end loop over 's'
 
308
      }// end loop over 'r'
 
309
      
 
310
      // Table(s) of coefficients.
 
311
      static const double coefficients0[10] = \
 
312
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
313
      
 
314
      // Compute value(s).
 
315
      for (unsigned int r = 0; r < 10; r++)
 
316
      {
 
317
        *values += coefficients0[r]*basisvalues[r];
 
318
      }// end loop over 'r'
 
319
        break;
 
320
      }
 
321
    case 2:
 
322
      {
 
323
        
 
324
      // Array of basisvalues.
 
325
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
326
      
 
327
      // Declare helper variables.
 
328
      unsigned int rr = 0;
 
329
      unsigned int ss = 0;
 
330
      unsigned int tt = 0;
 
331
      double tmp5 = 0.00000000;
 
332
      double tmp6 = 0.00000000;
 
333
      double tmp7 = 0.00000000;
 
334
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
335
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
336
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
337
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
338
      double tmp4 = tmp3*tmp3;
 
339
      
 
340
      // Compute basisvalues.
 
341
      basisvalues[0] = 1.00000000;
 
342
      basisvalues[1] = tmp0;
 
343
      for (unsigned int r = 1; r < 2; r++)
 
344
      {
 
345
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
346
        ss = r*(r + 1)*(r + 2)/6;
 
347
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
348
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
349
      }// end loop over 'r'
 
350
      for (unsigned int r = 0; r < 2; r++)
 
351
      {
 
352
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
353
        ss = r*(r + 1)*(r + 2)/6;
 
354
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
355
      }// end loop over 'r'
 
356
      for (unsigned int r = 0; r < 1; r++)
 
357
      {
 
358
        for (unsigned int s = 1; s < 2 - r; s++)
 
359
        {
 
360
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
361
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
362
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
363
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
364
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
365
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
366
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
367
        }// end loop over 's'
 
368
      }// end loop over 'r'
 
369
      for (unsigned int r = 0; r < 2; r++)
 
370
      {
 
371
        for (unsigned int s = 0; s < 2 - r; s++)
 
372
        {
 
373
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
374
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
375
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
376
        }// end loop over 's'
 
377
      }// end loop over 'r'
 
378
      for (unsigned int r = 0; r < 1; r++)
 
379
      {
 
380
        for (unsigned int s = 0; s < 1 - r; s++)
 
381
        {
 
382
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
383
          {
 
384
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
385
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
386
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
387
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
388
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
389
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
390
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
391
          }// end loop over 't'
 
392
        }// end loop over 's'
 
393
      }// end loop over 'r'
 
394
      for (unsigned int r = 0; r < 3; r++)
 
395
      {
 
396
        for (unsigned int s = 0; s < 3 - r; s++)
 
397
        {
 
398
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
399
          {
 
400
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
401
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
402
          }// end loop over 't'
 
403
        }// end loop over 's'
 
404
      }// end loop over 'r'
 
405
      
 
406
      // Table(s) of coefficients.
 
407
      static const double coefficients0[10] = \
 
408
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
409
      
 
410
      // Compute value(s).
 
411
      for (unsigned int r = 0; r < 10; r++)
 
412
      {
 
413
        *values += coefficients0[r]*basisvalues[r];
 
414
      }// end loop over 'r'
 
415
        break;
 
416
      }
 
417
    case 3:
 
418
      {
 
419
        
 
420
      // Array of basisvalues.
 
421
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
422
      
 
423
      // Declare helper variables.
 
424
      unsigned int rr = 0;
 
425
      unsigned int ss = 0;
 
426
      unsigned int tt = 0;
 
427
      double tmp5 = 0.00000000;
 
428
      double tmp6 = 0.00000000;
 
429
      double tmp7 = 0.00000000;
 
430
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
431
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
432
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
433
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
434
      double tmp4 = tmp3*tmp3;
 
435
      
 
436
      // Compute basisvalues.
 
437
      basisvalues[0] = 1.00000000;
 
438
      basisvalues[1] = tmp0;
 
439
      for (unsigned int r = 1; r < 2; r++)
 
440
      {
 
441
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
442
        ss = r*(r + 1)*(r + 2)/6;
 
443
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
444
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
445
      }// end loop over 'r'
 
446
      for (unsigned int r = 0; r < 2; r++)
 
447
      {
 
448
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
449
        ss = r*(r + 1)*(r + 2)/6;
 
450
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
451
      }// end loop over 'r'
 
452
      for (unsigned int r = 0; r < 1; r++)
 
453
      {
 
454
        for (unsigned int s = 1; s < 2 - r; s++)
 
455
        {
 
456
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
457
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
458
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
459
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
460
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
461
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
462
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
463
        }// end loop over 's'
 
464
      }// end loop over 'r'
 
465
      for (unsigned int r = 0; r < 2; r++)
 
466
      {
 
467
        for (unsigned int s = 0; s < 2 - r; s++)
 
468
        {
 
469
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
470
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
471
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
472
        }// end loop over 's'
 
473
      }// end loop over 'r'
 
474
      for (unsigned int r = 0; r < 1; r++)
 
475
      {
 
476
        for (unsigned int s = 0; s < 1 - r; s++)
 
477
        {
 
478
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
479
          {
 
480
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
481
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
482
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
483
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
484
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
485
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
486
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
487
          }// end loop over 't'
 
488
        }// end loop over 's'
 
489
      }// end loop over 'r'
 
490
      for (unsigned int r = 0; r < 3; r++)
 
491
      {
 
492
        for (unsigned int s = 0; s < 3 - r; s++)
 
493
        {
 
494
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
495
          {
 
496
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
497
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
498
          }// end loop over 't'
 
499
        }// end loop over 's'
 
500
      }// end loop over 'r'
 
501
      
 
502
      // Table(s) of coefficients.
 
503
      static const double coefficients0[10] = \
 
504
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
505
      
 
506
      // Compute value(s).
 
507
      for (unsigned int r = 0; r < 10; r++)
 
508
      {
 
509
        *values += coefficients0[r]*basisvalues[r];
 
510
      }// end loop over 'r'
 
511
        break;
 
512
      }
 
513
    case 4:
 
514
      {
 
515
        
 
516
      // Array of basisvalues.
 
517
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
518
      
 
519
      // Declare helper variables.
 
520
      unsigned int rr = 0;
 
521
      unsigned int ss = 0;
 
522
      unsigned int tt = 0;
 
523
      double tmp5 = 0.00000000;
 
524
      double tmp6 = 0.00000000;
 
525
      double tmp7 = 0.00000000;
 
526
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
527
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
528
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
529
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
530
      double tmp4 = tmp3*tmp3;
 
531
      
 
532
      // Compute basisvalues.
 
533
      basisvalues[0] = 1.00000000;
 
534
      basisvalues[1] = tmp0;
 
535
      for (unsigned int r = 1; r < 2; r++)
 
536
      {
 
537
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
538
        ss = r*(r + 1)*(r + 2)/6;
 
539
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
540
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
541
      }// end loop over 'r'
 
542
      for (unsigned int r = 0; r < 2; r++)
 
543
      {
 
544
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
545
        ss = r*(r + 1)*(r + 2)/6;
 
546
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
547
      }// end loop over 'r'
 
548
      for (unsigned int r = 0; r < 1; r++)
 
549
      {
 
550
        for (unsigned int s = 1; s < 2 - r; s++)
 
551
        {
 
552
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
553
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
554
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
555
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
556
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
557
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
558
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
559
        }// end loop over 's'
 
560
      }// end loop over 'r'
 
561
      for (unsigned int r = 0; r < 2; r++)
 
562
      {
 
563
        for (unsigned int s = 0; s < 2 - r; s++)
 
564
        {
 
565
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
566
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
567
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
568
        }// end loop over 's'
 
569
      }// end loop over 'r'
 
570
      for (unsigned int r = 0; r < 1; r++)
 
571
      {
 
572
        for (unsigned int s = 0; s < 1 - r; s++)
 
573
        {
 
574
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
575
          {
 
576
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
577
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
578
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
579
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
580
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
581
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
582
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
583
          }// end loop over 't'
 
584
        }// end loop over 's'
 
585
      }// end loop over 'r'
 
586
      for (unsigned int r = 0; r < 3; r++)
 
587
      {
 
588
        for (unsigned int s = 0; s < 3 - r; s++)
 
589
        {
 
590
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
591
          {
 
592
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
593
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
594
          }// end loop over 't'
 
595
        }// end loop over 's'
 
596
      }// end loop over 'r'
 
597
      
 
598
      // Table(s) of coefficients.
 
599
      static const double coefficients0[10] = \
 
600
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
601
      
 
602
      // Compute value(s).
 
603
      for (unsigned int r = 0; r < 10; r++)
 
604
      {
 
605
        *values += coefficients0[r]*basisvalues[r];
 
606
      }// end loop over 'r'
 
607
        break;
 
608
      }
 
609
    case 5:
 
610
      {
 
611
        
 
612
      // Array of basisvalues.
 
613
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
614
      
 
615
      // Declare helper variables.
 
616
      unsigned int rr = 0;
 
617
      unsigned int ss = 0;
 
618
      unsigned int tt = 0;
 
619
      double tmp5 = 0.00000000;
 
620
      double tmp6 = 0.00000000;
 
621
      double tmp7 = 0.00000000;
 
622
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
623
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
624
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
625
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
626
      double tmp4 = tmp3*tmp3;
 
627
      
 
628
      // Compute basisvalues.
 
629
      basisvalues[0] = 1.00000000;
 
630
      basisvalues[1] = tmp0;
 
631
      for (unsigned int r = 1; r < 2; r++)
 
632
      {
 
633
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
634
        ss = r*(r + 1)*(r + 2)/6;
 
635
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
636
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
637
      }// end loop over 'r'
 
638
      for (unsigned int r = 0; r < 2; r++)
 
639
      {
 
640
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
641
        ss = r*(r + 1)*(r + 2)/6;
 
642
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
643
      }// end loop over 'r'
 
644
      for (unsigned int r = 0; r < 1; r++)
 
645
      {
 
646
        for (unsigned int s = 1; s < 2 - r; s++)
 
647
        {
 
648
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
649
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
650
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
651
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
652
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
653
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
654
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
655
        }// end loop over 's'
 
656
      }// end loop over 'r'
 
657
      for (unsigned int r = 0; r < 2; r++)
 
658
      {
 
659
        for (unsigned int s = 0; s < 2 - r; s++)
 
660
        {
 
661
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
662
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
663
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
664
        }// end loop over 's'
 
665
      }// end loop over 'r'
 
666
      for (unsigned int r = 0; r < 1; r++)
 
667
      {
 
668
        for (unsigned int s = 0; s < 1 - r; s++)
 
669
        {
 
670
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
671
          {
 
672
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
673
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
674
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
675
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
676
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
677
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
678
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
679
          }// end loop over 't'
 
680
        }// end loop over 's'
 
681
      }// end loop over 'r'
 
682
      for (unsigned int r = 0; r < 3; r++)
 
683
      {
 
684
        for (unsigned int s = 0; s < 3 - r; s++)
 
685
        {
 
686
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
687
          {
 
688
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
689
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
690
          }// end loop over 't'
 
691
        }// end loop over 's'
 
692
      }// end loop over 'r'
 
693
      
 
694
      // Table(s) of coefficients.
 
695
      static const double coefficients0[10] = \
 
696
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
697
      
 
698
      // Compute value(s).
 
699
      for (unsigned int r = 0; r < 10; r++)
 
700
      {
 
701
        *values += coefficients0[r]*basisvalues[r];
 
702
      }// end loop over 'r'
 
703
        break;
 
704
      }
 
705
    case 6:
 
706
      {
 
707
        
 
708
      // Array of basisvalues.
 
709
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
710
      
 
711
      // Declare helper variables.
 
712
      unsigned int rr = 0;
 
713
      unsigned int ss = 0;
 
714
      unsigned int tt = 0;
 
715
      double tmp5 = 0.00000000;
 
716
      double tmp6 = 0.00000000;
 
717
      double tmp7 = 0.00000000;
 
718
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
719
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
720
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
721
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
722
      double tmp4 = tmp3*tmp3;
 
723
      
 
724
      // Compute basisvalues.
 
725
      basisvalues[0] = 1.00000000;
 
726
      basisvalues[1] = tmp0;
 
727
      for (unsigned int r = 1; r < 2; r++)
 
728
      {
 
729
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
730
        ss = r*(r + 1)*(r + 2)/6;
 
731
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
732
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
733
      }// end loop over 'r'
 
734
      for (unsigned int r = 0; r < 2; r++)
 
735
      {
 
736
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
737
        ss = r*(r + 1)*(r + 2)/6;
 
738
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
739
      }// end loop over 'r'
 
740
      for (unsigned int r = 0; r < 1; r++)
 
741
      {
 
742
        for (unsigned int s = 1; s < 2 - r; s++)
 
743
        {
 
744
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
745
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
746
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
747
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
748
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
749
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
750
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
751
        }// end loop over 's'
 
752
      }// end loop over 'r'
 
753
      for (unsigned int r = 0; r < 2; r++)
 
754
      {
 
755
        for (unsigned int s = 0; s < 2 - r; s++)
 
756
        {
 
757
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
758
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
759
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
760
        }// end loop over 's'
 
761
      }// end loop over 'r'
 
762
      for (unsigned int r = 0; r < 1; r++)
 
763
      {
 
764
        for (unsigned int s = 0; s < 1 - r; s++)
 
765
        {
 
766
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
767
          {
 
768
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
769
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
770
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
771
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
772
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
773
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
774
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
775
          }// end loop over 't'
 
776
        }// end loop over 's'
 
777
      }// end loop over 'r'
 
778
      for (unsigned int r = 0; r < 3; r++)
 
779
      {
 
780
        for (unsigned int s = 0; s < 3 - r; s++)
 
781
        {
 
782
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
783
          {
 
784
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
785
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
786
          }// end loop over 't'
 
787
        }// end loop over 's'
 
788
      }// end loop over 'r'
 
789
      
 
790
      // Table(s) of coefficients.
 
791
      static const double coefficients0[10] = \
 
792
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
793
      
 
794
      // Compute value(s).
 
795
      for (unsigned int r = 0; r < 10; r++)
 
796
      {
 
797
        *values += coefficients0[r]*basisvalues[r];
 
798
      }// end loop over 'r'
 
799
        break;
 
800
      }
 
801
    case 7:
 
802
      {
 
803
        
 
804
      // Array of basisvalues.
 
805
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
806
      
 
807
      // Declare helper variables.
 
808
      unsigned int rr = 0;
 
809
      unsigned int ss = 0;
 
810
      unsigned int tt = 0;
 
811
      double tmp5 = 0.00000000;
 
812
      double tmp6 = 0.00000000;
 
813
      double tmp7 = 0.00000000;
 
814
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
815
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
816
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
817
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
818
      double tmp4 = tmp3*tmp3;
 
819
      
 
820
      // Compute basisvalues.
 
821
      basisvalues[0] = 1.00000000;
 
822
      basisvalues[1] = tmp0;
 
823
      for (unsigned int r = 1; r < 2; r++)
 
824
      {
 
825
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
826
        ss = r*(r + 1)*(r + 2)/6;
 
827
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
828
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
829
      }// end loop over 'r'
 
830
      for (unsigned int r = 0; r < 2; r++)
 
831
      {
 
832
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
833
        ss = r*(r + 1)*(r + 2)/6;
 
834
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
835
      }// end loop over 'r'
 
836
      for (unsigned int r = 0; r < 1; r++)
 
837
      {
 
838
        for (unsigned int s = 1; s < 2 - r; s++)
 
839
        {
 
840
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
841
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
842
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
843
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
844
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
845
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
846
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
847
        }// end loop over 's'
 
848
      }// end loop over 'r'
 
849
      for (unsigned int r = 0; r < 2; r++)
 
850
      {
 
851
        for (unsigned int s = 0; s < 2 - r; s++)
 
852
        {
 
853
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
854
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
855
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
856
        }// end loop over 's'
 
857
      }// end loop over 'r'
 
858
      for (unsigned int r = 0; r < 1; r++)
 
859
      {
 
860
        for (unsigned int s = 0; s < 1 - r; s++)
 
861
        {
 
862
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
863
          {
 
864
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
865
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
866
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
867
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
868
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
869
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
870
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
871
          }// end loop over 't'
 
872
        }// end loop over 's'
 
873
      }// end loop over 'r'
 
874
      for (unsigned int r = 0; r < 3; r++)
 
875
      {
 
876
        for (unsigned int s = 0; s < 3 - r; s++)
 
877
        {
 
878
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
879
          {
 
880
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
881
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
882
          }// end loop over 't'
 
883
        }// end loop over 's'
 
884
      }// end loop over 'r'
 
885
      
 
886
      // Table(s) of coefficients.
 
887
      static const double coefficients0[10] = \
 
888
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
889
      
 
890
      // Compute value(s).
 
891
      for (unsigned int r = 0; r < 10; r++)
 
892
      {
 
893
        *values += coefficients0[r]*basisvalues[r];
 
894
      }// end loop over 'r'
 
895
        break;
 
896
      }
 
897
    case 8:
 
898
      {
 
899
        
 
900
      // Array of basisvalues.
 
901
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
902
      
 
903
      // Declare helper variables.
 
904
      unsigned int rr = 0;
 
905
      unsigned int ss = 0;
 
906
      unsigned int tt = 0;
 
907
      double tmp5 = 0.00000000;
 
908
      double tmp6 = 0.00000000;
 
909
      double tmp7 = 0.00000000;
 
910
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
911
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
912
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
913
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
914
      double tmp4 = tmp3*tmp3;
 
915
      
 
916
      // Compute basisvalues.
 
917
      basisvalues[0] = 1.00000000;
 
918
      basisvalues[1] = tmp0;
 
919
      for (unsigned int r = 1; r < 2; r++)
 
920
      {
 
921
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
922
        ss = r*(r + 1)*(r + 2)/6;
 
923
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
924
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
925
      }// end loop over 'r'
 
926
      for (unsigned int r = 0; r < 2; r++)
 
927
      {
 
928
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
929
        ss = r*(r + 1)*(r + 2)/6;
 
930
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
931
      }// end loop over 'r'
 
932
      for (unsigned int r = 0; r < 1; r++)
 
933
      {
 
934
        for (unsigned int s = 1; s < 2 - r; s++)
 
935
        {
 
936
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
937
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
938
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
939
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
940
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
941
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
942
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
943
        }// end loop over 's'
 
944
      }// end loop over 'r'
 
945
      for (unsigned int r = 0; r < 2; r++)
 
946
      {
 
947
        for (unsigned int s = 0; s < 2 - r; s++)
 
948
        {
 
949
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
950
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
951
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
952
        }// end loop over 's'
 
953
      }// end loop over 'r'
 
954
      for (unsigned int r = 0; r < 1; r++)
 
955
      {
 
956
        for (unsigned int s = 0; s < 1 - r; s++)
 
957
        {
 
958
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
959
          {
 
960
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
961
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
962
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
963
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
964
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
965
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
966
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
967
          }// end loop over 't'
 
968
        }// end loop over 's'
 
969
      }// end loop over 'r'
 
970
      for (unsigned int r = 0; r < 3; r++)
 
971
      {
 
972
        for (unsigned int s = 0; s < 3 - r; s++)
 
973
        {
 
974
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
975
          {
 
976
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
977
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
978
          }// end loop over 't'
 
979
        }// end loop over 's'
 
980
      }// end loop over 'r'
 
981
      
 
982
      // Table(s) of coefficients.
 
983
      static const double coefficients0[10] = \
 
984
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
985
      
 
986
      // Compute value(s).
 
987
      for (unsigned int r = 0; r < 10; r++)
 
988
      {
 
989
        *values += coefficients0[r]*basisvalues[r];
 
990
      }// end loop over 'r'
 
991
        break;
 
992
      }
 
993
    case 9:
 
994
      {
 
995
        
 
996
      // Array of basisvalues.
 
997
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
998
      
 
999
      // Declare helper variables.
 
1000
      unsigned int rr = 0;
 
1001
      unsigned int ss = 0;
 
1002
      unsigned int tt = 0;
 
1003
      double tmp5 = 0.00000000;
 
1004
      double tmp6 = 0.00000000;
 
1005
      double tmp7 = 0.00000000;
 
1006
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
1007
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
1008
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
1009
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
1010
      double tmp4 = tmp3*tmp3;
 
1011
      
 
1012
      // Compute basisvalues.
 
1013
      basisvalues[0] = 1.00000000;
 
1014
      basisvalues[1] = tmp0;
 
1015
      for (unsigned int r = 1; r < 2; r++)
 
1016
      {
 
1017
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1018
        ss = r*(r + 1)*(r + 2)/6;
 
1019
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1020
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
1021
      }// end loop over 'r'
 
1022
      for (unsigned int r = 0; r < 2; r++)
 
1023
      {
 
1024
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1025
        ss = r*(r + 1)*(r + 2)/6;
 
1026
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
1027
      }// end loop over 'r'
 
1028
      for (unsigned int r = 0; r < 1; r++)
 
1029
      {
 
1030
        for (unsigned int s = 1; s < 2 - r; s++)
 
1031
        {
 
1032
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1033
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1034
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1035
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1036
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1037
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1038
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1039
        }// end loop over 's'
 
1040
      }// end loop over 'r'
 
1041
      for (unsigned int r = 0; r < 2; r++)
 
1042
      {
 
1043
        for (unsigned int s = 0; s < 2 - r; s++)
 
1044
        {
 
1045
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1046
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1047
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
1048
        }// end loop over 's'
 
1049
      }// end loop over 'r'
 
1050
      for (unsigned int r = 0; r < 1; r++)
 
1051
      {
 
1052
        for (unsigned int s = 0; s < 1 - r; s++)
 
1053
        {
 
1054
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1055
          {
 
1056
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
1057
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1058
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
1059
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1060
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1061
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1062
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1063
          }// end loop over 't'
 
1064
        }// end loop over 's'
 
1065
      }// end loop over 'r'
 
1066
      for (unsigned int r = 0; r < 3; r++)
 
1067
      {
 
1068
        for (unsigned int s = 0; s < 3 - r; s++)
 
1069
        {
 
1070
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1071
          {
 
1072
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1073
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
1074
          }// end loop over 't'
 
1075
        }// end loop over 's'
 
1076
      }// end loop over 'r'
 
1077
      
 
1078
      // Table(s) of coefficients.
 
1079
      static const double coefficients0[10] = \
 
1080
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
1081
      
 
1082
      // Compute value(s).
 
1083
      for (unsigned int r = 0; r < 10; r++)
 
1084
      {
 
1085
        *values += coefficients0[r]*basisvalues[r];
 
1086
      }// end loop over 'r'
 
1087
        break;
 
1088
      }
 
1089
    }
 
1090
    
231
1091
  }
232
1092
 
233
1093
  /// Evaluate all basis functions at given point in cell
367
1227
      values[r] = 0.00000000;
368
1228
    }// end loop over 'r'
369
1229
    
370
 
    // Map degree of freedom to element degree of freedom
371
 
    const unsigned int dof = i;
372
 
    
373
 
    // Array of basisvalues.
374
 
    double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
375
 
    
376
 
    // Declare helper variables.
377
 
    unsigned int rr = 0;
378
 
    unsigned int ss = 0;
379
 
    unsigned int tt = 0;
380
 
    double tmp5 = 0.00000000;
381
 
    double tmp6 = 0.00000000;
382
 
    double tmp7 = 0.00000000;
383
 
    double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
384
 
    double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
385
 
    double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
386
 
    double tmp3 = 0.50000000*(1.00000000 - Z);
387
 
    double tmp4 = tmp3*tmp3;
388
 
    
389
 
    // Compute basisvalues.
390
 
    basisvalues[0] = 1.00000000;
391
 
    basisvalues[1] = tmp0;
392
 
    for (unsigned int r = 1; r < 2; r++)
393
 
    {
394
 
      rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
395
 
      ss = r*(r + 1)*(r + 2)/6;
396
 
      tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
397
 
      basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
398
 
    }// end loop over 'r'
399
 
    for (unsigned int r = 0; r < 2; r++)
400
 
    {
401
 
      rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
402
 
      ss = r*(r + 1)*(r + 2)/6;
403
 
      basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
404
 
    }// end loop over 'r'
405
 
    for (unsigned int r = 0; r < 1; r++)
406
 
    {
407
 
      for (unsigned int s = 1; s < 2 - r; s++)
408
 
      {
409
 
        rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
410
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
411
 
        tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
412
 
        tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
413
 
        tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
414
 
        tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
415
 
        basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
416
 
      }// end loop over 's'
417
 
    }// end loop over 'r'
418
 
    for (unsigned int r = 0; r < 2; r++)
419
 
    {
420
 
      for (unsigned int s = 0; s < 2 - r; s++)
421
 
      {
422
 
        rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
423
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
424
 
        basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
425
 
      }// end loop over 's'
426
 
    }// end loop over 'r'
427
 
    for (unsigned int r = 0; r < 1; r++)
428
 
    {
429
 
      for (unsigned int s = 0; s < 1 - r; s++)
430
 
      {
431
 
        for (unsigned int t = 1; t < 2 - r - s; t++)
432
 
        {
433
 
          rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
434
 
          ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
435
 
          tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
436
 
          tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
437
 
          tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
438
 
          tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
439
 
          basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
440
 
        }// end loop over 't'
441
 
      }// end loop over 's'
442
 
    }// end loop over 'r'
443
 
    for (unsigned int r = 0; r < 3; r++)
444
 
    {
445
 
      for (unsigned int s = 0; s < 3 - r; s++)
446
 
      {
447
 
        for (unsigned int t = 0; t < 3 - r - s; t++)
448
 
        {
449
 
          rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
450
 
          basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
451
 
        }// end loop over 't'
452
 
      }// end loop over 's'
453
 
    }// end loop over 'r'
454
 
    
455
 
    // Table(s) of coefficients.
456
 
    static const double coefficients0[10][10] = \
457
 
    {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
458
 
    {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
459
 
    {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
460
 
    {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
461
 
    {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
462
 
    {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
463
 
    {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
464
 
    {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
465
 
    {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
466
 
    {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
467
 
    
468
 
    // Tables of derivatives of the polynomial base (transpose).
469
 
    static const double dmats0[10][10] = \
470
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
471
 
    {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
472
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
473
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
474
 
    {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
475
 
    {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
476
 
    {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
477
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
478
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
479
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
480
 
    
481
 
    static const double dmats1[10][10] = \
482
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
483
 
    {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
484
 
    {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
485
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
486
 
    {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
487
 
    {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
488
 
    {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
489
 
    {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
490
 
    {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
491
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
492
 
    
493
 
    static const double dmats2[10][10] = \
494
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
495
 
    {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
496
 
    {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
497
 
    {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
498
 
    {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
499
 
    {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
500
 
    {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
501
 
    {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
502
 
    {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
503
 
    {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
504
 
    
505
 
    // Compute reference derivatives.
506
 
    // Declare pointer to array of derivatives on FIAT element.
507
 
    double *derivatives = new double[num_derivatives];
508
 
    for (unsigned int r = 0; r < num_derivatives; r++)
509
 
    {
510
 
      derivatives[r] = 0.00000000;
511
 
    }// end loop over 'r'
512
 
    
513
 
    // Declare derivative matrix (of polynomial basis).
514
 
    double dmats[10][10] = \
515
 
    {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
516
 
    {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
517
 
    {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
518
 
    {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
519
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
520
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
521
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
522
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
523
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
524
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
525
 
    
526
 
    // Declare (auxiliary) derivative matrix (of polynomial basis).
527
 
    double dmats_old[10][10] = \
528
 
    {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
529
 
    {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
530
 
    {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
531
 
    {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
532
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
533
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
534
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
535
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
536
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
537
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
538
 
    
539
 
    // Loop possible derivatives.
540
 
    for (unsigned int r = 0; r < num_derivatives; r++)
541
 
    {
542
 
      // Resetting dmats values to compute next derivative.
543
 
      for (unsigned int t = 0; t < 10; t++)
544
 
      {
545
 
        for (unsigned int u = 0; u < 10; u++)
546
 
        {
547
 
          dmats[t][u] = 0.00000000;
548
 
          if (t == u)
549
 
          {
550
 
          dmats[t][u] = 1.00000000;
551
 
          }
552
 
          
553
 
        }// end loop over 'u'
554
 
      }// end loop over 't'
555
 
      
556
 
      // Looping derivative order to generate dmats.
557
 
      for (unsigned int s = 0; s < n; s++)
558
 
      {
559
 
        // Updating dmats_old with new values and resetting dmats.
560
 
        for (unsigned int t = 0; t < 10; t++)
561
 
        {
562
 
          for (unsigned int u = 0; u < 10; u++)
563
 
          {
564
 
            dmats_old[t][u] = dmats[t][u];
565
 
            dmats[t][u] = 0.00000000;
566
 
          }// end loop over 'u'
567
 
        }// end loop over 't'
568
 
        
569
 
        // Update dmats using an inner product.
570
 
        if (combinations[r][s] == 0)
571
 
        {
572
 
        for (unsigned int t = 0; t < 10; t++)
573
 
        {
574
 
          for (unsigned int u = 0; u < 10; u++)
575
 
          {
576
 
            for (unsigned int tu = 0; tu < 10; tu++)
577
 
            {
578
 
              dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
579
 
            }// end loop over 'tu'
580
 
          }// end loop over 'u'
581
 
        }// end loop over 't'
582
 
        }
583
 
        
584
 
        if (combinations[r][s] == 1)
585
 
        {
586
 
        for (unsigned int t = 0; t < 10; t++)
587
 
        {
588
 
          for (unsigned int u = 0; u < 10; u++)
589
 
          {
590
 
            for (unsigned int tu = 0; tu < 10; tu++)
591
 
            {
592
 
              dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
593
 
            }// end loop over 'tu'
594
 
          }// end loop over 'u'
595
 
        }// end loop over 't'
596
 
        }
597
 
        
598
 
        if (combinations[r][s] == 2)
599
 
        {
600
 
        for (unsigned int t = 0; t < 10; t++)
601
 
        {
602
 
          for (unsigned int u = 0; u < 10; u++)
603
 
          {
604
 
            for (unsigned int tu = 0; tu < 10; tu++)
605
 
            {
606
 
              dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
607
 
            }// end loop over 'tu'
608
 
          }// end loop over 'u'
609
 
        }// end loop over 't'
610
 
        }
611
 
        
612
 
      }// end loop over 's'
613
 
      for (unsigned int s = 0; s < 10; s++)
614
 
      {
615
 
        for (unsigned int t = 0; t < 10; t++)
616
 
        {
617
 
          derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
618
 
        }// end loop over 't'
619
 
      }// end loop over 's'
620
 
    }// end loop over 'r'
621
 
    
622
 
    // Transform derivatives back to physical element
623
 
    for (unsigned int r = 0; r < num_derivatives; r++)
624
 
    {
625
 
      for (unsigned int s = 0; s < num_derivatives; s++)
626
 
      {
627
 
        values[r] += transform[r][s]*derivatives[s];
628
 
      }// end loop over 's'
629
 
    }// end loop over 'r'
630
 
    
631
 
    // Delete pointer to array of derivatives on FIAT element
632
 
    delete [] derivatives;
633
 
    
634
 
    // Delete pointer to array of combinations of derivatives and transform
635
 
    for (unsigned int r = 0; r < num_derivatives; r++)
636
 
    {
637
 
      delete [] combinations[r];
638
 
    }// end loop over 'r'
639
 
    delete [] combinations;
640
 
    for (unsigned int r = 0; r < num_derivatives; r++)
641
 
    {
642
 
      delete [] transform[r];
643
 
    }// end loop over 'r'
644
 
    delete [] transform;
 
1230
    switch (i)
 
1231
    {
 
1232
    case 0:
 
1233
      {
 
1234
        
 
1235
      // Array of basisvalues.
 
1236
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
1237
      
 
1238
      // Declare helper variables.
 
1239
      unsigned int rr = 0;
 
1240
      unsigned int ss = 0;
 
1241
      unsigned int tt = 0;
 
1242
      double tmp5 = 0.00000000;
 
1243
      double tmp6 = 0.00000000;
 
1244
      double tmp7 = 0.00000000;
 
1245
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
1246
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
1247
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
1248
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
1249
      double tmp4 = tmp3*tmp3;
 
1250
      
 
1251
      // Compute basisvalues.
 
1252
      basisvalues[0] = 1.00000000;
 
1253
      basisvalues[1] = tmp0;
 
1254
      for (unsigned int r = 1; r < 2; r++)
 
1255
      {
 
1256
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1257
        ss = r*(r + 1)*(r + 2)/6;
 
1258
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1259
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
1260
      }// end loop over 'r'
 
1261
      for (unsigned int r = 0; r < 2; r++)
 
1262
      {
 
1263
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1264
        ss = r*(r + 1)*(r + 2)/6;
 
1265
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
1266
      }// end loop over 'r'
 
1267
      for (unsigned int r = 0; r < 1; r++)
 
1268
      {
 
1269
        for (unsigned int s = 1; s < 2 - r; s++)
 
1270
        {
 
1271
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1272
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1273
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1274
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1275
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1276
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1277
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1278
        }// end loop over 's'
 
1279
      }// end loop over 'r'
 
1280
      for (unsigned int r = 0; r < 2; r++)
 
1281
      {
 
1282
        for (unsigned int s = 0; s < 2 - r; s++)
 
1283
        {
 
1284
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1285
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1286
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
1287
        }// end loop over 's'
 
1288
      }// end loop over 'r'
 
1289
      for (unsigned int r = 0; r < 1; r++)
 
1290
      {
 
1291
        for (unsigned int s = 0; s < 1 - r; s++)
 
1292
        {
 
1293
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1294
          {
 
1295
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
1296
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1297
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
1298
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1299
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1300
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1301
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1302
          }// end loop over 't'
 
1303
        }// end loop over 's'
 
1304
      }// end loop over 'r'
 
1305
      for (unsigned int r = 0; r < 3; r++)
 
1306
      {
 
1307
        for (unsigned int s = 0; s < 3 - r; s++)
 
1308
        {
 
1309
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1310
          {
 
1311
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1312
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
1313
          }// end loop over 't'
 
1314
        }// end loop over 's'
 
1315
      }// end loop over 'r'
 
1316
      
 
1317
      // Table(s) of coefficients.
 
1318
      static const double coefficients0[10] = \
 
1319
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
1320
      
 
1321
      // Tables of derivatives of the polynomial base (transpose).
 
1322
      static const double dmats0[10][10] = \
 
1323
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1324
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1325
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1326
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1327
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1328
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1329
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1330
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1331
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1332
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1333
      
 
1334
      static const double dmats1[10][10] = \
 
1335
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1336
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1337
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1338
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1339
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1340
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1341
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1342
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1343
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1344
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1345
      
 
1346
      static const double dmats2[10][10] = \
 
1347
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1348
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1349
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1350
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1351
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1352
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1353
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1354
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1355
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1356
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1357
      
 
1358
      // Compute reference derivatives.
 
1359
      // Declare pointer to array of derivatives on FIAT element.
 
1360
      double *derivatives = new double[num_derivatives];
 
1361
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1362
      {
 
1363
        derivatives[r] = 0.00000000;
 
1364
      }// end loop over 'r'
 
1365
      
 
1366
      // Declare derivative matrix (of polynomial basis).
 
1367
      double dmats[10][10] = \
 
1368
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1369
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1370
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1371
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1372
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1373
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1374
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1375
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
1376
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
1377
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
1378
      
 
1379
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
1380
      double dmats_old[10][10] = \
 
1381
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1382
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1383
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1384
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1385
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1386
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1387
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1388
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
1389
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
1390
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
1391
      
 
1392
      // Loop possible derivatives.
 
1393
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1394
      {
 
1395
        // Resetting dmats values to compute next derivative.
 
1396
        for (unsigned int t = 0; t < 10; t++)
 
1397
        {
 
1398
          for (unsigned int u = 0; u < 10; u++)
 
1399
          {
 
1400
            dmats[t][u] = 0.00000000;
 
1401
            if (t == u)
 
1402
            {
 
1403
            dmats[t][u] = 1.00000000;
 
1404
            }
 
1405
            
 
1406
          }// end loop over 'u'
 
1407
        }// end loop over 't'
 
1408
        
 
1409
        // Looping derivative order to generate dmats.
 
1410
        for (unsigned int s = 0; s < n; s++)
 
1411
        {
 
1412
          // Updating dmats_old with new values and resetting dmats.
 
1413
          for (unsigned int t = 0; t < 10; t++)
 
1414
          {
 
1415
            for (unsigned int u = 0; u < 10; u++)
 
1416
            {
 
1417
              dmats_old[t][u] = dmats[t][u];
 
1418
              dmats[t][u] = 0.00000000;
 
1419
            }// end loop over 'u'
 
1420
          }// end loop over 't'
 
1421
          
 
1422
          // Update dmats using an inner product.
 
1423
          if (combinations[r][s] == 0)
 
1424
          {
 
1425
          for (unsigned int t = 0; t < 10; t++)
 
1426
          {
 
1427
            for (unsigned int u = 0; u < 10; u++)
 
1428
            {
 
1429
              for (unsigned int tu = 0; tu < 10; tu++)
 
1430
              {
 
1431
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
1432
              }// end loop over 'tu'
 
1433
            }// end loop over 'u'
 
1434
          }// end loop over 't'
 
1435
          }
 
1436
          
 
1437
          if (combinations[r][s] == 1)
 
1438
          {
 
1439
          for (unsigned int t = 0; t < 10; t++)
 
1440
          {
 
1441
            for (unsigned int u = 0; u < 10; u++)
 
1442
            {
 
1443
              for (unsigned int tu = 0; tu < 10; tu++)
 
1444
              {
 
1445
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
1446
              }// end loop over 'tu'
 
1447
            }// end loop over 'u'
 
1448
          }// end loop over 't'
 
1449
          }
 
1450
          
 
1451
          if (combinations[r][s] == 2)
 
1452
          {
 
1453
          for (unsigned int t = 0; t < 10; t++)
 
1454
          {
 
1455
            for (unsigned int u = 0; u < 10; u++)
 
1456
            {
 
1457
              for (unsigned int tu = 0; tu < 10; tu++)
 
1458
              {
 
1459
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
1460
              }// end loop over 'tu'
 
1461
            }// end loop over 'u'
 
1462
          }// end loop over 't'
 
1463
          }
 
1464
          
 
1465
        }// end loop over 's'
 
1466
        for (unsigned int s = 0; s < 10; s++)
 
1467
        {
 
1468
          for (unsigned int t = 0; t < 10; t++)
 
1469
          {
 
1470
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
1471
          }// end loop over 't'
 
1472
        }// end loop over 's'
 
1473
      }// end loop over 'r'
 
1474
      
 
1475
      // Transform derivatives back to physical element
 
1476
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1477
      {
 
1478
        for (unsigned int s = 0; s < num_derivatives; s++)
 
1479
        {
 
1480
          values[r] += transform[r][s]*derivatives[s];
 
1481
        }// end loop over 's'
 
1482
      }// end loop over 'r'
 
1483
      
 
1484
      // Delete pointer to array of derivatives on FIAT element
 
1485
      delete [] derivatives;
 
1486
      
 
1487
      // Delete pointer to array of combinations of derivatives and transform
 
1488
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1489
      {
 
1490
        delete [] combinations[r];
 
1491
      }// end loop over 'r'
 
1492
      delete [] combinations;
 
1493
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1494
      {
 
1495
        delete [] transform[r];
 
1496
      }// end loop over 'r'
 
1497
      delete [] transform;
 
1498
        break;
 
1499
      }
 
1500
    case 1:
 
1501
      {
 
1502
        
 
1503
      // Array of basisvalues.
 
1504
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
1505
      
 
1506
      // Declare helper variables.
 
1507
      unsigned int rr = 0;
 
1508
      unsigned int ss = 0;
 
1509
      unsigned int tt = 0;
 
1510
      double tmp5 = 0.00000000;
 
1511
      double tmp6 = 0.00000000;
 
1512
      double tmp7 = 0.00000000;
 
1513
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
1514
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
1515
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
1516
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
1517
      double tmp4 = tmp3*tmp3;
 
1518
      
 
1519
      // Compute basisvalues.
 
1520
      basisvalues[0] = 1.00000000;
 
1521
      basisvalues[1] = tmp0;
 
1522
      for (unsigned int r = 1; r < 2; r++)
 
1523
      {
 
1524
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1525
        ss = r*(r + 1)*(r + 2)/6;
 
1526
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1527
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
1528
      }// end loop over 'r'
 
1529
      for (unsigned int r = 0; r < 2; r++)
 
1530
      {
 
1531
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1532
        ss = r*(r + 1)*(r + 2)/6;
 
1533
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
1534
      }// end loop over 'r'
 
1535
      for (unsigned int r = 0; r < 1; r++)
 
1536
      {
 
1537
        for (unsigned int s = 1; s < 2 - r; s++)
 
1538
        {
 
1539
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1540
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1541
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1542
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1543
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1544
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1545
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1546
        }// end loop over 's'
 
1547
      }// end loop over 'r'
 
1548
      for (unsigned int r = 0; r < 2; r++)
 
1549
      {
 
1550
        for (unsigned int s = 0; s < 2 - r; s++)
 
1551
        {
 
1552
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1553
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1554
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
1555
        }// end loop over 's'
 
1556
      }// end loop over 'r'
 
1557
      for (unsigned int r = 0; r < 1; r++)
 
1558
      {
 
1559
        for (unsigned int s = 0; s < 1 - r; s++)
 
1560
        {
 
1561
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1562
          {
 
1563
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
1564
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1565
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
1566
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1567
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1568
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1569
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1570
          }// end loop over 't'
 
1571
        }// end loop over 's'
 
1572
      }// end loop over 'r'
 
1573
      for (unsigned int r = 0; r < 3; r++)
 
1574
      {
 
1575
        for (unsigned int s = 0; s < 3 - r; s++)
 
1576
        {
 
1577
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1578
          {
 
1579
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1580
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
1581
          }// end loop over 't'
 
1582
        }// end loop over 's'
 
1583
      }// end loop over 'r'
 
1584
      
 
1585
      // Table(s) of coefficients.
 
1586
      static const double coefficients0[10] = \
 
1587
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
1588
      
 
1589
      // Tables of derivatives of the polynomial base (transpose).
 
1590
      static const double dmats0[10][10] = \
 
1591
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1592
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1593
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1594
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1595
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1596
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1597
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1598
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1599
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1600
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1601
      
 
1602
      static const double dmats1[10][10] = \
 
1603
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1604
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1605
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1606
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1607
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1608
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1609
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1610
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1611
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1612
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1613
      
 
1614
      static const double dmats2[10][10] = \
 
1615
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1616
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1617
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1618
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1619
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1620
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1621
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1622
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1623
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1624
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1625
      
 
1626
      // Compute reference derivatives.
 
1627
      // Declare pointer to array of derivatives on FIAT element.
 
1628
      double *derivatives = new double[num_derivatives];
 
1629
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1630
      {
 
1631
        derivatives[r] = 0.00000000;
 
1632
      }// end loop over 'r'
 
1633
      
 
1634
      // Declare derivative matrix (of polynomial basis).
 
1635
      double dmats[10][10] = \
 
1636
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1637
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1638
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1639
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1640
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1641
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1642
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1643
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
1644
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
1645
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
1646
      
 
1647
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
1648
      double dmats_old[10][10] = \
 
1649
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1650
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1651
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1652
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1653
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1654
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1655
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1656
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
1657
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
1658
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
1659
      
 
1660
      // Loop possible derivatives.
 
1661
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1662
      {
 
1663
        // Resetting dmats values to compute next derivative.
 
1664
        for (unsigned int t = 0; t < 10; t++)
 
1665
        {
 
1666
          for (unsigned int u = 0; u < 10; u++)
 
1667
          {
 
1668
            dmats[t][u] = 0.00000000;
 
1669
            if (t == u)
 
1670
            {
 
1671
            dmats[t][u] = 1.00000000;
 
1672
            }
 
1673
            
 
1674
          }// end loop over 'u'
 
1675
        }// end loop over 't'
 
1676
        
 
1677
        // Looping derivative order to generate dmats.
 
1678
        for (unsigned int s = 0; s < n; s++)
 
1679
        {
 
1680
          // Updating dmats_old with new values and resetting dmats.
 
1681
          for (unsigned int t = 0; t < 10; t++)
 
1682
          {
 
1683
            for (unsigned int u = 0; u < 10; u++)
 
1684
            {
 
1685
              dmats_old[t][u] = dmats[t][u];
 
1686
              dmats[t][u] = 0.00000000;
 
1687
            }// end loop over 'u'
 
1688
          }// end loop over 't'
 
1689
          
 
1690
          // Update dmats using an inner product.
 
1691
          if (combinations[r][s] == 0)
 
1692
          {
 
1693
          for (unsigned int t = 0; t < 10; t++)
 
1694
          {
 
1695
            for (unsigned int u = 0; u < 10; u++)
 
1696
            {
 
1697
              for (unsigned int tu = 0; tu < 10; tu++)
 
1698
              {
 
1699
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
1700
              }// end loop over 'tu'
 
1701
            }// end loop over 'u'
 
1702
          }// end loop over 't'
 
1703
          }
 
1704
          
 
1705
          if (combinations[r][s] == 1)
 
1706
          {
 
1707
          for (unsigned int t = 0; t < 10; t++)
 
1708
          {
 
1709
            for (unsigned int u = 0; u < 10; u++)
 
1710
            {
 
1711
              for (unsigned int tu = 0; tu < 10; tu++)
 
1712
              {
 
1713
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
1714
              }// end loop over 'tu'
 
1715
            }// end loop over 'u'
 
1716
          }// end loop over 't'
 
1717
          }
 
1718
          
 
1719
          if (combinations[r][s] == 2)
 
1720
          {
 
1721
          for (unsigned int t = 0; t < 10; t++)
 
1722
          {
 
1723
            for (unsigned int u = 0; u < 10; u++)
 
1724
            {
 
1725
              for (unsigned int tu = 0; tu < 10; tu++)
 
1726
              {
 
1727
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
1728
              }// end loop over 'tu'
 
1729
            }// end loop over 'u'
 
1730
          }// end loop over 't'
 
1731
          }
 
1732
          
 
1733
        }// end loop over 's'
 
1734
        for (unsigned int s = 0; s < 10; s++)
 
1735
        {
 
1736
          for (unsigned int t = 0; t < 10; t++)
 
1737
          {
 
1738
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
1739
          }// end loop over 't'
 
1740
        }// end loop over 's'
 
1741
      }// end loop over 'r'
 
1742
      
 
1743
      // Transform derivatives back to physical element
 
1744
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1745
      {
 
1746
        for (unsigned int s = 0; s < num_derivatives; s++)
 
1747
        {
 
1748
          values[r] += transform[r][s]*derivatives[s];
 
1749
        }// end loop over 's'
 
1750
      }// end loop over 'r'
 
1751
      
 
1752
      // Delete pointer to array of derivatives on FIAT element
 
1753
      delete [] derivatives;
 
1754
      
 
1755
      // Delete pointer to array of combinations of derivatives and transform
 
1756
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1757
      {
 
1758
        delete [] combinations[r];
 
1759
      }// end loop over 'r'
 
1760
      delete [] combinations;
 
1761
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1762
      {
 
1763
        delete [] transform[r];
 
1764
      }// end loop over 'r'
 
1765
      delete [] transform;
 
1766
        break;
 
1767
      }
 
1768
    case 2:
 
1769
      {
 
1770
        
 
1771
      // Array of basisvalues.
 
1772
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
1773
      
 
1774
      // Declare helper variables.
 
1775
      unsigned int rr = 0;
 
1776
      unsigned int ss = 0;
 
1777
      unsigned int tt = 0;
 
1778
      double tmp5 = 0.00000000;
 
1779
      double tmp6 = 0.00000000;
 
1780
      double tmp7 = 0.00000000;
 
1781
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
1782
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
1783
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
1784
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
1785
      double tmp4 = tmp3*tmp3;
 
1786
      
 
1787
      // Compute basisvalues.
 
1788
      basisvalues[0] = 1.00000000;
 
1789
      basisvalues[1] = tmp0;
 
1790
      for (unsigned int r = 1; r < 2; r++)
 
1791
      {
 
1792
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1793
        ss = r*(r + 1)*(r + 2)/6;
 
1794
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1795
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
1796
      }// end loop over 'r'
 
1797
      for (unsigned int r = 0; r < 2; r++)
 
1798
      {
 
1799
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1800
        ss = r*(r + 1)*(r + 2)/6;
 
1801
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
1802
      }// end loop over 'r'
 
1803
      for (unsigned int r = 0; r < 1; r++)
 
1804
      {
 
1805
        for (unsigned int s = 1; s < 2 - r; s++)
 
1806
        {
 
1807
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1808
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1809
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1810
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1811
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1812
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
1813
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1814
        }// end loop over 's'
 
1815
      }// end loop over 'r'
 
1816
      for (unsigned int r = 0; r < 2; r++)
 
1817
      {
 
1818
        for (unsigned int s = 0; s < 2 - r; s++)
 
1819
        {
 
1820
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1821
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1822
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
1823
        }// end loop over 's'
 
1824
      }// end loop over 'r'
 
1825
      for (unsigned int r = 0; r < 1; r++)
 
1826
      {
 
1827
        for (unsigned int s = 0; s < 1 - r; s++)
 
1828
        {
 
1829
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1830
          {
 
1831
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
1832
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1833
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
1834
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1835
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1836
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
1837
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1838
          }// end loop over 't'
 
1839
        }// end loop over 's'
 
1840
      }// end loop over 'r'
 
1841
      for (unsigned int r = 0; r < 3; r++)
 
1842
      {
 
1843
        for (unsigned int s = 0; s < 3 - r; s++)
 
1844
        {
 
1845
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1846
          {
 
1847
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1848
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
1849
          }// end loop over 't'
 
1850
        }// end loop over 's'
 
1851
      }// end loop over 'r'
 
1852
      
 
1853
      // Table(s) of coefficients.
 
1854
      static const double coefficients0[10] = \
 
1855
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
1856
      
 
1857
      // Tables of derivatives of the polynomial base (transpose).
 
1858
      static const double dmats0[10][10] = \
 
1859
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1860
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1861
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1862
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1863
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1864
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1865
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1866
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1867
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1868
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1869
      
 
1870
      static const double dmats1[10][10] = \
 
1871
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1872
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1873
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1874
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1875
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1876
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1877
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1878
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1879
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1880
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1881
      
 
1882
      static const double dmats2[10][10] = \
 
1883
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1884
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1885
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1886
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1887
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1888
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1889
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1890
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1891
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1892
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
1893
      
 
1894
      // Compute reference derivatives.
 
1895
      // Declare pointer to array of derivatives on FIAT element.
 
1896
      double *derivatives = new double[num_derivatives];
 
1897
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1898
      {
 
1899
        derivatives[r] = 0.00000000;
 
1900
      }// end loop over 'r'
 
1901
      
 
1902
      // Declare derivative matrix (of polynomial basis).
 
1903
      double dmats[10][10] = \
 
1904
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1905
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1906
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1907
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1908
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1909
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1910
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1911
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
1912
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
1913
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
1914
      
 
1915
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
1916
      double dmats_old[10][10] = \
 
1917
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1918
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1919
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1920
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1921
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1922
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1923
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
1924
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
1925
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
1926
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
1927
      
 
1928
      // Loop possible derivatives.
 
1929
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1930
      {
 
1931
        // Resetting dmats values to compute next derivative.
 
1932
        for (unsigned int t = 0; t < 10; t++)
 
1933
        {
 
1934
          for (unsigned int u = 0; u < 10; u++)
 
1935
          {
 
1936
            dmats[t][u] = 0.00000000;
 
1937
            if (t == u)
 
1938
            {
 
1939
            dmats[t][u] = 1.00000000;
 
1940
            }
 
1941
            
 
1942
          }// end loop over 'u'
 
1943
        }// end loop over 't'
 
1944
        
 
1945
        // Looping derivative order to generate dmats.
 
1946
        for (unsigned int s = 0; s < n; s++)
 
1947
        {
 
1948
          // Updating dmats_old with new values and resetting dmats.
 
1949
          for (unsigned int t = 0; t < 10; t++)
 
1950
          {
 
1951
            for (unsigned int u = 0; u < 10; u++)
 
1952
            {
 
1953
              dmats_old[t][u] = dmats[t][u];
 
1954
              dmats[t][u] = 0.00000000;
 
1955
            }// end loop over 'u'
 
1956
          }// end loop over 't'
 
1957
          
 
1958
          // Update dmats using an inner product.
 
1959
          if (combinations[r][s] == 0)
 
1960
          {
 
1961
          for (unsigned int t = 0; t < 10; t++)
 
1962
          {
 
1963
            for (unsigned int u = 0; u < 10; u++)
 
1964
            {
 
1965
              for (unsigned int tu = 0; tu < 10; tu++)
 
1966
              {
 
1967
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
1968
              }// end loop over 'tu'
 
1969
            }// end loop over 'u'
 
1970
          }// end loop over 't'
 
1971
          }
 
1972
          
 
1973
          if (combinations[r][s] == 1)
 
1974
          {
 
1975
          for (unsigned int t = 0; t < 10; t++)
 
1976
          {
 
1977
            for (unsigned int u = 0; u < 10; u++)
 
1978
            {
 
1979
              for (unsigned int tu = 0; tu < 10; tu++)
 
1980
              {
 
1981
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
1982
              }// end loop over 'tu'
 
1983
            }// end loop over 'u'
 
1984
          }// end loop over 't'
 
1985
          }
 
1986
          
 
1987
          if (combinations[r][s] == 2)
 
1988
          {
 
1989
          for (unsigned int t = 0; t < 10; t++)
 
1990
          {
 
1991
            for (unsigned int u = 0; u < 10; u++)
 
1992
            {
 
1993
              for (unsigned int tu = 0; tu < 10; tu++)
 
1994
              {
 
1995
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
1996
              }// end loop over 'tu'
 
1997
            }// end loop over 'u'
 
1998
          }// end loop over 't'
 
1999
          }
 
2000
          
 
2001
        }// end loop over 's'
 
2002
        for (unsigned int s = 0; s < 10; s++)
 
2003
        {
 
2004
          for (unsigned int t = 0; t < 10; t++)
 
2005
          {
 
2006
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2007
          }// end loop over 't'
 
2008
        }// end loop over 's'
 
2009
      }// end loop over 'r'
 
2010
      
 
2011
      // Transform derivatives back to physical element
 
2012
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2013
      {
 
2014
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2015
        {
 
2016
          values[r] += transform[r][s]*derivatives[s];
 
2017
        }// end loop over 's'
 
2018
      }// end loop over 'r'
 
2019
      
 
2020
      // Delete pointer to array of derivatives on FIAT element
 
2021
      delete [] derivatives;
 
2022
      
 
2023
      // Delete pointer to array of combinations of derivatives and transform
 
2024
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2025
      {
 
2026
        delete [] combinations[r];
 
2027
      }// end loop over 'r'
 
2028
      delete [] combinations;
 
2029
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2030
      {
 
2031
        delete [] transform[r];
 
2032
      }// end loop over 'r'
 
2033
      delete [] transform;
 
2034
        break;
 
2035
      }
 
2036
    case 3:
 
2037
      {
 
2038
        
 
2039
      // Array of basisvalues.
 
2040
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
2041
      
 
2042
      // Declare helper variables.
 
2043
      unsigned int rr = 0;
 
2044
      unsigned int ss = 0;
 
2045
      unsigned int tt = 0;
 
2046
      double tmp5 = 0.00000000;
 
2047
      double tmp6 = 0.00000000;
 
2048
      double tmp7 = 0.00000000;
 
2049
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
2050
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
2051
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
2052
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
2053
      double tmp4 = tmp3*tmp3;
 
2054
      
 
2055
      // Compute basisvalues.
 
2056
      basisvalues[0] = 1.00000000;
 
2057
      basisvalues[1] = tmp0;
 
2058
      for (unsigned int r = 1; r < 2; r++)
 
2059
      {
 
2060
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2061
        ss = r*(r + 1)*(r + 2)/6;
 
2062
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2063
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
2064
      }// end loop over 'r'
 
2065
      for (unsigned int r = 0; r < 2; r++)
 
2066
      {
 
2067
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2068
        ss = r*(r + 1)*(r + 2)/6;
 
2069
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
2070
      }// end loop over 'r'
 
2071
      for (unsigned int r = 0; r < 1; r++)
 
2072
      {
 
2073
        for (unsigned int s = 1; s < 2 - r; s++)
 
2074
        {
 
2075
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2076
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2077
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2078
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2079
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2080
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2081
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2082
        }// end loop over 's'
 
2083
      }// end loop over 'r'
 
2084
      for (unsigned int r = 0; r < 2; r++)
 
2085
      {
 
2086
        for (unsigned int s = 0; s < 2 - r; s++)
 
2087
        {
 
2088
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2089
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2090
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
2091
        }// end loop over 's'
 
2092
      }// end loop over 'r'
 
2093
      for (unsigned int r = 0; r < 1; r++)
 
2094
      {
 
2095
        for (unsigned int s = 0; s < 1 - r; s++)
 
2096
        {
 
2097
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2098
          {
 
2099
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
2100
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2101
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
2102
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2103
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2104
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2105
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2106
          }// end loop over 't'
 
2107
        }// end loop over 's'
 
2108
      }// end loop over 'r'
 
2109
      for (unsigned int r = 0; r < 3; r++)
 
2110
      {
 
2111
        for (unsigned int s = 0; s < 3 - r; s++)
 
2112
        {
 
2113
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2114
          {
 
2115
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2116
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
2117
          }// end loop over 't'
 
2118
        }// end loop over 's'
 
2119
      }// end loop over 'r'
 
2120
      
 
2121
      // Table(s) of coefficients.
 
2122
      static const double coefficients0[10] = \
 
2123
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
2124
      
 
2125
      // Tables of derivatives of the polynomial base (transpose).
 
2126
      static const double dmats0[10][10] = \
 
2127
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2128
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2129
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2130
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2131
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2132
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2133
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2134
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2135
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2136
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2137
      
 
2138
      static const double dmats1[10][10] = \
 
2139
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2140
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2141
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2142
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2143
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2144
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2145
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2146
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2147
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2148
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2149
      
 
2150
      static const double dmats2[10][10] = \
 
2151
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2152
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2153
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2154
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2155
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2156
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2157
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2158
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2159
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2160
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2161
      
 
2162
      // Compute reference derivatives.
 
2163
      // Declare pointer to array of derivatives on FIAT element.
 
2164
      double *derivatives = new double[num_derivatives];
 
2165
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2166
      {
 
2167
        derivatives[r] = 0.00000000;
 
2168
      }// end loop over 'r'
 
2169
      
 
2170
      // Declare derivative matrix (of polynomial basis).
 
2171
      double dmats[10][10] = \
 
2172
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2173
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2174
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2175
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2176
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2177
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2178
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2179
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2180
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2181
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2182
      
 
2183
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2184
      double dmats_old[10][10] = \
 
2185
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2186
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2187
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2188
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2189
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2190
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2191
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2192
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2193
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2194
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2195
      
 
2196
      // Loop possible derivatives.
 
2197
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2198
      {
 
2199
        // Resetting dmats values to compute next derivative.
 
2200
        for (unsigned int t = 0; t < 10; t++)
 
2201
        {
 
2202
          for (unsigned int u = 0; u < 10; u++)
 
2203
          {
 
2204
            dmats[t][u] = 0.00000000;
 
2205
            if (t == u)
 
2206
            {
 
2207
            dmats[t][u] = 1.00000000;
 
2208
            }
 
2209
            
 
2210
          }// end loop over 'u'
 
2211
        }// end loop over 't'
 
2212
        
 
2213
        // Looping derivative order to generate dmats.
 
2214
        for (unsigned int s = 0; s < n; s++)
 
2215
        {
 
2216
          // Updating dmats_old with new values and resetting dmats.
 
2217
          for (unsigned int t = 0; t < 10; t++)
 
2218
          {
 
2219
            for (unsigned int u = 0; u < 10; u++)
 
2220
            {
 
2221
              dmats_old[t][u] = dmats[t][u];
 
2222
              dmats[t][u] = 0.00000000;
 
2223
            }// end loop over 'u'
 
2224
          }// end loop over 't'
 
2225
          
 
2226
          // Update dmats using an inner product.
 
2227
          if (combinations[r][s] == 0)
 
2228
          {
 
2229
          for (unsigned int t = 0; t < 10; t++)
 
2230
          {
 
2231
            for (unsigned int u = 0; u < 10; u++)
 
2232
            {
 
2233
              for (unsigned int tu = 0; tu < 10; tu++)
 
2234
              {
 
2235
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
2236
              }// end loop over 'tu'
 
2237
            }// end loop over 'u'
 
2238
          }// end loop over 't'
 
2239
          }
 
2240
          
 
2241
          if (combinations[r][s] == 1)
 
2242
          {
 
2243
          for (unsigned int t = 0; t < 10; t++)
 
2244
          {
 
2245
            for (unsigned int u = 0; u < 10; u++)
 
2246
            {
 
2247
              for (unsigned int tu = 0; tu < 10; tu++)
 
2248
              {
 
2249
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2250
              }// end loop over 'tu'
 
2251
            }// end loop over 'u'
 
2252
          }// end loop over 't'
 
2253
          }
 
2254
          
 
2255
          if (combinations[r][s] == 2)
 
2256
          {
 
2257
          for (unsigned int t = 0; t < 10; t++)
 
2258
          {
 
2259
            for (unsigned int u = 0; u < 10; u++)
 
2260
            {
 
2261
              for (unsigned int tu = 0; tu < 10; tu++)
 
2262
              {
 
2263
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2264
              }// end loop over 'tu'
 
2265
            }// end loop over 'u'
 
2266
          }// end loop over 't'
 
2267
          }
 
2268
          
 
2269
        }// end loop over 's'
 
2270
        for (unsigned int s = 0; s < 10; s++)
 
2271
        {
 
2272
          for (unsigned int t = 0; t < 10; t++)
 
2273
          {
 
2274
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2275
          }// end loop over 't'
 
2276
        }// end loop over 's'
 
2277
      }// end loop over 'r'
 
2278
      
 
2279
      // Transform derivatives back to physical element
 
2280
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2281
      {
 
2282
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2283
        {
 
2284
          values[r] += transform[r][s]*derivatives[s];
 
2285
        }// end loop over 's'
 
2286
      }// end loop over 'r'
 
2287
      
 
2288
      // Delete pointer to array of derivatives on FIAT element
 
2289
      delete [] derivatives;
 
2290
      
 
2291
      // Delete pointer to array of combinations of derivatives and transform
 
2292
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2293
      {
 
2294
        delete [] combinations[r];
 
2295
      }// end loop over 'r'
 
2296
      delete [] combinations;
 
2297
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2298
      {
 
2299
        delete [] transform[r];
 
2300
      }// end loop over 'r'
 
2301
      delete [] transform;
 
2302
        break;
 
2303
      }
 
2304
    case 4:
 
2305
      {
 
2306
        
 
2307
      // Array of basisvalues.
 
2308
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
2309
      
 
2310
      // Declare helper variables.
 
2311
      unsigned int rr = 0;
 
2312
      unsigned int ss = 0;
 
2313
      unsigned int tt = 0;
 
2314
      double tmp5 = 0.00000000;
 
2315
      double tmp6 = 0.00000000;
 
2316
      double tmp7 = 0.00000000;
 
2317
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
2318
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
2319
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
2320
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
2321
      double tmp4 = tmp3*tmp3;
 
2322
      
 
2323
      // Compute basisvalues.
 
2324
      basisvalues[0] = 1.00000000;
 
2325
      basisvalues[1] = tmp0;
 
2326
      for (unsigned int r = 1; r < 2; r++)
 
2327
      {
 
2328
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2329
        ss = r*(r + 1)*(r + 2)/6;
 
2330
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2331
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
2332
      }// end loop over 'r'
 
2333
      for (unsigned int r = 0; r < 2; r++)
 
2334
      {
 
2335
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2336
        ss = r*(r + 1)*(r + 2)/6;
 
2337
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
2338
      }// end loop over 'r'
 
2339
      for (unsigned int r = 0; r < 1; r++)
 
2340
      {
 
2341
        for (unsigned int s = 1; s < 2 - r; s++)
 
2342
        {
 
2343
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2344
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2345
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2346
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2347
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2348
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2349
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2350
        }// end loop over 's'
 
2351
      }// end loop over 'r'
 
2352
      for (unsigned int r = 0; r < 2; r++)
 
2353
      {
 
2354
        for (unsigned int s = 0; s < 2 - r; s++)
 
2355
        {
 
2356
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2357
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2358
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
2359
        }// end loop over 's'
 
2360
      }// end loop over 'r'
 
2361
      for (unsigned int r = 0; r < 1; r++)
 
2362
      {
 
2363
        for (unsigned int s = 0; s < 1 - r; s++)
 
2364
        {
 
2365
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2366
          {
 
2367
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
2368
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2369
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
2370
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2371
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2372
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2373
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2374
          }// end loop over 't'
 
2375
        }// end loop over 's'
 
2376
      }// end loop over 'r'
 
2377
      for (unsigned int r = 0; r < 3; r++)
 
2378
      {
 
2379
        for (unsigned int s = 0; s < 3 - r; s++)
 
2380
        {
 
2381
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2382
          {
 
2383
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2384
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
2385
          }// end loop over 't'
 
2386
        }// end loop over 's'
 
2387
      }// end loop over 'r'
 
2388
      
 
2389
      // Table(s) of coefficients.
 
2390
      static const double coefficients0[10] = \
 
2391
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
2392
      
 
2393
      // Tables of derivatives of the polynomial base (transpose).
 
2394
      static const double dmats0[10][10] = \
 
2395
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2396
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2397
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2398
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2399
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2400
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2401
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2402
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2403
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2404
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2405
      
 
2406
      static const double dmats1[10][10] = \
 
2407
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2408
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2409
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2410
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2411
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2412
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2413
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2414
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2415
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2416
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2417
      
 
2418
      static const double dmats2[10][10] = \
 
2419
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2420
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2421
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2422
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2423
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2424
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2425
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2426
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2427
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2428
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2429
      
 
2430
      // Compute reference derivatives.
 
2431
      // Declare pointer to array of derivatives on FIAT element.
 
2432
      double *derivatives = new double[num_derivatives];
 
2433
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2434
      {
 
2435
        derivatives[r] = 0.00000000;
 
2436
      }// end loop over 'r'
 
2437
      
 
2438
      // Declare derivative matrix (of polynomial basis).
 
2439
      double dmats[10][10] = \
 
2440
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2441
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2442
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2443
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2444
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2445
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2446
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2447
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2448
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2449
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2450
      
 
2451
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2452
      double dmats_old[10][10] = \
 
2453
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2454
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2455
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2456
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2457
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2458
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2459
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2460
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2461
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2462
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2463
      
 
2464
      // Loop possible derivatives.
 
2465
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2466
      {
 
2467
        // Resetting dmats values to compute next derivative.
 
2468
        for (unsigned int t = 0; t < 10; t++)
 
2469
        {
 
2470
          for (unsigned int u = 0; u < 10; u++)
 
2471
          {
 
2472
            dmats[t][u] = 0.00000000;
 
2473
            if (t == u)
 
2474
            {
 
2475
            dmats[t][u] = 1.00000000;
 
2476
            }
 
2477
            
 
2478
          }// end loop over 'u'
 
2479
        }// end loop over 't'
 
2480
        
 
2481
        // Looping derivative order to generate dmats.
 
2482
        for (unsigned int s = 0; s < n; s++)
 
2483
        {
 
2484
          // Updating dmats_old with new values and resetting dmats.
 
2485
          for (unsigned int t = 0; t < 10; t++)
 
2486
          {
 
2487
            for (unsigned int u = 0; u < 10; u++)
 
2488
            {
 
2489
              dmats_old[t][u] = dmats[t][u];
 
2490
              dmats[t][u] = 0.00000000;
 
2491
            }// end loop over 'u'
 
2492
          }// end loop over 't'
 
2493
          
 
2494
          // Update dmats using an inner product.
 
2495
          if (combinations[r][s] == 0)
 
2496
          {
 
2497
          for (unsigned int t = 0; t < 10; t++)
 
2498
          {
 
2499
            for (unsigned int u = 0; u < 10; u++)
 
2500
            {
 
2501
              for (unsigned int tu = 0; tu < 10; tu++)
 
2502
              {
 
2503
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
2504
              }// end loop over 'tu'
 
2505
            }// end loop over 'u'
 
2506
          }// end loop over 't'
 
2507
          }
 
2508
          
 
2509
          if (combinations[r][s] == 1)
 
2510
          {
 
2511
          for (unsigned int t = 0; t < 10; t++)
 
2512
          {
 
2513
            for (unsigned int u = 0; u < 10; u++)
 
2514
            {
 
2515
              for (unsigned int tu = 0; tu < 10; tu++)
 
2516
              {
 
2517
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2518
              }// end loop over 'tu'
 
2519
            }// end loop over 'u'
 
2520
          }// end loop over 't'
 
2521
          }
 
2522
          
 
2523
          if (combinations[r][s] == 2)
 
2524
          {
 
2525
          for (unsigned int t = 0; t < 10; t++)
 
2526
          {
 
2527
            for (unsigned int u = 0; u < 10; u++)
 
2528
            {
 
2529
              for (unsigned int tu = 0; tu < 10; tu++)
 
2530
              {
 
2531
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2532
              }// end loop over 'tu'
 
2533
            }// end loop over 'u'
 
2534
          }// end loop over 't'
 
2535
          }
 
2536
          
 
2537
        }// end loop over 's'
 
2538
        for (unsigned int s = 0; s < 10; s++)
 
2539
        {
 
2540
          for (unsigned int t = 0; t < 10; t++)
 
2541
          {
 
2542
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2543
          }// end loop over 't'
 
2544
        }// end loop over 's'
 
2545
      }// end loop over 'r'
 
2546
      
 
2547
      // Transform derivatives back to physical element
 
2548
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2549
      {
 
2550
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2551
        {
 
2552
          values[r] += transform[r][s]*derivatives[s];
 
2553
        }// end loop over 's'
 
2554
      }// end loop over 'r'
 
2555
      
 
2556
      // Delete pointer to array of derivatives on FIAT element
 
2557
      delete [] derivatives;
 
2558
      
 
2559
      // Delete pointer to array of combinations of derivatives and transform
 
2560
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2561
      {
 
2562
        delete [] combinations[r];
 
2563
      }// end loop over 'r'
 
2564
      delete [] combinations;
 
2565
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2566
      {
 
2567
        delete [] transform[r];
 
2568
      }// end loop over 'r'
 
2569
      delete [] transform;
 
2570
        break;
 
2571
      }
 
2572
    case 5:
 
2573
      {
 
2574
        
 
2575
      // Array of basisvalues.
 
2576
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
2577
      
 
2578
      // Declare helper variables.
 
2579
      unsigned int rr = 0;
 
2580
      unsigned int ss = 0;
 
2581
      unsigned int tt = 0;
 
2582
      double tmp5 = 0.00000000;
 
2583
      double tmp6 = 0.00000000;
 
2584
      double tmp7 = 0.00000000;
 
2585
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
2586
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
2587
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
2588
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
2589
      double tmp4 = tmp3*tmp3;
 
2590
      
 
2591
      // Compute basisvalues.
 
2592
      basisvalues[0] = 1.00000000;
 
2593
      basisvalues[1] = tmp0;
 
2594
      for (unsigned int r = 1; r < 2; r++)
 
2595
      {
 
2596
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2597
        ss = r*(r + 1)*(r + 2)/6;
 
2598
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2599
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
2600
      }// end loop over 'r'
 
2601
      for (unsigned int r = 0; r < 2; r++)
 
2602
      {
 
2603
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2604
        ss = r*(r + 1)*(r + 2)/6;
 
2605
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
2606
      }// end loop over 'r'
 
2607
      for (unsigned int r = 0; r < 1; r++)
 
2608
      {
 
2609
        for (unsigned int s = 1; s < 2 - r; s++)
 
2610
        {
 
2611
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2612
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2613
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2614
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2615
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2616
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2617
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2618
        }// end loop over 's'
 
2619
      }// end loop over 'r'
 
2620
      for (unsigned int r = 0; r < 2; r++)
 
2621
      {
 
2622
        for (unsigned int s = 0; s < 2 - r; s++)
 
2623
        {
 
2624
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2625
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2626
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
2627
        }// end loop over 's'
 
2628
      }// end loop over 'r'
 
2629
      for (unsigned int r = 0; r < 1; r++)
 
2630
      {
 
2631
        for (unsigned int s = 0; s < 1 - r; s++)
 
2632
        {
 
2633
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2634
          {
 
2635
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
2636
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2637
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
2638
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2639
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2640
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2641
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2642
          }// end loop over 't'
 
2643
        }// end loop over 's'
 
2644
      }// end loop over 'r'
 
2645
      for (unsigned int r = 0; r < 3; r++)
 
2646
      {
 
2647
        for (unsigned int s = 0; s < 3 - r; s++)
 
2648
        {
 
2649
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2650
          {
 
2651
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2652
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
2653
          }// end loop over 't'
 
2654
        }// end loop over 's'
 
2655
      }// end loop over 'r'
 
2656
      
 
2657
      // Table(s) of coefficients.
 
2658
      static const double coefficients0[10] = \
 
2659
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
2660
      
 
2661
      // Tables of derivatives of the polynomial base (transpose).
 
2662
      static const double dmats0[10][10] = \
 
2663
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2664
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2665
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2666
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2667
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2668
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2669
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2670
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2671
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2672
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2673
      
 
2674
      static const double dmats1[10][10] = \
 
2675
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2676
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2677
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2678
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2679
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2680
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2681
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2682
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2683
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2684
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2685
      
 
2686
      static const double dmats2[10][10] = \
 
2687
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2688
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2689
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2690
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2691
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2692
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2693
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2694
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2695
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2696
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2697
      
 
2698
      // Compute reference derivatives.
 
2699
      // Declare pointer to array of derivatives on FIAT element.
 
2700
      double *derivatives = new double[num_derivatives];
 
2701
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2702
      {
 
2703
        derivatives[r] = 0.00000000;
 
2704
      }// end loop over 'r'
 
2705
      
 
2706
      // Declare derivative matrix (of polynomial basis).
 
2707
      double dmats[10][10] = \
 
2708
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2709
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2710
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2711
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2712
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2713
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2714
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2715
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2716
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2717
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2718
      
 
2719
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2720
      double dmats_old[10][10] = \
 
2721
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2722
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2723
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2724
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2725
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2726
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2727
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2728
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2729
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2730
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2731
      
 
2732
      // Loop possible derivatives.
 
2733
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2734
      {
 
2735
        // Resetting dmats values to compute next derivative.
 
2736
        for (unsigned int t = 0; t < 10; t++)
 
2737
        {
 
2738
          for (unsigned int u = 0; u < 10; u++)
 
2739
          {
 
2740
            dmats[t][u] = 0.00000000;
 
2741
            if (t == u)
 
2742
            {
 
2743
            dmats[t][u] = 1.00000000;
 
2744
            }
 
2745
            
 
2746
          }// end loop over 'u'
 
2747
        }// end loop over 't'
 
2748
        
 
2749
        // Looping derivative order to generate dmats.
 
2750
        for (unsigned int s = 0; s < n; s++)
 
2751
        {
 
2752
          // Updating dmats_old with new values and resetting dmats.
 
2753
          for (unsigned int t = 0; t < 10; t++)
 
2754
          {
 
2755
            for (unsigned int u = 0; u < 10; u++)
 
2756
            {
 
2757
              dmats_old[t][u] = dmats[t][u];
 
2758
              dmats[t][u] = 0.00000000;
 
2759
            }// end loop over 'u'
 
2760
          }// end loop over 't'
 
2761
          
 
2762
          // Update dmats using an inner product.
 
2763
          if (combinations[r][s] == 0)
 
2764
          {
 
2765
          for (unsigned int t = 0; t < 10; t++)
 
2766
          {
 
2767
            for (unsigned int u = 0; u < 10; u++)
 
2768
            {
 
2769
              for (unsigned int tu = 0; tu < 10; tu++)
 
2770
              {
 
2771
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
2772
              }// end loop over 'tu'
 
2773
            }// end loop over 'u'
 
2774
          }// end loop over 't'
 
2775
          }
 
2776
          
 
2777
          if (combinations[r][s] == 1)
 
2778
          {
 
2779
          for (unsigned int t = 0; t < 10; t++)
 
2780
          {
 
2781
            for (unsigned int u = 0; u < 10; u++)
 
2782
            {
 
2783
              for (unsigned int tu = 0; tu < 10; tu++)
 
2784
              {
 
2785
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2786
              }// end loop over 'tu'
 
2787
            }// end loop over 'u'
 
2788
          }// end loop over 't'
 
2789
          }
 
2790
          
 
2791
          if (combinations[r][s] == 2)
 
2792
          {
 
2793
          for (unsigned int t = 0; t < 10; t++)
 
2794
          {
 
2795
            for (unsigned int u = 0; u < 10; u++)
 
2796
            {
 
2797
              for (unsigned int tu = 0; tu < 10; tu++)
 
2798
              {
 
2799
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2800
              }// end loop over 'tu'
 
2801
            }// end loop over 'u'
 
2802
          }// end loop over 't'
 
2803
          }
 
2804
          
 
2805
        }// end loop over 's'
 
2806
        for (unsigned int s = 0; s < 10; s++)
 
2807
        {
 
2808
          for (unsigned int t = 0; t < 10; t++)
 
2809
          {
 
2810
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2811
          }// end loop over 't'
 
2812
        }// end loop over 's'
 
2813
      }// end loop over 'r'
 
2814
      
 
2815
      // Transform derivatives back to physical element
 
2816
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2817
      {
 
2818
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2819
        {
 
2820
          values[r] += transform[r][s]*derivatives[s];
 
2821
        }// end loop over 's'
 
2822
      }// end loop over 'r'
 
2823
      
 
2824
      // Delete pointer to array of derivatives on FIAT element
 
2825
      delete [] derivatives;
 
2826
      
 
2827
      // Delete pointer to array of combinations of derivatives and transform
 
2828
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2829
      {
 
2830
        delete [] combinations[r];
 
2831
      }// end loop over 'r'
 
2832
      delete [] combinations;
 
2833
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2834
      {
 
2835
        delete [] transform[r];
 
2836
      }// end loop over 'r'
 
2837
      delete [] transform;
 
2838
        break;
 
2839
      }
 
2840
    case 6:
 
2841
      {
 
2842
        
 
2843
      // Array of basisvalues.
 
2844
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
2845
      
 
2846
      // Declare helper variables.
 
2847
      unsigned int rr = 0;
 
2848
      unsigned int ss = 0;
 
2849
      unsigned int tt = 0;
 
2850
      double tmp5 = 0.00000000;
 
2851
      double tmp6 = 0.00000000;
 
2852
      double tmp7 = 0.00000000;
 
2853
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
2854
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
2855
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
2856
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
2857
      double tmp4 = tmp3*tmp3;
 
2858
      
 
2859
      // Compute basisvalues.
 
2860
      basisvalues[0] = 1.00000000;
 
2861
      basisvalues[1] = tmp0;
 
2862
      for (unsigned int r = 1; r < 2; r++)
 
2863
      {
 
2864
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2865
        ss = r*(r + 1)*(r + 2)/6;
 
2866
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2867
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
2868
      }// end loop over 'r'
 
2869
      for (unsigned int r = 0; r < 2; r++)
 
2870
      {
 
2871
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2872
        ss = r*(r + 1)*(r + 2)/6;
 
2873
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
2874
      }// end loop over 'r'
 
2875
      for (unsigned int r = 0; r < 1; r++)
 
2876
      {
 
2877
        for (unsigned int s = 1; s < 2 - r; s++)
 
2878
        {
 
2879
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2880
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2881
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2882
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2883
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2884
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
2885
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2886
        }// end loop over 's'
 
2887
      }// end loop over 'r'
 
2888
      for (unsigned int r = 0; r < 2; r++)
 
2889
      {
 
2890
        for (unsigned int s = 0; s < 2 - r; s++)
 
2891
        {
 
2892
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2893
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2894
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
2895
        }// end loop over 's'
 
2896
      }// end loop over 'r'
 
2897
      for (unsigned int r = 0; r < 1; r++)
 
2898
      {
 
2899
        for (unsigned int s = 0; s < 1 - r; s++)
 
2900
        {
 
2901
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2902
          {
 
2903
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
2904
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2905
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
2906
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2907
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2908
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
2909
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2910
          }// end loop over 't'
 
2911
        }// end loop over 's'
 
2912
      }// end loop over 'r'
 
2913
      for (unsigned int r = 0; r < 3; r++)
 
2914
      {
 
2915
        for (unsigned int s = 0; s < 3 - r; s++)
 
2916
        {
 
2917
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2918
          {
 
2919
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2920
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
2921
          }// end loop over 't'
 
2922
        }// end loop over 's'
 
2923
      }// end loop over 'r'
 
2924
      
 
2925
      // Table(s) of coefficients.
 
2926
      static const double coefficients0[10] = \
 
2927
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
2928
      
 
2929
      // Tables of derivatives of the polynomial base (transpose).
 
2930
      static const double dmats0[10][10] = \
 
2931
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2932
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2933
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2934
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2935
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2936
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2937
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2938
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2939
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2940
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2941
      
 
2942
      static const double dmats1[10][10] = \
 
2943
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2944
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2945
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2946
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2947
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2948
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2949
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2950
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2951
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2952
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2953
      
 
2954
      static const double dmats2[10][10] = \
 
2955
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2956
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2957
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2958
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2959
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2960
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2961
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2962
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2963
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2964
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
2965
      
 
2966
      // Compute reference derivatives.
 
2967
      // Declare pointer to array of derivatives on FIAT element.
 
2968
      double *derivatives = new double[num_derivatives];
 
2969
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2970
      {
 
2971
        derivatives[r] = 0.00000000;
 
2972
      }// end loop over 'r'
 
2973
      
 
2974
      // Declare derivative matrix (of polynomial basis).
 
2975
      double dmats[10][10] = \
 
2976
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2977
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2978
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2979
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2980
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2981
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2982
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2983
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2984
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2985
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2986
      
 
2987
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2988
      double dmats_old[10][10] = \
 
2989
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2990
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2991
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2992
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2993
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2994
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2995
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
2996
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
2997
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
2998
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
2999
      
 
3000
      // Loop possible derivatives.
 
3001
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3002
      {
 
3003
        // Resetting dmats values to compute next derivative.
 
3004
        for (unsigned int t = 0; t < 10; t++)
 
3005
        {
 
3006
          for (unsigned int u = 0; u < 10; u++)
 
3007
          {
 
3008
            dmats[t][u] = 0.00000000;
 
3009
            if (t == u)
 
3010
            {
 
3011
            dmats[t][u] = 1.00000000;
 
3012
            }
 
3013
            
 
3014
          }// end loop over 'u'
 
3015
        }// end loop over 't'
 
3016
        
 
3017
        // Looping derivative order to generate dmats.
 
3018
        for (unsigned int s = 0; s < n; s++)
 
3019
        {
 
3020
          // Updating dmats_old with new values and resetting dmats.
 
3021
          for (unsigned int t = 0; t < 10; t++)
 
3022
          {
 
3023
            for (unsigned int u = 0; u < 10; u++)
 
3024
            {
 
3025
              dmats_old[t][u] = dmats[t][u];
 
3026
              dmats[t][u] = 0.00000000;
 
3027
            }// end loop over 'u'
 
3028
          }// end loop over 't'
 
3029
          
 
3030
          // Update dmats using an inner product.
 
3031
          if (combinations[r][s] == 0)
 
3032
          {
 
3033
          for (unsigned int t = 0; t < 10; t++)
 
3034
          {
 
3035
            for (unsigned int u = 0; u < 10; u++)
 
3036
            {
 
3037
              for (unsigned int tu = 0; tu < 10; tu++)
 
3038
              {
 
3039
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3040
              }// end loop over 'tu'
 
3041
            }// end loop over 'u'
 
3042
          }// end loop over 't'
 
3043
          }
 
3044
          
 
3045
          if (combinations[r][s] == 1)
 
3046
          {
 
3047
          for (unsigned int t = 0; t < 10; t++)
 
3048
          {
 
3049
            for (unsigned int u = 0; u < 10; u++)
 
3050
            {
 
3051
              for (unsigned int tu = 0; tu < 10; tu++)
 
3052
              {
 
3053
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3054
              }// end loop over 'tu'
 
3055
            }// end loop over 'u'
 
3056
          }// end loop over 't'
 
3057
          }
 
3058
          
 
3059
          if (combinations[r][s] == 2)
 
3060
          {
 
3061
          for (unsigned int t = 0; t < 10; t++)
 
3062
          {
 
3063
            for (unsigned int u = 0; u < 10; u++)
 
3064
            {
 
3065
              for (unsigned int tu = 0; tu < 10; tu++)
 
3066
              {
 
3067
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3068
              }// end loop over 'tu'
 
3069
            }// end loop over 'u'
 
3070
          }// end loop over 't'
 
3071
          }
 
3072
          
 
3073
        }// end loop over 's'
 
3074
        for (unsigned int s = 0; s < 10; s++)
 
3075
        {
 
3076
          for (unsigned int t = 0; t < 10; t++)
 
3077
          {
 
3078
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3079
          }// end loop over 't'
 
3080
        }// end loop over 's'
 
3081
      }// end loop over 'r'
 
3082
      
 
3083
      // Transform derivatives back to physical element
 
3084
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3085
      {
 
3086
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3087
        {
 
3088
          values[r] += transform[r][s]*derivatives[s];
 
3089
        }// end loop over 's'
 
3090
      }// end loop over 'r'
 
3091
      
 
3092
      // Delete pointer to array of derivatives on FIAT element
 
3093
      delete [] derivatives;
 
3094
      
 
3095
      // Delete pointer to array of combinations of derivatives and transform
 
3096
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3097
      {
 
3098
        delete [] combinations[r];
 
3099
      }// end loop over 'r'
 
3100
      delete [] combinations;
 
3101
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3102
      {
 
3103
        delete [] transform[r];
 
3104
      }// end loop over 'r'
 
3105
      delete [] transform;
 
3106
        break;
 
3107
      }
 
3108
    case 7:
 
3109
      {
 
3110
        
 
3111
      // Array of basisvalues.
 
3112
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
3113
      
 
3114
      // Declare helper variables.
 
3115
      unsigned int rr = 0;
 
3116
      unsigned int ss = 0;
 
3117
      unsigned int tt = 0;
 
3118
      double tmp5 = 0.00000000;
 
3119
      double tmp6 = 0.00000000;
 
3120
      double tmp7 = 0.00000000;
 
3121
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
3122
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
3123
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
3124
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
3125
      double tmp4 = tmp3*tmp3;
 
3126
      
 
3127
      // Compute basisvalues.
 
3128
      basisvalues[0] = 1.00000000;
 
3129
      basisvalues[1] = tmp0;
 
3130
      for (unsigned int r = 1; r < 2; r++)
 
3131
      {
 
3132
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
3133
        ss = r*(r + 1)*(r + 2)/6;
 
3134
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
3135
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
3136
      }// end loop over 'r'
 
3137
      for (unsigned int r = 0; r < 2; r++)
 
3138
      {
 
3139
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
3140
        ss = r*(r + 1)*(r + 2)/6;
 
3141
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
3142
      }// end loop over 'r'
 
3143
      for (unsigned int r = 0; r < 1; r++)
 
3144
      {
 
3145
        for (unsigned int s = 1; s < 2 - r; s++)
 
3146
        {
 
3147
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
3148
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3149
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
3150
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3151
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3152
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3153
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
3154
        }// end loop over 's'
 
3155
      }// end loop over 'r'
 
3156
      for (unsigned int r = 0; r < 2; r++)
 
3157
      {
 
3158
        for (unsigned int s = 0; s < 2 - r; s++)
 
3159
        {
 
3160
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
3161
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3162
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
3163
        }// end loop over 's'
 
3164
      }// end loop over 'r'
 
3165
      for (unsigned int r = 0; r < 1; r++)
 
3166
      {
 
3167
        for (unsigned int s = 0; s < 1 - r; s++)
 
3168
        {
 
3169
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
3170
          {
 
3171
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
3172
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3173
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
3174
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3175
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3176
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3177
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
3178
          }// end loop over 't'
 
3179
        }// end loop over 's'
 
3180
      }// end loop over 'r'
 
3181
      for (unsigned int r = 0; r < 3; r++)
 
3182
      {
 
3183
        for (unsigned int s = 0; s < 3 - r; s++)
 
3184
        {
 
3185
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
3186
          {
 
3187
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3188
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
3189
          }// end loop over 't'
 
3190
        }// end loop over 's'
 
3191
      }// end loop over 'r'
 
3192
      
 
3193
      // Table(s) of coefficients.
 
3194
      static const double coefficients0[10] = \
 
3195
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
3196
      
 
3197
      // Tables of derivatives of the polynomial base (transpose).
 
3198
      static const double dmats0[10][10] = \
 
3199
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3200
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3201
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3202
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3203
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3204
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3205
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3206
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3207
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3208
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3209
      
 
3210
      static const double dmats1[10][10] = \
 
3211
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3212
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3213
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3214
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3215
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3216
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3217
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3218
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3219
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3220
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3221
      
 
3222
      static const double dmats2[10][10] = \
 
3223
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3224
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3225
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3226
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3227
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3228
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3229
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3230
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3231
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3232
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3233
      
 
3234
      // Compute reference derivatives.
 
3235
      // Declare pointer to array of derivatives on FIAT element.
 
3236
      double *derivatives = new double[num_derivatives];
 
3237
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3238
      {
 
3239
        derivatives[r] = 0.00000000;
 
3240
      }// end loop over 'r'
 
3241
      
 
3242
      // Declare derivative matrix (of polynomial basis).
 
3243
      double dmats[10][10] = \
 
3244
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3245
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3246
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3247
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3248
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3249
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3250
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3251
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
3252
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
3253
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
3254
      
 
3255
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3256
      double dmats_old[10][10] = \
 
3257
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3258
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3259
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3260
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3261
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3262
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3263
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3264
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
3265
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
3266
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
3267
      
 
3268
      // Loop possible derivatives.
 
3269
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3270
      {
 
3271
        // Resetting dmats values to compute next derivative.
 
3272
        for (unsigned int t = 0; t < 10; t++)
 
3273
        {
 
3274
          for (unsigned int u = 0; u < 10; u++)
 
3275
          {
 
3276
            dmats[t][u] = 0.00000000;
 
3277
            if (t == u)
 
3278
            {
 
3279
            dmats[t][u] = 1.00000000;
 
3280
            }
 
3281
            
 
3282
          }// end loop over 'u'
 
3283
        }// end loop over 't'
 
3284
        
 
3285
        // Looping derivative order to generate dmats.
 
3286
        for (unsigned int s = 0; s < n; s++)
 
3287
        {
 
3288
          // Updating dmats_old with new values and resetting dmats.
 
3289
          for (unsigned int t = 0; t < 10; t++)
 
3290
          {
 
3291
            for (unsigned int u = 0; u < 10; u++)
 
3292
            {
 
3293
              dmats_old[t][u] = dmats[t][u];
 
3294
              dmats[t][u] = 0.00000000;
 
3295
            }// end loop over 'u'
 
3296
          }// end loop over 't'
 
3297
          
 
3298
          // Update dmats using an inner product.
 
3299
          if (combinations[r][s] == 0)
 
3300
          {
 
3301
          for (unsigned int t = 0; t < 10; t++)
 
3302
          {
 
3303
            for (unsigned int u = 0; u < 10; u++)
 
3304
            {
 
3305
              for (unsigned int tu = 0; tu < 10; tu++)
 
3306
              {
 
3307
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3308
              }// end loop over 'tu'
 
3309
            }// end loop over 'u'
 
3310
          }// end loop over 't'
 
3311
          }
 
3312
          
 
3313
          if (combinations[r][s] == 1)
 
3314
          {
 
3315
          for (unsigned int t = 0; t < 10; t++)
 
3316
          {
 
3317
            for (unsigned int u = 0; u < 10; u++)
 
3318
            {
 
3319
              for (unsigned int tu = 0; tu < 10; tu++)
 
3320
              {
 
3321
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3322
              }// end loop over 'tu'
 
3323
            }// end loop over 'u'
 
3324
          }// end loop over 't'
 
3325
          }
 
3326
          
 
3327
          if (combinations[r][s] == 2)
 
3328
          {
 
3329
          for (unsigned int t = 0; t < 10; t++)
 
3330
          {
 
3331
            for (unsigned int u = 0; u < 10; u++)
 
3332
            {
 
3333
              for (unsigned int tu = 0; tu < 10; tu++)
 
3334
              {
 
3335
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3336
              }// end loop over 'tu'
 
3337
            }// end loop over 'u'
 
3338
          }// end loop over 't'
 
3339
          }
 
3340
          
 
3341
        }// end loop over 's'
 
3342
        for (unsigned int s = 0; s < 10; s++)
 
3343
        {
 
3344
          for (unsigned int t = 0; t < 10; t++)
 
3345
          {
 
3346
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3347
          }// end loop over 't'
 
3348
        }// end loop over 's'
 
3349
      }// end loop over 'r'
 
3350
      
 
3351
      // Transform derivatives back to physical element
 
3352
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3353
      {
 
3354
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3355
        {
 
3356
          values[r] += transform[r][s]*derivatives[s];
 
3357
        }// end loop over 's'
 
3358
      }// end loop over 'r'
 
3359
      
 
3360
      // Delete pointer to array of derivatives on FIAT element
 
3361
      delete [] derivatives;
 
3362
      
 
3363
      // Delete pointer to array of combinations of derivatives and transform
 
3364
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3365
      {
 
3366
        delete [] combinations[r];
 
3367
      }// end loop over 'r'
 
3368
      delete [] combinations;
 
3369
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3370
      {
 
3371
        delete [] transform[r];
 
3372
      }// end loop over 'r'
 
3373
      delete [] transform;
 
3374
        break;
 
3375
      }
 
3376
    case 8:
 
3377
      {
 
3378
        
 
3379
      // Array of basisvalues.
 
3380
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
3381
      
 
3382
      // Declare helper variables.
 
3383
      unsigned int rr = 0;
 
3384
      unsigned int ss = 0;
 
3385
      unsigned int tt = 0;
 
3386
      double tmp5 = 0.00000000;
 
3387
      double tmp6 = 0.00000000;
 
3388
      double tmp7 = 0.00000000;
 
3389
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
3390
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
3391
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
3392
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
3393
      double tmp4 = tmp3*tmp3;
 
3394
      
 
3395
      // Compute basisvalues.
 
3396
      basisvalues[0] = 1.00000000;
 
3397
      basisvalues[1] = tmp0;
 
3398
      for (unsigned int r = 1; r < 2; r++)
 
3399
      {
 
3400
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
3401
        ss = r*(r + 1)*(r + 2)/6;
 
3402
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
3403
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
3404
      }// end loop over 'r'
 
3405
      for (unsigned int r = 0; r < 2; r++)
 
3406
      {
 
3407
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
3408
        ss = r*(r + 1)*(r + 2)/6;
 
3409
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
3410
      }// end loop over 'r'
 
3411
      for (unsigned int r = 0; r < 1; r++)
 
3412
      {
 
3413
        for (unsigned int s = 1; s < 2 - r; s++)
 
3414
        {
 
3415
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
3416
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3417
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
3418
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3419
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3420
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3421
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
3422
        }// end loop over 's'
 
3423
      }// end loop over 'r'
 
3424
      for (unsigned int r = 0; r < 2; r++)
 
3425
      {
 
3426
        for (unsigned int s = 0; s < 2 - r; s++)
 
3427
        {
 
3428
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
3429
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3430
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
3431
        }// end loop over 's'
 
3432
      }// end loop over 'r'
 
3433
      for (unsigned int r = 0; r < 1; r++)
 
3434
      {
 
3435
        for (unsigned int s = 0; s < 1 - r; s++)
 
3436
        {
 
3437
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
3438
          {
 
3439
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
3440
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3441
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
3442
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3443
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3444
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3445
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
3446
          }// end loop over 't'
 
3447
        }// end loop over 's'
 
3448
      }// end loop over 'r'
 
3449
      for (unsigned int r = 0; r < 3; r++)
 
3450
      {
 
3451
        for (unsigned int s = 0; s < 3 - r; s++)
 
3452
        {
 
3453
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
3454
          {
 
3455
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3456
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
3457
          }// end loop over 't'
 
3458
        }// end loop over 's'
 
3459
      }// end loop over 'r'
 
3460
      
 
3461
      // Table(s) of coefficients.
 
3462
      static const double coefficients0[10] = \
 
3463
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
3464
      
 
3465
      // Tables of derivatives of the polynomial base (transpose).
 
3466
      static const double dmats0[10][10] = \
 
3467
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3468
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3469
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3470
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3471
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3472
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3473
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3474
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3475
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3476
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3477
      
 
3478
      static const double dmats1[10][10] = \
 
3479
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3480
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3481
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3482
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3483
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3484
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3485
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3486
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3487
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3488
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3489
      
 
3490
      static const double dmats2[10][10] = \
 
3491
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3492
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3493
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3494
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3495
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3496
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3497
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3498
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3499
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3500
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3501
      
 
3502
      // Compute reference derivatives.
 
3503
      // Declare pointer to array of derivatives on FIAT element.
 
3504
      double *derivatives = new double[num_derivatives];
 
3505
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3506
      {
 
3507
        derivatives[r] = 0.00000000;
 
3508
      }// end loop over 'r'
 
3509
      
 
3510
      // Declare derivative matrix (of polynomial basis).
 
3511
      double dmats[10][10] = \
 
3512
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3513
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3514
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3515
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3516
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3517
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3518
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3519
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
3520
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
3521
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
3522
      
 
3523
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3524
      double dmats_old[10][10] = \
 
3525
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3526
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3527
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3528
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3529
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3530
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3531
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3532
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
3533
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
3534
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
3535
      
 
3536
      // Loop possible derivatives.
 
3537
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3538
      {
 
3539
        // Resetting dmats values to compute next derivative.
 
3540
        for (unsigned int t = 0; t < 10; t++)
 
3541
        {
 
3542
          for (unsigned int u = 0; u < 10; u++)
 
3543
          {
 
3544
            dmats[t][u] = 0.00000000;
 
3545
            if (t == u)
 
3546
            {
 
3547
            dmats[t][u] = 1.00000000;
 
3548
            }
 
3549
            
 
3550
          }// end loop over 'u'
 
3551
        }// end loop over 't'
 
3552
        
 
3553
        // Looping derivative order to generate dmats.
 
3554
        for (unsigned int s = 0; s < n; s++)
 
3555
        {
 
3556
          // Updating dmats_old with new values and resetting dmats.
 
3557
          for (unsigned int t = 0; t < 10; t++)
 
3558
          {
 
3559
            for (unsigned int u = 0; u < 10; u++)
 
3560
            {
 
3561
              dmats_old[t][u] = dmats[t][u];
 
3562
              dmats[t][u] = 0.00000000;
 
3563
            }// end loop over 'u'
 
3564
          }// end loop over 't'
 
3565
          
 
3566
          // Update dmats using an inner product.
 
3567
          if (combinations[r][s] == 0)
 
3568
          {
 
3569
          for (unsigned int t = 0; t < 10; t++)
 
3570
          {
 
3571
            for (unsigned int u = 0; u < 10; u++)
 
3572
            {
 
3573
              for (unsigned int tu = 0; tu < 10; tu++)
 
3574
              {
 
3575
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3576
              }// end loop over 'tu'
 
3577
            }// end loop over 'u'
 
3578
          }// end loop over 't'
 
3579
          }
 
3580
          
 
3581
          if (combinations[r][s] == 1)
 
3582
          {
 
3583
          for (unsigned int t = 0; t < 10; t++)
 
3584
          {
 
3585
            for (unsigned int u = 0; u < 10; u++)
 
3586
            {
 
3587
              for (unsigned int tu = 0; tu < 10; tu++)
 
3588
              {
 
3589
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3590
              }// end loop over 'tu'
 
3591
            }// end loop over 'u'
 
3592
          }// end loop over 't'
 
3593
          }
 
3594
          
 
3595
          if (combinations[r][s] == 2)
 
3596
          {
 
3597
          for (unsigned int t = 0; t < 10; t++)
 
3598
          {
 
3599
            for (unsigned int u = 0; u < 10; u++)
 
3600
            {
 
3601
              for (unsigned int tu = 0; tu < 10; tu++)
 
3602
              {
 
3603
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3604
              }// end loop over 'tu'
 
3605
            }// end loop over 'u'
 
3606
          }// end loop over 't'
 
3607
          }
 
3608
          
 
3609
        }// end loop over 's'
 
3610
        for (unsigned int s = 0; s < 10; s++)
 
3611
        {
 
3612
          for (unsigned int t = 0; t < 10; t++)
 
3613
          {
 
3614
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3615
          }// end loop over 't'
 
3616
        }// end loop over 's'
 
3617
      }// end loop over 'r'
 
3618
      
 
3619
      // Transform derivatives back to physical element
 
3620
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3621
      {
 
3622
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3623
        {
 
3624
          values[r] += transform[r][s]*derivatives[s];
 
3625
        }// end loop over 's'
 
3626
      }// end loop over 'r'
 
3627
      
 
3628
      // Delete pointer to array of derivatives on FIAT element
 
3629
      delete [] derivatives;
 
3630
      
 
3631
      // Delete pointer to array of combinations of derivatives and transform
 
3632
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3633
      {
 
3634
        delete [] combinations[r];
 
3635
      }// end loop over 'r'
 
3636
      delete [] combinations;
 
3637
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3638
      {
 
3639
        delete [] transform[r];
 
3640
      }// end loop over 'r'
 
3641
      delete [] transform;
 
3642
        break;
 
3643
      }
 
3644
    case 9:
 
3645
      {
 
3646
        
 
3647
      // Array of basisvalues.
 
3648
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
3649
      
 
3650
      // Declare helper variables.
 
3651
      unsigned int rr = 0;
 
3652
      unsigned int ss = 0;
 
3653
      unsigned int tt = 0;
 
3654
      double tmp5 = 0.00000000;
 
3655
      double tmp6 = 0.00000000;
 
3656
      double tmp7 = 0.00000000;
 
3657
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
3658
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
3659
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
3660
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
3661
      double tmp4 = tmp3*tmp3;
 
3662
      
 
3663
      // Compute basisvalues.
 
3664
      basisvalues[0] = 1.00000000;
 
3665
      basisvalues[1] = tmp0;
 
3666
      for (unsigned int r = 1; r < 2; r++)
 
3667
      {
 
3668
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
3669
        ss = r*(r + 1)*(r + 2)/6;
 
3670
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
3671
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
3672
      }// end loop over 'r'
 
3673
      for (unsigned int r = 0; r < 2; r++)
 
3674
      {
 
3675
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
3676
        ss = r*(r + 1)*(r + 2)/6;
 
3677
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
3678
      }// end loop over 'r'
 
3679
      for (unsigned int r = 0; r < 1; r++)
 
3680
      {
 
3681
        for (unsigned int s = 1; s < 2 - r; s++)
 
3682
        {
 
3683
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
3684
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3685
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
3686
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3687
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3688
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
3689
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
3690
        }// end loop over 's'
 
3691
      }// end loop over 'r'
 
3692
      for (unsigned int r = 0; r < 2; r++)
 
3693
      {
 
3694
        for (unsigned int s = 0; s < 2 - r; s++)
 
3695
        {
 
3696
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
3697
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3698
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
3699
        }// end loop over 's'
 
3700
      }// end loop over 'r'
 
3701
      for (unsigned int r = 0; r < 1; r++)
 
3702
      {
 
3703
        for (unsigned int s = 0; s < 1 - r; s++)
 
3704
        {
 
3705
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
3706
          {
 
3707
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
3708
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3709
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
3710
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3711
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3712
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
3713
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
3714
          }// end loop over 't'
 
3715
        }// end loop over 's'
 
3716
      }// end loop over 'r'
 
3717
      for (unsigned int r = 0; r < 3; r++)
 
3718
      {
 
3719
        for (unsigned int s = 0; s < 3 - r; s++)
 
3720
        {
 
3721
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
3722
          {
 
3723
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3724
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
3725
          }// end loop over 't'
 
3726
        }// end loop over 's'
 
3727
      }// end loop over 'r'
 
3728
      
 
3729
      // Table(s) of coefficients.
 
3730
      static const double coefficients0[10] = \
 
3731
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
3732
      
 
3733
      // Tables of derivatives of the polynomial base (transpose).
 
3734
      static const double dmats0[10][10] = \
 
3735
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3736
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3737
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3738
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3739
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3740
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3741
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3742
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3743
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3744
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3745
      
 
3746
      static const double dmats1[10][10] = \
 
3747
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3748
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3749
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3750
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3751
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3752
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3753
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3754
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3755
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3756
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3757
      
 
3758
      static const double dmats2[10][10] = \
 
3759
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3760
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3761
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3762
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3763
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3764
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3765
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3766
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3767
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3768
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
3769
      
 
3770
      // Compute reference derivatives.
 
3771
      // Declare pointer to array of derivatives on FIAT element.
 
3772
      double *derivatives = new double[num_derivatives];
 
3773
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3774
      {
 
3775
        derivatives[r] = 0.00000000;
 
3776
      }// end loop over 'r'
 
3777
      
 
3778
      // Declare derivative matrix (of polynomial basis).
 
3779
      double dmats[10][10] = \
 
3780
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3781
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3782
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3783
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3784
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3785
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3786
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3787
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
3788
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
3789
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
3790
      
 
3791
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3792
      double dmats_old[10][10] = \
 
3793
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3794
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3795
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3796
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3797
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3798
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3799
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
3800
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
3801
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
3802
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
3803
      
 
3804
      // Loop possible derivatives.
 
3805
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3806
      {
 
3807
        // Resetting dmats values to compute next derivative.
 
3808
        for (unsigned int t = 0; t < 10; t++)
 
3809
        {
 
3810
          for (unsigned int u = 0; u < 10; u++)
 
3811
          {
 
3812
            dmats[t][u] = 0.00000000;
 
3813
            if (t == u)
 
3814
            {
 
3815
            dmats[t][u] = 1.00000000;
 
3816
            }
 
3817
            
 
3818
          }// end loop over 'u'
 
3819
        }// end loop over 't'
 
3820
        
 
3821
        // Looping derivative order to generate dmats.
 
3822
        for (unsigned int s = 0; s < n; s++)
 
3823
        {
 
3824
          // Updating dmats_old with new values and resetting dmats.
 
3825
          for (unsigned int t = 0; t < 10; t++)
 
3826
          {
 
3827
            for (unsigned int u = 0; u < 10; u++)
 
3828
            {
 
3829
              dmats_old[t][u] = dmats[t][u];
 
3830
              dmats[t][u] = 0.00000000;
 
3831
            }// end loop over 'u'
 
3832
          }// end loop over 't'
 
3833
          
 
3834
          // Update dmats using an inner product.
 
3835
          if (combinations[r][s] == 0)
 
3836
          {
 
3837
          for (unsigned int t = 0; t < 10; t++)
 
3838
          {
 
3839
            for (unsigned int u = 0; u < 10; u++)
 
3840
            {
 
3841
              for (unsigned int tu = 0; tu < 10; tu++)
 
3842
              {
 
3843
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3844
              }// end loop over 'tu'
 
3845
            }// end loop over 'u'
 
3846
          }// end loop over 't'
 
3847
          }
 
3848
          
 
3849
          if (combinations[r][s] == 1)
 
3850
          {
 
3851
          for (unsigned int t = 0; t < 10; t++)
 
3852
          {
 
3853
            for (unsigned int u = 0; u < 10; u++)
 
3854
            {
 
3855
              for (unsigned int tu = 0; tu < 10; tu++)
 
3856
              {
 
3857
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3858
              }// end loop over 'tu'
 
3859
            }// end loop over 'u'
 
3860
          }// end loop over 't'
 
3861
          }
 
3862
          
 
3863
          if (combinations[r][s] == 2)
 
3864
          {
 
3865
          for (unsigned int t = 0; t < 10; t++)
 
3866
          {
 
3867
            for (unsigned int u = 0; u < 10; u++)
 
3868
            {
 
3869
              for (unsigned int tu = 0; tu < 10; tu++)
 
3870
              {
 
3871
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3872
              }// end loop over 'tu'
 
3873
            }// end loop over 'u'
 
3874
          }// end loop over 't'
 
3875
          }
 
3876
          
 
3877
        }// end loop over 's'
 
3878
        for (unsigned int s = 0; s < 10; s++)
 
3879
        {
 
3880
          for (unsigned int t = 0; t < 10; t++)
 
3881
          {
 
3882
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3883
          }// end loop over 't'
 
3884
        }// end loop over 's'
 
3885
      }// end loop over 'r'
 
3886
      
 
3887
      // Transform derivatives back to physical element
 
3888
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3889
      {
 
3890
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3891
        {
 
3892
          values[r] += transform[r][s]*derivatives[s];
 
3893
        }// end loop over 's'
 
3894
      }// end loop over 'r'
 
3895
      
 
3896
      // Delete pointer to array of derivatives on FIAT element
 
3897
      delete [] derivatives;
 
3898
      
 
3899
      // Delete pointer to array of combinations of derivatives and transform
 
3900
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3901
      {
 
3902
        delete [] combinations[r];
 
3903
      }// end loop over 'r'
 
3904
      delete [] combinations;
 
3905
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3906
      {
 
3907
        delete [] transform[r];
 
3908
      }// end loop over 'r'
 
3909
      delete [] transform;
 
3910
        break;
 
3911
      }
 
3912
    }
 
3913
    
645
3914
  }
646
3915
 
647
3916
  /// Evaluate order n derivatives of all basis functions at given point in cell
983
4252
    values[0] = 0.00000000;
984
4253
    values[1] = 0.00000000;
985
4254
    values[2] = 0.00000000;
986
 
    if (0 <= i && i <= 9)
987
 
    {
988
 
      // Map degree of freedom to element degree of freedom
989
 
      const unsigned int dof = i;
990
 
      
991
 
      // Array of basisvalues.
992
 
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
993
 
      
994
 
      // Declare helper variables.
995
 
      unsigned int rr = 0;
996
 
      unsigned int ss = 0;
997
 
      unsigned int tt = 0;
998
 
      double tmp5 = 0.00000000;
999
 
      double tmp6 = 0.00000000;
1000
 
      double tmp7 = 0.00000000;
1001
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1002
 
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1003
 
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1004
 
      double tmp3 = 0.50000000*(1.00000000 - Z);
1005
 
      double tmp4 = tmp3*tmp3;
1006
 
      
1007
 
      // Compute basisvalues.
1008
 
      basisvalues[0] = 1.00000000;
1009
 
      basisvalues[1] = tmp0;
1010
 
      for (unsigned int r = 1; r < 2; r++)
1011
 
      {
1012
 
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1013
 
        ss = r*(r + 1)*(r + 2)/6;
1014
 
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1015
 
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1016
 
      }// end loop over 'r'
1017
 
      for (unsigned int r = 0; r < 2; r++)
1018
 
      {
1019
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1020
 
        ss = r*(r + 1)*(r + 2)/6;
1021
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1022
 
      }// end loop over 'r'
1023
 
      for (unsigned int r = 0; r < 1; r++)
1024
 
      {
1025
 
        for (unsigned int s = 1; s < 2 - r; s++)
1026
 
        {
1027
 
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1028
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1029
 
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1030
 
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1031
 
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1032
 
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1033
 
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1034
 
        }// end loop over 's'
1035
 
      }// end loop over 'r'
1036
 
      for (unsigned int r = 0; r < 2; r++)
1037
 
      {
1038
 
        for (unsigned int s = 0; s < 2 - r; s++)
1039
 
        {
1040
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1041
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1042
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1043
 
        }// end loop over 's'
1044
 
      }// end loop over 'r'
1045
 
      for (unsigned int r = 0; r < 1; r++)
1046
 
      {
1047
 
        for (unsigned int s = 0; s < 1 - r; s++)
1048
 
        {
1049
 
          for (unsigned int t = 1; t < 2 - r - s; t++)
1050
 
          {
1051
 
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1052
 
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1053
 
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1054
 
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1055
 
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1056
 
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1057
 
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1058
 
          }// end loop over 't'
1059
 
        }// end loop over 's'
1060
 
      }// end loop over 'r'
1061
 
      for (unsigned int r = 0; r < 3; r++)
1062
 
      {
1063
 
        for (unsigned int s = 0; s < 3 - r; s++)
1064
 
        {
1065
 
          for (unsigned int t = 0; t < 3 - r - s; t++)
1066
 
          {
1067
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1068
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1069
 
          }// end loop over 't'
1070
 
        }// end loop over 's'
1071
 
      }// end loop over 'r'
1072
 
      
1073
 
      // Table(s) of coefficients.
1074
 
      static const double coefficients0[10][10] = \
1075
 
      {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1076
 
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1077
 
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1078
 
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1079
 
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1080
 
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1081
 
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1082
 
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1083
 
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1084
 
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1085
 
      
1086
 
      // Compute value(s).
1087
 
      for (unsigned int r = 0; r < 10; r++)
1088
 
      {
1089
 
        values[0] += coefficients0[dof][r]*basisvalues[r];
1090
 
      }// end loop over 'r'
1091
 
    }
1092
 
    
1093
 
    if (10 <= i && i <= 19)
1094
 
    {
1095
 
      // Map degree of freedom to element degree of freedom
1096
 
      const unsigned int dof = i - 10;
1097
 
      
1098
 
      // Array of basisvalues.
1099
 
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1100
 
      
1101
 
      // Declare helper variables.
1102
 
      unsigned int rr = 0;
1103
 
      unsigned int ss = 0;
1104
 
      unsigned int tt = 0;
1105
 
      double tmp5 = 0.00000000;
1106
 
      double tmp6 = 0.00000000;
1107
 
      double tmp7 = 0.00000000;
1108
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1109
 
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1110
 
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1111
 
      double tmp3 = 0.50000000*(1.00000000 - Z);
1112
 
      double tmp4 = tmp3*tmp3;
1113
 
      
1114
 
      // Compute basisvalues.
1115
 
      basisvalues[0] = 1.00000000;
1116
 
      basisvalues[1] = tmp0;
1117
 
      for (unsigned int r = 1; r < 2; r++)
1118
 
      {
1119
 
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1120
 
        ss = r*(r + 1)*(r + 2)/6;
1121
 
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1122
 
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1123
 
      }// end loop over 'r'
1124
 
      for (unsigned int r = 0; r < 2; r++)
1125
 
      {
1126
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1127
 
        ss = r*(r + 1)*(r + 2)/6;
1128
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1129
 
      }// end loop over 'r'
1130
 
      for (unsigned int r = 0; r < 1; r++)
1131
 
      {
1132
 
        for (unsigned int s = 1; s < 2 - r; s++)
1133
 
        {
1134
 
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1135
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1136
 
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1137
 
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1138
 
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1139
 
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1140
 
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1141
 
        }// end loop over 's'
1142
 
      }// end loop over 'r'
1143
 
      for (unsigned int r = 0; r < 2; r++)
1144
 
      {
1145
 
        for (unsigned int s = 0; s < 2 - r; s++)
1146
 
        {
1147
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1148
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1149
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1150
 
        }// end loop over 's'
1151
 
      }// end loop over 'r'
1152
 
      for (unsigned int r = 0; r < 1; r++)
1153
 
      {
1154
 
        for (unsigned int s = 0; s < 1 - r; s++)
1155
 
        {
1156
 
          for (unsigned int t = 1; t < 2 - r - s; t++)
1157
 
          {
1158
 
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1159
 
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1160
 
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1161
 
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1162
 
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1163
 
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1164
 
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1165
 
          }// end loop over 't'
1166
 
        }// end loop over 's'
1167
 
      }// end loop over 'r'
1168
 
      for (unsigned int r = 0; r < 3; r++)
1169
 
      {
1170
 
        for (unsigned int s = 0; s < 3 - r; s++)
1171
 
        {
1172
 
          for (unsigned int t = 0; t < 3 - r - s; t++)
1173
 
          {
1174
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1175
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1176
 
          }// end loop over 't'
1177
 
        }// end loop over 's'
1178
 
      }// end loop over 'r'
1179
 
      
1180
 
      // Table(s) of coefficients.
1181
 
      static const double coefficients0[10][10] = \
1182
 
      {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1183
 
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1184
 
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1185
 
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1186
 
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1187
 
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1188
 
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1189
 
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1190
 
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1191
 
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1192
 
      
1193
 
      // Compute value(s).
1194
 
      for (unsigned int r = 0; r < 10; r++)
1195
 
      {
1196
 
        values[1] += coefficients0[dof][r]*basisvalues[r];
1197
 
      }// end loop over 'r'
1198
 
    }
1199
 
    
1200
 
    if (20 <= i && i <= 29)
1201
 
    {
1202
 
      // Map degree of freedom to element degree of freedom
1203
 
      const unsigned int dof = i - 20;
1204
 
      
1205
 
      // Array of basisvalues.
1206
 
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1207
 
      
1208
 
      // Declare helper variables.
1209
 
      unsigned int rr = 0;
1210
 
      unsigned int ss = 0;
1211
 
      unsigned int tt = 0;
1212
 
      double tmp5 = 0.00000000;
1213
 
      double tmp6 = 0.00000000;
1214
 
      double tmp7 = 0.00000000;
1215
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1216
 
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1217
 
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1218
 
      double tmp3 = 0.50000000*(1.00000000 - Z);
1219
 
      double tmp4 = tmp3*tmp3;
1220
 
      
1221
 
      // Compute basisvalues.
1222
 
      basisvalues[0] = 1.00000000;
1223
 
      basisvalues[1] = tmp0;
1224
 
      for (unsigned int r = 1; r < 2; r++)
1225
 
      {
1226
 
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1227
 
        ss = r*(r + 1)*(r + 2)/6;
1228
 
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1229
 
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1230
 
      }// end loop over 'r'
1231
 
      for (unsigned int r = 0; r < 2; r++)
1232
 
      {
1233
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1234
 
        ss = r*(r + 1)*(r + 2)/6;
1235
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1236
 
      }// end loop over 'r'
1237
 
      for (unsigned int r = 0; r < 1; r++)
1238
 
      {
1239
 
        for (unsigned int s = 1; s < 2 - r; s++)
1240
 
        {
1241
 
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1242
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1243
 
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1244
 
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1245
 
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1246
 
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1247
 
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1248
 
        }// end loop over 's'
1249
 
      }// end loop over 'r'
1250
 
      for (unsigned int r = 0; r < 2; r++)
1251
 
      {
1252
 
        for (unsigned int s = 0; s < 2 - r; s++)
1253
 
        {
1254
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1255
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1256
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1257
 
        }// end loop over 's'
1258
 
      }// end loop over 'r'
1259
 
      for (unsigned int r = 0; r < 1; r++)
1260
 
      {
1261
 
        for (unsigned int s = 0; s < 1 - r; s++)
1262
 
        {
1263
 
          for (unsigned int t = 1; t < 2 - r - s; t++)
1264
 
          {
1265
 
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1266
 
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1267
 
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1268
 
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1269
 
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1270
 
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1271
 
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1272
 
          }// end loop over 't'
1273
 
        }// end loop over 's'
1274
 
      }// end loop over 'r'
1275
 
      for (unsigned int r = 0; r < 3; r++)
1276
 
      {
1277
 
        for (unsigned int s = 0; s < 3 - r; s++)
1278
 
        {
1279
 
          for (unsigned int t = 0; t < 3 - r - s; t++)
1280
 
          {
1281
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1282
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1283
 
          }// end loop over 't'
1284
 
        }// end loop over 's'
1285
 
      }// end loop over 'r'
1286
 
      
1287
 
      // Table(s) of coefficients.
1288
 
      static const double coefficients0[10][10] = \
1289
 
      {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1290
 
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1291
 
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1292
 
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1293
 
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1294
 
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1295
 
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1296
 
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1297
 
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1298
 
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1299
 
      
1300
 
      // Compute value(s).
1301
 
      for (unsigned int r = 0; r < 10; r++)
1302
 
      {
1303
 
        values[2] += coefficients0[dof][r]*basisvalues[r];
1304
 
      }// end loop over 'r'
 
4255
    switch (i)
 
4256
    {
 
4257
    case 0:
 
4258
      {
 
4259
        
 
4260
      // Array of basisvalues.
 
4261
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4262
      
 
4263
      // Declare helper variables.
 
4264
      unsigned int rr = 0;
 
4265
      unsigned int ss = 0;
 
4266
      unsigned int tt = 0;
 
4267
      double tmp5 = 0.00000000;
 
4268
      double tmp6 = 0.00000000;
 
4269
      double tmp7 = 0.00000000;
 
4270
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4271
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4272
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4273
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4274
      double tmp4 = tmp3*tmp3;
 
4275
      
 
4276
      // Compute basisvalues.
 
4277
      basisvalues[0] = 1.00000000;
 
4278
      basisvalues[1] = tmp0;
 
4279
      for (unsigned int r = 1; r < 2; r++)
 
4280
      {
 
4281
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4282
        ss = r*(r + 1)*(r + 2)/6;
 
4283
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4284
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4285
      }// end loop over 'r'
 
4286
      for (unsigned int r = 0; r < 2; r++)
 
4287
      {
 
4288
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4289
        ss = r*(r + 1)*(r + 2)/6;
 
4290
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4291
      }// end loop over 'r'
 
4292
      for (unsigned int r = 0; r < 1; r++)
 
4293
      {
 
4294
        for (unsigned int s = 1; s < 2 - r; s++)
 
4295
        {
 
4296
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4297
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4298
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4299
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4300
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4301
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4302
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4303
        }// end loop over 's'
 
4304
      }// end loop over 'r'
 
4305
      for (unsigned int r = 0; r < 2; r++)
 
4306
      {
 
4307
        for (unsigned int s = 0; s < 2 - r; s++)
 
4308
        {
 
4309
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4310
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4311
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4312
        }// end loop over 's'
 
4313
      }// end loop over 'r'
 
4314
      for (unsigned int r = 0; r < 1; r++)
 
4315
      {
 
4316
        for (unsigned int s = 0; s < 1 - r; s++)
 
4317
        {
 
4318
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4319
          {
 
4320
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4321
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4322
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4323
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4324
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4325
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4326
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4327
          }// end loop over 't'
 
4328
        }// end loop over 's'
 
4329
      }// end loop over 'r'
 
4330
      for (unsigned int r = 0; r < 3; r++)
 
4331
      {
 
4332
        for (unsigned int s = 0; s < 3 - r; s++)
 
4333
        {
 
4334
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4335
          {
 
4336
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4337
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4338
          }// end loop over 't'
 
4339
        }// end loop over 's'
 
4340
      }// end loop over 'r'
 
4341
      
 
4342
      // Table(s) of coefficients.
 
4343
      static const double coefficients0[10] = \
 
4344
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
4345
      
 
4346
      // Compute value(s).
 
4347
      for (unsigned int r = 0; r < 10; r++)
 
4348
      {
 
4349
        values[0] += coefficients0[r]*basisvalues[r];
 
4350
      }// end loop over 'r'
 
4351
        break;
 
4352
      }
 
4353
    case 1:
 
4354
      {
 
4355
        
 
4356
      // Array of basisvalues.
 
4357
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4358
      
 
4359
      // Declare helper variables.
 
4360
      unsigned int rr = 0;
 
4361
      unsigned int ss = 0;
 
4362
      unsigned int tt = 0;
 
4363
      double tmp5 = 0.00000000;
 
4364
      double tmp6 = 0.00000000;
 
4365
      double tmp7 = 0.00000000;
 
4366
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4367
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4368
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4369
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4370
      double tmp4 = tmp3*tmp3;
 
4371
      
 
4372
      // Compute basisvalues.
 
4373
      basisvalues[0] = 1.00000000;
 
4374
      basisvalues[1] = tmp0;
 
4375
      for (unsigned int r = 1; r < 2; r++)
 
4376
      {
 
4377
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4378
        ss = r*(r + 1)*(r + 2)/6;
 
4379
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4380
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4381
      }// end loop over 'r'
 
4382
      for (unsigned int r = 0; r < 2; r++)
 
4383
      {
 
4384
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4385
        ss = r*(r + 1)*(r + 2)/6;
 
4386
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4387
      }// end loop over 'r'
 
4388
      for (unsigned int r = 0; r < 1; r++)
 
4389
      {
 
4390
        for (unsigned int s = 1; s < 2 - r; s++)
 
4391
        {
 
4392
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4393
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4394
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4395
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4396
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4397
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4398
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4399
        }// end loop over 's'
 
4400
      }// end loop over 'r'
 
4401
      for (unsigned int r = 0; r < 2; r++)
 
4402
      {
 
4403
        for (unsigned int s = 0; s < 2 - r; s++)
 
4404
        {
 
4405
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4406
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4407
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4408
        }// end loop over 's'
 
4409
      }// end loop over 'r'
 
4410
      for (unsigned int r = 0; r < 1; r++)
 
4411
      {
 
4412
        for (unsigned int s = 0; s < 1 - r; s++)
 
4413
        {
 
4414
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4415
          {
 
4416
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4417
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4418
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4419
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4420
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4421
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4422
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4423
          }// end loop over 't'
 
4424
        }// end loop over 's'
 
4425
      }// end loop over 'r'
 
4426
      for (unsigned int r = 0; r < 3; r++)
 
4427
      {
 
4428
        for (unsigned int s = 0; s < 3 - r; s++)
 
4429
        {
 
4430
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4431
          {
 
4432
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4433
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4434
          }// end loop over 't'
 
4435
        }// end loop over 's'
 
4436
      }// end loop over 'r'
 
4437
      
 
4438
      // Table(s) of coefficients.
 
4439
      static const double coefficients0[10] = \
 
4440
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
4441
      
 
4442
      // Compute value(s).
 
4443
      for (unsigned int r = 0; r < 10; r++)
 
4444
      {
 
4445
        values[0] += coefficients0[r]*basisvalues[r];
 
4446
      }// end loop over 'r'
 
4447
        break;
 
4448
      }
 
4449
    case 2:
 
4450
      {
 
4451
        
 
4452
      // Array of basisvalues.
 
4453
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4454
      
 
4455
      // Declare helper variables.
 
4456
      unsigned int rr = 0;
 
4457
      unsigned int ss = 0;
 
4458
      unsigned int tt = 0;
 
4459
      double tmp5 = 0.00000000;
 
4460
      double tmp6 = 0.00000000;
 
4461
      double tmp7 = 0.00000000;
 
4462
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4463
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4464
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4465
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4466
      double tmp4 = tmp3*tmp3;
 
4467
      
 
4468
      // Compute basisvalues.
 
4469
      basisvalues[0] = 1.00000000;
 
4470
      basisvalues[1] = tmp0;
 
4471
      for (unsigned int r = 1; r < 2; r++)
 
4472
      {
 
4473
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4474
        ss = r*(r + 1)*(r + 2)/6;
 
4475
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4476
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4477
      }// end loop over 'r'
 
4478
      for (unsigned int r = 0; r < 2; r++)
 
4479
      {
 
4480
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4481
        ss = r*(r + 1)*(r + 2)/6;
 
4482
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4483
      }// end loop over 'r'
 
4484
      for (unsigned int r = 0; r < 1; r++)
 
4485
      {
 
4486
        for (unsigned int s = 1; s < 2 - r; s++)
 
4487
        {
 
4488
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4489
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4490
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4491
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4492
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4493
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4494
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4495
        }// end loop over 's'
 
4496
      }// end loop over 'r'
 
4497
      for (unsigned int r = 0; r < 2; r++)
 
4498
      {
 
4499
        for (unsigned int s = 0; s < 2 - r; s++)
 
4500
        {
 
4501
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4502
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4503
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4504
        }// end loop over 's'
 
4505
      }// end loop over 'r'
 
4506
      for (unsigned int r = 0; r < 1; r++)
 
4507
      {
 
4508
        for (unsigned int s = 0; s < 1 - r; s++)
 
4509
        {
 
4510
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4511
          {
 
4512
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4513
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4514
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4515
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4516
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4517
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4518
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4519
          }// end loop over 't'
 
4520
        }// end loop over 's'
 
4521
      }// end loop over 'r'
 
4522
      for (unsigned int r = 0; r < 3; r++)
 
4523
      {
 
4524
        for (unsigned int s = 0; s < 3 - r; s++)
 
4525
        {
 
4526
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4527
          {
 
4528
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4529
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4530
          }// end loop over 't'
 
4531
        }// end loop over 's'
 
4532
      }// end loop over 'r'
 
4533
      
 
4534
      // Table(s) of coefficients.
 
4535
      static const double coefficients0[10] = \
 
4536
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
4537
      
 
4538
      // Compute value(s).
 
4539
      for (unsigned int r = 0; r < 10; r++)
 
4540
      {
 
4541
        values[0] += coefficients0[r]*basisvalues[r];
 
4542
      }// end loop over 'r'
 
4543
        break;
 
4544
      }
 
4545
    case 3:
 
4546
      {
 
4547
        
 
4548
      // Array of basisvalues.
 
4549
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4550
      
 
4551
      // Declare helper variables.
 
4552
      unsigned int rr = 0;
 
4553
      unsigned int ss = 0;
 
4554
      unsigned int tt = 0;
 
4555
      double tmp5 = 0.00000000;
 
4556
      double tmp6 = 0.00000000;
 
4557
      double tmp7 = 0.00000000;
 
4558
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4559
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4560
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4561
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4562
      double tmp4 = tmp3*tmp3;
 
4563
      
 
4564
      // Compute basisvalues.
 
4565
      basisvalues[0] = 1.00000000;
 
4566
      basisvalues[1] = tmp0;
 
4567
      for (unsigned int r = 1; r < 2; r++)
 
4568
      {
 
4569
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4570
        ss = r*(r + 1)*(r + 2)/6;
 
4571
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4572
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4573
      }// end loop over 'r'
 
4574
      for (unsigned int r = 0; r < 2; r++)
 
4575
      {
 
4576
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4577
        ss = r*(r + 1)*(r + 2)/6;
 
4578
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4579
      }// end loop over 'r'
 
4580
      for (unsigned int r = 0; r < 1; r++)
 
4581
      {
 
4582
        for (unsigned int s = 1; s < 2 - r; s++)
 
4583
        {
 
4584
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4585
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4586
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4587
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4588
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4589
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4590
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4591
        }// end loop over 's'
 
4592
      }// end loop over 'r'
 
4593
      for (unsigned int r = 0; r < 2; r++)
 
4594
      {
 
4595
        for (unsigned int s = 0; s < 2 - r; s++)
 
4596
        {
 
4597
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4598
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4599
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4600
        }// end loop over 's'
 
4601
      }// end loop over 'r'
 
4602
      for (unsigned int r = 0; r < 1; r++)
 
4603
      {
 
4604
        for (unsigned int s = 0; s < 1 - r; s++)
 
4605
        {
 
4606
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4607
          {
 
4608
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4609
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4610
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4611
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4612
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4613
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4614
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4615
          }// end loop over 't'
 
4616
        }// end loop over 's'
 
4617
      }// end loop over 'r'
 
4618
      for (unsigned int r = 0; r < 3; r++)
 
4619
      {
 
4620
        for (unsigned int s = 0; s < 3 - r; s++)
 
4621
        {
 
4622
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4623
          {
 
4624
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4625
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4626
          }// end loop over 't'
 
4627
        }// end loop over 's'
 
4628
      }// end loop over 'r'
 
4629
      
 
4630
      // Table(s) of coefficients.
 
4631
      static const double coefficients0[10] = \
 
4632
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
4633
      
 
4634
      // Compute value(s).
 
4635
      for (unsigned int r = 0; r < 10; r++)
 
4636
      {
 
4637
        values[0] += coefficients0[r]*basisvalues[r];
 
4638
      }// end loop over 'r'
 
4639
        break;
 
4640
      }
 
4641
    case 4:
 
4642
      {
 
4643
        
 
4644
      // Array of basisvalues.
 
4645
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4646
      
 
4647
      // Declare helper variables.
 
4648
      unsigned int rr = 0;
 
4649
      unsigned int ss = 0;
 
4650
      unsigned int tt = 0;
 
4651
      double tmp5 = 0.00000000;
 
4652
      double tmp6 = 0.00000000;
 
4653
      double tmp7 = 0.00000000;
 
4654
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4655
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4656
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4657
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4658
      double tmp4 = tmp3*tmp3;
 
4659
      
 
4660
      // Compute basisvalues.
 
4661
      basisvalues[0] = 1.00000000;
 
4662
      basisvalues[1] = tmp0;
 
4663
      for (unsigned int r = 1; r < 2; r++)
 
4664
      {
 
4665
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4666
        ss = r*(r + 1)*(r + 2)/6;
 
4667
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4668
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4669
      }// end loop over 'r'
 
4670
      for (unsigned int r = 0; r < 2; r++)
 
4671
      {
 
4672
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4673
        ss = r*(r + 1)*(r + 2)/6;
 
4674
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4675
      }// end loop over 'r'
 
4676
      for (unsigned int r = 0; r < 1; r++)
 
4677
      {
 
4678
        for (unsigned int s = 1; s < 2 - r; s++)
 
4679
        {
 
4680
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4681
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4682
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4683
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4684
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4685
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4686
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4687
        }// end loop over 's'
 
4688
      }// end loop over 'r'
 
4689
      for (unsigned int r = 0; r < 2; r++)
 
4690
      {
 
4691
        for (unsigned int s = 0; s < 2 - r; s++)
 
4692
        {
 
4693
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4694
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4695
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4696
        }// end loop over 's'
 
4697
      }// end loop over 'r'
 
4698
      for (unsigned int r = 0; r < 1; r++)
 
4699
      {
 
4700
        for (unsigned int s = 0; s < 1 - r; s++)
 
4701
        {
 
4702
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4703
          {
 
4704
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4705
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4706
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4707
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4708
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4709
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4710
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4711
          }// end loop over 't'
 
4712
        }// end loop over 's'
 
4713
      }// end loop over 'r'
 
4714
      for (unsigned int r = 0; r < 3; r++)
 
4715
      {
 
4716
        for (unsigned int s = 0; s < 3 - r; s++)
 
4717
        {
 
4718
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4719
          {
 
4720
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4721
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4722
          }// end loop over 't'
 
4723
        }// end loop over 's'
 
4724
      }// end loop over 'r'
 
4725
      
 
4726
      // Table(s) of coefficients.
 
4727
      static const double coefficients0[10] = \
 
4728
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
4729
      
 
4730
      // Compute value(s).
 
4731
      for (unsigned int r = 0; r < 10; r++)
 
4732
      {
 
4733
        values[0] += coefficients0[r]*basisvalues[r];
 
4734
      }// end loop over 'r'
 
4735
        break;
 
4736
      }
 
4737
    case 5:
 
4738
      {
 
4739
        
 
4740
      // Array of basisvalues.
 
4741
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4742
      
 
4743
      // Declare helper variables.
 
4744
      unsigned int rr = 0;
 
4745
      unsigned int ss = 0;
 
4746
      unsigned int tt = 0;
 
4747
      double tmp5 = 0.00000000;
 
4748
      double tmp6 = 0.00000000;
 
4749
      double tmp7 = 0.00000000;
 
4750
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4751
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4752
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4753
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4754
      double tmp4 = tmp3*tmp3;
 
4755
      
 
4756
      // Compute basisvalues.
 
4757
      basisvalues[0] = 1.00000000;
 
4758
      basisvalues[1] = tmp0;
 
4759
      for (unsigned int r = 1; r < 2; r++)
 
4760
      {
 
4761
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4762
        ss = r*(r + 1)*(r + 2)/6;
 
4763
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4764
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4765
      }// end loop over 'r'
 
4766
      for (unsigned int r = 0; r < 2; r++)
 
4767
      {
 
4768
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4769
        ss = r*(r + 1)*(r + 2)/6;
 
4770
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4771
      }// end loop over 'r'
 
4772
      for (unsigned int r = 0; r < 1; r++)
 
4773
      {
 
4774
        for (unsigned int s = 1; s < 2 - r; s++)
 
4775
        {
 
4776
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4777
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4778
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4779
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4780
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4781
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4782
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4783
        }// end loop over 's'
 
4784
      }// end loop over 'r'
 
4785
      for (unsigned int r = 0; r < 2; r++)
 
4786
      {
 
4787
        for (unsigned int s = 0; s < 2 - r; s++)
 
4788
        {
 
4789
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4790
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4791
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4792
        }// end loop over 's'
 
4793
      }// end loop over 'r'
 
4794
      for (unsigned int r = 0; r < 1; r++)
 
4795
      {
 
4796
        for (unsigned int s = 0; s < 1 - r; s++)
 
4797
        {
 
4798
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4799
          {
 
4800
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4801
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4802
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4803
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4804
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4805
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4806
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4807
          }// end loop over 't'
 
4808
        }// end loop over 's'
 
4809
      }// end loop over 'r'
 
4810
      for (unsigned int r = 0; r < 3; r++)
 
4811
      {
 
4812
        for (unsigned int s = 0; s < 3 - r; s++)
 
4813
        {
 
4814
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4815
          {
 
4816
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4817
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4818
          }// end loop over 't'
 
4819
        }// end loop over 's'
 
4820
      }// end loop over 'r'
 
4821
      
 
4822
      // Table(s) of coefficients.
 
4823
      static const double coefficients0[10] = \
 
4824
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
4825
      
 
4826
      // Compute value(s).
 
4827
      for (unsigned int r = 0; r < 10; r++)
 
4828
      {
 
4829
        values[0] += coefficients0[r]*basisvalues[r];
 
4830
      }// end loop over 'r'
 
4831
        break;
 
4832
      }
 
4833
    case 6:
 
4834
      {
 
4835
        
 
4836
      // Array of basisvalues.
 
4837
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4838
      
 
4839
      // Declare helper variables.
 
4840
      unsigned int rr = 0;
 
4841
      unsigned int ss = 0;
 
4842
      unsigned int tt = 0;
 
4843
      double tmp5 = 0.00000000;
 
4844
      double tmp6 = 0.00000000;
 
4845
      double tmp7 = 0.00000000;
 
4846
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4847
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4848
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4849
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4850
      double tmp4 = tmp3*tmp3;
 
4851
      
 
4852
      // Compute basisvalues.
 
4853
      basisvalues[0] = 1.00000000;
 
4854
      basisvalues[1] = tmp0;
 
4855
      for (unsigned int r = 1; r < 2; r++)
 
4856
      {
 
4857
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4858
        ss = r*(r + 1)*(r + 2)/6;
 
4859
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4860
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4861
      }// end loop over 'r'
 
4862
      for (unsigned int r = 0; r < 2; r++)
 
4863
      {
 
4864
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4865
        ss = r*(r + 1)*(r + 2)/6;
 
4866
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4867
      }// end loop over 'r'
 
4868
      for (unsigned int r = 0; r < 1; r++)
 
4869
      {
 
4870
        for (unsigned int s = 1; s < 2 - r; s++)
 
4871
        {
 
4872
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4873
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4874
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4875
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4876
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4877
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4878
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4879
        }// end loop over 's'
 
4880
      }// end loop over 'r'
 
4881
      for (unsigned int r = 0; r < 2; r++)
 
4882
      {
 
4883
        for (unsigned int s = 0; s < 2 - r; s++)
 
4884
        {
 
4885
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4886
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4887
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4888
        }// end loop over 's'
 
4889
      }// end loop over 'r'
 
4890
      for (unsigned int r = 0; r < 1; r++)
 
4891
      {
 
4892
        for (unsigned int s = 0; s < 1 - r; s++)
 
4893
        {
 
4894
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4895
          {
 
4896
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4897
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4898
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4899
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4900
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4901
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4902
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4903
          }// end loop over 't'
 
4904
        }// end loop over 's'
 
4905
      }// end loop over 'r'
 
4906
      for (unsigned int r = 0; r < 3; r++)
 
4907
      {
 
4908
        for (unsigned int s = 0; s < 3 - r; s++)
 
4909
        {
 
4910
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4911
          {
 
4912
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4913
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
4914
          }// end loop over 't'
 
4915
        }// end loop over 's'
 
4916
      }// end loop over 'r'
 
4917
      
 
4918
      // Table(s) of coefficients.
 
4919
      static const double coefficients0[10] = \
 
4920
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
4921
      
 
4922
      // Compute value(s).
 
4923
      for (unsigned int r = 0; r < 10; r++)
 
4924
      {
 
4925
        values[0] += coefficients0[r]*basisvalues[r];
 
4926
      }// end loop over 'r'
 
4927
        break;
 
4928
      }
 
4929
    case 7:
 
4930
      {
 
4931
        
 
4932
      // Array of basisvalues.
 
4933
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
4934
      
 
4935
      // Declare helper variables.
 
4936
      unsigned int rr = 0;
 
4937
      unsigned int ss = 0;
 
4938
      unsigned int tt = 0;
 
4939
      double tmp5 = 0.00000000;
 
4940
      double tmp6 = 0.00000000;
 
4941
      double tmp7 = 0.00000000;
 
4942
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
4943
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
4944
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
4945
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
4946
      double tmp4 = tmp3*tmp3;
 
4947
      
 
4948
      // Compute basisvalues.
 
4949
      basisvalues[0] = 1.00000000;
 
4950
      basisvalues[1] = tmp0;
 
4951
      for (unsigned int r = 1; r < 2; r++)
 
4952
      {
 
4953
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4954
        ss = r*(r + 1)*(r + 2)/6;
 
4955
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4956
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
4957
      }// end loop over 'r'
 
4958
      for (unsigned int r = 0; r < 2; r++)
 
4959
      {
 
4960
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4961
        ss = r*(r + 1)*(r + 2)/6;
 
4962
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
4963
      }// end loop over 'r'
 
4964
      for (unsigned int r = 0; r < 1; r++)
 
4965
      {
 
4966
        for (unsigned int s = 1; s < 2 - r; s++)
 
4967
        {
 
4968
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4969
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4970
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4971
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4972
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4973
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
4974
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4975
        }// end loop over 's'
 
4976
      }// end loop over 'r'
 
4977
      for (unsigned int r = 0; r < 2; r++)
 
4978
      {
 
4979
        for (unsigned int s = 0; s < 2 - r; s++)
 
4980
        {
 
4981
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4982
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4983
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
4984
        }// end loop over 's'
 
4985
      }// end loop over 'r'
 
4986
      for (unsigned int r = 0; r < 1; r++)
 
4987
      {
 
4988
        for (unsigned int s = 0; s < 1 - r; s++)
 
4989
        {
 
4990
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4991
          {
 
4992
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
4993
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4994
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
4995
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4996
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4997
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
4998
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4999
          }// end loop over 't'
 
5000
        }// end loop over 's'
 
5001
      }// end loop over 'r'
 
5002
      for (unsigned int r = 0; r < 3; r++)
 
5003
      {
 
5004
        for (unsigned int s = 0; s < 3 - r; s++)
 
5005
        {
 
5006
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5007
          {
 
5008
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5009
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5010
          }// end loop over 't'
 
5011
        }// end loop over 's'
 
5012
      }// end loop over 'r'
 
5013
      
 
5014
      // Table(s) of coefficients.
 
5015
      static const double coefficients0[10] = \
 
5016
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
5017
      
 
5018
      // Compute value(s).
 
5019
      for (unsigned int r = 0; r < 10; r++)
 
5020
      {
 
5021
        values[0] += coefficients0[r]*basisvalues[r];
 
5022
      }// end loop over 'r'
 
5023
        break;
 
5024
      }
 
5025
    case 8:
 
5026
      {
 
5027
        
 
5028
      // Array of basisvalues.
 
5029
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5030
      
 
5031
      // Declare helper variables.
 
5032
      unsigned int rr = 0;
 
5033
      unsigned int ss = 0;
 
5034
      unsigned int tt = 0;
 
5035
      double tmp5 = 0.00000000;
 
5036
      double tmp6 = 0.00000000;
 
5037
      double tmp7 = 0.00000000;
 
5038
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5039
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5040
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5041
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5042
      double tmp4 = tmp3*tmp3;
 
5043
      
 
5044
      // Compute basisvalues.
 
5045
      basisvalues[0] = 1.00000000;
 
5046
      basisvalues[1] = tmp0;
 
5047
      for (unsigned int r = 1; r < 2; r++)
 
5048
      {
 
5049
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5050
        ss = r*(r + 1)*(r + 2)/6;
 
5051
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5052
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5053
      }// end loop over 'r'
 
5054
      for (unsigned int r = 0; r < 2; r++)
 
5055
      {
 
5056
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5057
        ss = r*(r + 1)*(r + 2)/6;
 
5058
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5059
      }// end loop over 'r'
 
5060
      for (unsigned int r = 0; r < 1; r++)
 
5061
      {
 
5062
        for (unsigned int s = 1; s < 2 - r; s++)
 
5063
        {
 
5064
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5065
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5066
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5067
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5068
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5069
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5070
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5071
        }// end loop over 's'
 
5072
      }// end loop over 'r'
 
5073
      for (unsigned int r = 0; r < 2; r++)
 
5074
      {
 
5075
        for (unsigned int s = 0; s < 2 - r; s++)
 
5076
        {
 
5077
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5078
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5079
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5080
        }// end loop over 's'
 
5081
      }// end loop over 'r'
 
5082
      for (unsigned int r = 0; r < 1; r++)
 
5083
      {
 
5084
        for (unsigned int s = 0; s < 1 - r; s++)
 
5085
        {
 
5086
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5087
          {
 
5088
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5089
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5090
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5091
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5092
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5093
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5094
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5095
          }// end loop over 't'
 
5096
        }// end loop over 's'
 
5097
      }// end loop over 'r'
 
5098
      for (unsigned int r = 0; r < 3; r++)
 
5099
      {
 
5100
        for (unsigned int s = 0; s < 3 - r; s++)
 
5101
        {
 
5102
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5103
          {
 
5104
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5105
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5106
          }// end loop over 't'
 
5107
        }// end loop over 's'
 
5108
      }// end loop over 'r'
 
5109
      
 
5110
      // Table(s) of coefficients.
 
5111
      static const double coefficients0[10] = \
 
5112
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
5113
      
 
5114
      // Compute value(s).
 
5115
      for (unsigned int r = 0; r < 10; r++)
 
5116
      {
 
5117
        values[0] += coefficients0[r]*basisvalues[r];
 
5118
      }// end loop over 'r'
 
5119
        break;
 
5120
      }
 
5121
    case 9:
 
5122
      {
 
5123
        
 
5124
      // Array of basisvalues.
 
5125
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5126
      
 
5127
      // Declare helper variables.
 
5128
      unsigned int rr = 0;
 
5129
      unsigned int ss = 0;
 
5130
      unsigned int tt = 0;
 
5131
      double tmp5 = 0.00000000;
 
5132
      double tmp6 = 0.00000000;
 
5133
      double tmp7 = 0.00000000;
 
5134
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5135
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5136
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5137
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5138
      double tmp4 = tmp3*tmp3;
 
5139
      
 
5140
      // Compute basisvalues.
 
5141
      basisvalues[0] = 1.00000000;
 
5142
      basisvalues[1] = tmp0;
 
5143
      for (unsigned int r = 1; r < 2; r++)
 
5144
      {
 
5145
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5146
        ss = r*(r + 1)*(r + 2)/6;
 
5147
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5148
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5149
      }// end loop over 'r'
 
5150
      for (unsigned int r = 0; r < 2; r++)
 
5151
      {
 
5152
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5153
        ss = r*(r + 1)*(r + 2)/6;
 
5154
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5155
      }// end loop over 'r'
 
5156
      for (unsigned int r = 0; r < 1; r++)
 
5157
      {
 
5158
        for (unsigned int s = 1; s < 2 - r; s++)
 
5159
        {
 
5160
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5161
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5162
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5163
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5164
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5165
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5166
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5167
        }// end loop over 's'
 
5168
      }// end loop over 'r'
 
5169
      for (unsigned int r = 0; r < 2; r++)
 
5170
      {
 
5171
        for (unsigned int s = 0; s < 2 - r; s++)
 
5172
        {
 
5173
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5174
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5175
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5176
        }// end loop over 's'
 
5177
      }// end loop over 'r'
 
5178
      for (unsigned int r = 0; r < 1; r++)
 
5179
      {
 
5180
        for (unsigned int s = 0; s < 1 - r; s++)
 
5181
        {
 
5182
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5183
          {
 
5184
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5185
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5186
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5187
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5188
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5189
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5190
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5191
          }// end loop over 't'
 
5192
        }// end loop over 's'
 
5193
      }// end loop over 'r'
 
5194
      for (unsigned int r = 0; r < 3; r++)
 
5195
      {
 
5196
        for (unsigned int s = 0; s < 3 - r; s++)
 
5197
        {
 
5198
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5199
          {
 
5200
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5201
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5202
          }// end loop over 't'
 
5203
        }// end loop over 's'
 
5204
      }// end loop over 'r'
 
5205
      
 
5206
      // Table(s) of coefficients.
 
5207
      static const double coefficients0[10] = \
 
5208
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
5209
      
 
5210
      // Compute value(s).
 
5211
      for (unsigned int r = 0; r < 10; r++)
 
5212
      {
 
5213
        values[0] += coefficients0[r]*basisvalues[r];
 
5214
      }// end loop over 'r'
 
5215
        break;
 
5216
      }
 
5217
    case 10:
 
5218
      {
 
5219
        
 
5220
      // Array of basisvalues.
 
5221
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5222
      
 
5223
      // Declare helper variables.
 
5224
      unsigned int rr = 0;
 
5225
      unsigned int ss = 0;
 
5226
      unsigned int tt = 0;
 
5227
      double tmp5 = 0.00000000;
 
5228
      double tmp6 = 0.00000000;
 
5229
      double tmp7 = 0.00000000;
 
5230
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5231
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5232
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5233
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5234
      double tmp4 = tmp3*tmp3;
 
5235
      
 
5236
      // Compute basisvalues.
 
5237
      basisvalues[0] = 1.00000000;
 
5238
      basisvalues[1] = tmp0;
 
5239
      for (unsigned int r = 1; r < 2; r++)
 
5240
      {
 
5241
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5242
        ss = r*(r + 1)*(r + 2)/6;
 
5243
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5244
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5245
      }// end loop over 'r'
 
5246
      for (unsigned int r = 0; r < 2; r++)
 
5247
      {
 
5248
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5249
        ss = r*(r + 1)*(r + 2)/6;
 
5250
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5251
      }// end loop over 'r'
 
5252
      for (unsigned int r = 0; r < 1; r++)
 
5253
      {
 
5254
        for (unsigned int s = 1; s < 2 - r; s++)
 
5255
        {
 
5256
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5257
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5258
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5259
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5260
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5261
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5262
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5263
        }// end loop over 's'
 
5264
      }// end loop over 'r'
 
5265
      for (unsigned int r = 0; r < 2; r++)
 
5266
      {
 
5267
        for (unsigned int s = 0; s < 2 - r; s++)
 
5268
        {
 
5269
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5270
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5271
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5272
        }// end loop over 's'
 
5273
      }// end loop over 'r'
 
5274
      for (unsigned int r = 0; r < 1; r++)
 
5275
      {
 
5276
        for (unsigned int s = 0; s < 1 - r; s++)
 
5277
        {
 
5278
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5279
          {
 
5280
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5281
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5282
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5283
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5284
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5285
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5286
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5287
          }// end loop over 't'
 
5288
        }// end loop over 's'
 
5289
      }// end loop over 'r'
 
5290
      for (unsigned int r = 0; r < 3; r++)
 
5291
      {
 
5292
        for (unsigned int s = 0; s < 3 - r; s++)
 
5293
        {
 
5294
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5295
          {
 
5296
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5297
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5298
          }// end loop over 't'
 
5299
        }// end loop over 's'
 
5300
      }// end loop over 'r'
 
5301
      
 
5302
      // Table(s) of coefficients.
 
5303
      static const double coefficients0[10] = \
 
5304
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
5305
      
 
5306
      // Compute value(s).
 
5307
      for (unsigned int r = 0; r < 10; r++)
 
5308
      {
 
5309
        values[1] += coefficients0[r]*basisvalues[r];
 
5310
      }// end loop over 'r'
 
5311
        break;
 
5312
      }
 
5313
    case 11:
 
5314
      {
 
5315
        
 
5316
      // Array of basisvalues.
 
5317
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5318
      
 
5319
      // Declare helper variables.
 
5320
      unsigned int rr = 0;
 
5321
      unsigned int ss = 0;
 
5322
      unsigned int tt = 0;
 
5323
      double tmp5 = 0.00000000;
 
5324
      double tmp6 = 0.00000000;
 
5325
      double tmp7 = 0.00000000;
 
5326
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5327
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5328
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5329
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5330
      double tmp4 = tmp3*tmp3;
 
5331
      
 
5332
      // Compute basisvalues.
 
5333
      basisvalues[0] = 1.00000000;
 
5334
      basisvalues[1] = tmp0;
 
5335
      for (unsigned int r = 1; r < 2; r++)
 
5336
      {
 
5337
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5338
        ss = r*(r + 1)*(r + 2)/6;
 
5339
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5340
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5341
      }// end loop over 'r'
 
5342
      for (unsigned int r = 0; r < 2; r++)
 
5343
      {
 
5344
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5345
        ss = r*(r + 1)*(r + 2)/6;
 
5346
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5347
      }// end loop over 'r'
 
5348
      for (unsigned int r = 0; r < 1; r++)
 
5349
      {
 
5350
        for (unsigned int s = 1; s < 2 - r; s++)
 
5351
        {
 
5352
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5353
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5354
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5355
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5356
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5357
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5358
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5359
        }// end loop over 's'
 
5360
      }// end loop over 'r'
 
5361
      for (unsigned int r = 0; r < 2; r++)
 
5362
      {
 
5363
        for (unsigned int s = 0; s < 2 - r; s++)
 
5364
        {
 
5365
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5366
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5367
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5368
        }// end loop over 's'
 
5369
      }// end loop over 'r'
 
5370
      for (unsigned int r = 0; r < 1; r++)
 
5371
      {
 
5372
        for (unsigned int s = 0; s < 1 - r; s++)
 
5373
        {
 
5374
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5375
          {
 
5376
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5377
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5378
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5379
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5380
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5381
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5382
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5383
          }// end loop over 't'
 
5384
        }// end loop over 's'
 
5385
      }// end loop over 'r'
 
5386
      for (unsigned int r = 0; r < 3; r++)
 
5387
      {
 
5388
        for (unsigned int s = 0; s < 3 - r; s++)
 
5389
        {
 
5390
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5391
          {
 
5392
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5393
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5394
          }// end loop over 't'
 
5395
        }// end loop over 's'
 
5396
      }// end loop over 'r'
 
5397
      
 
5398
      // Table(s) of coefficients.
 
5399
      static const double coefficients0[10] = \
 
5400
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
5401
      
 
5402
      // Compute value(s).
 
5403
      for (unsigned int r = 0; r < 10; r++)
 
5404
      {
 
5405
        values[1] += coefficients0[r]*basisvalues[r];
 
5406
      }// end loop over 'r'
 
5407
        break;
 
5408
      }
 
5409
    case 12:
 
5410
      {
 
5411
        
 
5412
      // Array of basisvalues.
 
5413
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5414
      
 
5415
      // Declare helper variables.
 
5416
      unsigned int rr = 0;
 
5417
      unsigned int ss = 0;
 
5418
      unsigned int tt = 0;
 
5419
      double tmp5 = 0.00000000;
 
5420
      double tmp6 = 0.00000000;
 
5421
      double tmp7 = 0.00000000;
 
5422
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5423
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5424
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5425
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5426
      double tmp4 = tmp3*tmp3;
 
5427
      
 
5428
      // Compute basisvalues.
 
5429
      basisvalues[0] = 1.00000000;
 
5430
      basisvalues[1] = tmp0;
 
5431
      for (unsigned int r = 1; r < 2; r++)
 
5432
      {
 
5433
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5434
        ss = r*(r + 1)*(r + 2)/6;
 
5435
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5436
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5437
      }// end loop over 'r'
 
5438
      for (unsigned int r = 0; r < 2; r++)
 
5439
      {
 
5440
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5441
        ss = r*(r + 1)*(r + 2)/6;
 
5442
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5443
      }// end loop over 'r'
 
5444
      for (unsigned int r = 0; r < 1; r++)
 
5445
      {
 
5446
        for (unsigned int s = 1; s < 2 - r; s++)
 
5447
        {
 
5448
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5449
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5450
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5451
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5452
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5453
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5454
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5455
        }// end loop over 's'
 
5456
      }// end loop over 'r'
 
5457
      for (unsigned int r = 0; r < 2; r++)
 
5458
      {
 
5459
        for (unsigned int s = 0; s < 2 - r; s++)
 
5460
        {
 
5461
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5462
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5463
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5464
        }// end loop over 's'
 
5465
      }// end loop over 'r'
 
5466
      for (unsigned int r = 0; r < 1; r++)
 
5467
      {
 
5468
        for (unsigned int s = 0; s < 1 - r; s++)
 
5469
        {
 
5470
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5471
          {
 
5472
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5473
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5474
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5475
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5476
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5477
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5478
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5479
          }// end loop over 't'
 
5480
        }// end loop over 's'
 
5481
      }// end loop over 'r'
 
5482
      for (unsigned int r = 0; r < 3; r++)
 
5483
      {
 
5484
        for (unsigned int s = 0; s < 3 - r; s++)
 
5485
        {
 
5486
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5487
          {
 
5488
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5489
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5490
          }// end loop over 't'
 
5491
        }// end loop over 's'
 
5492
      }// end loop over 'r'
 
5493
      
 
5494
      // Table(s) of coefficients.
 
5495
      static const double coefficients0[10] = \
 
5496
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
5497
      
 
5498
      // Compute value(s).
 
5499
      for (unsigned int r = 0; r < 10; r++)
 
5500
      {
 
5501
        values[1] += coefficients0[r]*basisvalues[r];
 
5502
      }// end loop over 'r'
 
5503
        break;
 
5504
      }
 
5505
    case 13:
 
5506
      {
 
5507
        
 
5508
      // Array of basisvalues.
 
5509
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5510
      
 
5511
      // Declare helper variables.
 
5512
      unsigned int rr = 0;
 
5513
      unsigned int ss = 0;
 
5514
      unsigned int tt = 0;
 
5515
      double tmp5 = 0.00000000;
 
5516
      double tmp6 = 0.00000000;
 
5517
      double tmp7 = 0.00000000;
 
5518
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5519
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5520
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5521
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5522
      double tmp4 = tmp3*tmp3;
 
5523
      
 
5524
      // Compute basisvalues.
 
5525
      basisvalues[0] = 1.00000000;
 
5526
      basisvalues[1] = tmp0;
 
5527
      for (unsigned int r = 1; r < 2; r++)
 
5528
      {
 
5529
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5530
        ss = r*(r + 1)*(r + 2)/6;
 
5531
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5532
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5533
      }// end loop over 'r'
 
5534
      for (unsigned int r = 0; r < 2; r++)
 
5535
      {
 
5536
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5537
        ss = r*(r + 1)*(r + 2)/6;
 
5538
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5539
      }// end loop over 'r'
 
5540
      for (unsigned int r = 0; r < 1; r++)
 
5541
      {
 
5542
        for (unsigned int s = 1; s < 2 - r; s++)
 
5543
        {
 
5544
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5545
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5546
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5547
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5548
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5549
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5550
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5551
        }// end loop over 's'
 
5552
      }// end loop over 'r'
 
5553
      for (unsigned int r = 0; r < 2; r++)
 
5554
      {
 
5555
        for (unsigned int s = 0; s < 2 - r; s++)
 
5556
        {
 
5557
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5558
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5559
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5560
        }// end loop over 's'
 
5561
      }// end loop over 'r'
 
5562
      for (unsigned int r = 0; r < 1; r++)
 
5563
      {
 
5564
        for (unsigned int s = 0; s < 1 - r; s++)
 
5565
        {
 
5566
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5567
          {
 
5568
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5569
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5570
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5571
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5572
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5573
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5574
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5575
          }// end loop over 't'
 
5576
        }// end loop over 's'
 
5577
      }// end loop over 'r'
 
5578
      for (unsigned int r = 0; r < 3; r++)
 
5579
      {
 
5580
        for (unsigned int s = 0; s < 3 - r; s++)
 
5581
        {
 
5582
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5583
          {
 
5584
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5585
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5586
          }// end loop over 't'
 
5587
        }// end loop over 's'
 
5588
      }// end loop over 'r'
 
5589
      
 
5590
      // Table(s) of coefficients.
 
5591
      static const double coefficients0[10] = \
 
5592
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
5593
      
 
5594
      // Compute value(s).
 
5595
      for (unsigned int r = 0; r < 10; r++)
 
5596
      {
 
5597
        values[1] += coefficients0[r]*basisvalues[r];
 
5598
      }// end loop over 'r'
 
5599
        break;
 
5600
      }
 
5601
    case 14:
 
5602
      {
 
5603
        
 
5604
      // Array of basisvalues.
 
5605
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5606
      
 
5607
      // Declare helper variables.
 
5608
      unsigned int rr = 0;
 
5609
      unsigned int ss = 0;
 
5610
      unsigned int tt = 0;
 
5611
      double tmp5 = 0.00000000;
 
5612
      double tmp6 = 0.00000000;
 
5613
      double tmp7 = 0.00000000;
 
5614
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5615
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5616
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5617
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5618
      double tmp4 = tmp3*tmp3;
 
5619
      
 
5620
      // Compute basisvalues.
 
5621
      basisvalues[0] = 1.00000000;
 
5622
      basisvalues[1] = tmp0;
 
5623
      for (unsigned int r = 1; r < 2; r++)
 
5624
      {
 
5625
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5626
        ss = r*(r + 1)*(r + 2)/6;
 
5627
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5628
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5629
      }// end loop over 'r'
 
5630
      for (unsigned int r = 0; r < 2; r++)
 
5631
      {
 
5632
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5633
        ss = r*(r + 1)*(r + 2)/6;
 
5634
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5635
      }// end loop over 'r'
 
5636
      for (unsigned int r = 0; r < 1; r++)
 
5637
      {
 
5638
        for (unsigned int s = 1; s < 2 - r; s++)
 
5639
        {
 
5640
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5641
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5642
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5643
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5644
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5645
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5646
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5647
        }// end loop over 's'
 
5648
      }// end loop over 'r'
 
5649
      for (unsigned int r = 0; r < 2; r++)
 
5650
      {
 
5651
        for (unsigned int s = 0; s < 2 - r; s++)
 
5652
        {
 
5653
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5654
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5655
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5656
        }// end loop over 's'
 
5657
      }// end loop over 'r'
 
5658
      for (unsigned int r = 0; r < 1; r++)
 
5659
      {
 
5660
        for (unsigned int s = 0; s < 1 - r; s++)
 
5661
        {
 
5662
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5663
          {
 
5664
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5665
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5666
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5667
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5668
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5669
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5670
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5671
          }// end loop over 't'
 
5672
        }// end loop over 's'
 
5673
      }// end loop over 'r'
 
5674
      for (unsigned int r = 0; r < 3; r++)
 
5675
      {
 
5676
        for (unsigned int s = 0; s < 3 - r; s++)
 
5677
        {
 
5678
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5679
          {
 
5680
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5681
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5682
          }// end loop over 't'
 
5683
        }// end loop over 's'
 
5684
      }// end loop over 'r'
 
5685
      
 
5686
      // Table(s) of coefficients.
 
5687
      static const double coefficients0[10] = \
 
5688
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
5689
      
 
5690
      // Compute value(s).
 
5691
      for (unsigned int r = 0; r < 10; r++)
 
5692
      {
 
5693
        values[1] += coefficients0[r]*basisvalues[r];
 
5694
      }// end loop over 'r'
 
5695
        break;
 
5696
      }
 
5697
    case 15:
 
5698
      {
 
5699
        
 
5700
      // Array of basisvalues.
 
5701
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5702
      
 
5703
      // Declare helper variables.
 
5704
      unsigned int rr = 0;
 
5705
      unsigned int ss = 0;
 
5706
      unsigned int tt = 0;
 
5707
      double tmp5 = 0.00000000;
 
5708
      double tmp6 = 0.00000000;
 
5709
      double tmp7 = 0.00000000;
 
5710
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5711
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5712
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5713
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5714
      double tmp4 = tmp3*tmp3;
 
5715
      
 
5716
      // Compute basisvalues.
 
5717
      basisvalues[0] = 1.00000000;
 
5718
      basisvalues[1] = tmp0;
 
5719
      for (unsigned int r = 1; r < 2; r++)
 
5720
      {
 
5721
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5722
        ss = r*(r + 1)*(r + 2)/6;
 
5723
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5724
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5725
      }// end loop over 'r'
 
5726
      for (unsigned int r = 0; r < 2; r++)
 
5727
      {
 
5728
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5729
        ss = r*(r + 1)*(r + 2)/6;
 
5730
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5731
      }// end loop over 'r'
 
5732
      for (unsigned int r = 0; r < 1; r++)
 
5733
      {
 
5734
        for (unsigned int s = 1; s < 2 - r; s++)
 
5735
        {
 
5736
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5737
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5738
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5739
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5740
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5741
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5742
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5743
        }// end loop over 's'
 
5744
      }// end loop over 'r'
 
5745
      for (unsigned int r = 0; r < 2; r++)
 
5746
      {
 
5747
        for (unsigned int s = 0; s < 2 - r; s++)
 
5748
        {
 
5749
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5750
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5751
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5752
        }// end loop over 's'
 
5753
      }// end loop over 'r'
 
5754
      for (unsigned int r = 0; r < 1; r++)
 
5755
      {
 
5756
        for (unsigned int s = 0; s < 1 - r; s++)
 
5757
        {
 
5758
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5759
          {
 
5760
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5761
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5762
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5763
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5764
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5765
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5766
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5767
          }// end loop over 't'
 
5768
        }// end loop over 's'
 
5769
      }// end loop over 'r'
 
5770
      for (unsigned int r = 0; r < 3; r++)
 
5771
      {
 
5772
        for (unsigned int s = 0; s < 3 - r; s++)
 
5773
        {
 
5774
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5775
          {
 
5776
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5777
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5778
          }// end loop over 't'
 
5779
        }// end loop over 's'
 
5780
      }// end loop over 'r'
 
5781
      
 
5782
      // Table(s) of coefficients.
 
5783
      static const double coefficients0[10] = \
 
5784
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
5785
      
 
5786
      // Compute value(s).
 
5787
      for (unsigned int r = 0; r < 10; r++)
 
5788
      {
 
5789
        values[1] += coefficients0[r]*basisvalues[r];
 
5790
      }// end loop over 'r'
 
5791
        break;
 
5792
      }
 
5793
    case 16:
 
5794
      {
 
5795
        
 
5796
      // Array of basisvalues.
 
5797
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5798
      
 
5799
      // Declare helper variables.
 
5800
      unsigned int rr = 0;
 
5801
      unsigned int ss = 0;
 
5802
      unsigned int tt = 0;
 
5803
      double tmp5 = 0.00000000;
 
5804
      double tmp6 = 0.00000000;
 
5805
      double tmp7 = 0.00000000;
 
5806
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5807
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5808
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5809
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5810
      double tmp4 = tmp3*tmp3;
 
5811
      
 
5812
      // Compute basisvalues.
 
5813
      basisvalues[0] = 1.00000000;
 
5814
      basisvalues[1] = tmp0;
 
5815
      for (unsigned int r = 1; r < 2; r++)
 
5816
      {
 
5817
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5818
        ss = r*(r + 1)*(r + 2)/6;
 
5819
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5820
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5821
      }// end loop over 'r'
 
5822
      for (unsigned int r = 0; r < 2; r++)
 
5823
      {
 
5824
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5825
        ss = r*(r + 1)*(r + 2)/6;
 
5826
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5827
      }// end loop over 'r'
 
5828
      for (unsigned int r = 0; r < 1; r++)
 
5829
      {
 
5830
        for (unsigned int s = 1; s < 2 - r; s++)
 
5831
        {
 
5832
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5833
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5834
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5835
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5836
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5837
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5838
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5839
        }// end loop over 's'
 
5840
      }// end loop over 'r'
 
5841
      for (unsigned int r = 0; r < 2; r++)
 
5842
      {
 
5843
        for (unsigned int s = 0; s < 2 - r; s++)
 
5844
        {
 
5845
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5846
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5847
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5848
        }// end loop over 's'
 
5849
      }// end loop over 'r'
 
5850
      for (unsigned int r = 0; r < 1; r++)
 
5851
      {
 
5852
        for (unsigned int s = 0; s < 1 - r; s++)
 
5853
        {
 
5854
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5855
          {
 
5856
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5857
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5858
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5859
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5860
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5861
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5862
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5863
          }// end loop over 't'
 
5864
        }// end loop over 's'
 
5865
      }// end loop over 'r'
 
5866
      for (unsigned int r = 0; r < 3; r++)
 
5867
      {
 
5868
        for (unsigned int s = 0; s < 3 - r; s++)
 
5869
        {
 
5870
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5871
          {
 
5872
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5873
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5874
          }// end loop over 't'
 
5875
        }// end loop over 's'
 
5876
      }// end loop over 'r'
 
5877
      
 
5878
      // Table(s) of coefficients.
 
5879
      static const double coefficients0[10] = \
 
5880
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
5881
      
 
5882
      // Compute value(s).
 
5883
      for (unsigned int r = 0; r < 10; r++)
 
5884
      {
 
5885
        values[1] += coefficients0[r]*basisvalues[r];
 
5886
      }// end loop over 'r'
 
5887
        break;
 
5888
      }
 
5889
    case 17:
 
5890
      {
 
5891
        
 
5892
      // Array of basisvalues.
 
5893
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5894
      
 
5895
      // Declare helper variables.
 
5896
      unsigned int rr = 0;
 
5897
      unsigned int ss = 0;
 
5898
      unsigned int tt = 0;
 
5899
      double tmp5 = 0.00000000;
 
5900
      double tmp6 = 0.00000000;
 
5901
      double tmp7 = 0.00000000;
 
5902
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5903
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
5904
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
5905
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
5906
      double tmp4 = tmp3*tmp3;
 
5907
      
 
5908
      // Compute basisvalues.
 
5909
      basisvalues[0] = 1.00000000;
 
5910
      basisvalues[1] = tmp0;
 
5911
      for (unsigned int r = 1; r < 2; r++)
 
5912
      {
 
5913
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5914
        ss = r*(r + 1)*(r + 2)/6;
 
5915
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5916
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
5917
      }// end loop over 'r'
 
5918
      for (unsigned int r = 0; r < 2; r++)
 
5919
      {
 
5920
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5921
        ss = r*(r + 1)*(r + 2)/6;
 
5922
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
5923
      }// end loop over 'r'
 
5924
      for (unsigned int r = 0; r < 1; r++)
 
5925
      {
 
5926
        for (unsigned int s = 1; s < 2 - r; s++)
 
5927
        {
 
5928
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5929
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5930
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5931
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5932
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5933
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
5934
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5935
        }// end loop over 's'
 
5936
      }// end loop over 'r'
 
5937
      for (unsigned int r = 0; r < 2; r++)
 
5938
      {
 
5939
        for (unsigned int s = 0; s < 2 - r; s++)
 
5940
        {
 
5941
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5942
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5943
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
5944
        }// end loop over 's'
 
5945
      }// end loop over 'r'
 
5946
      for (unsigned int r = 0; r < 1; r++)
 
5947
      {
 
5948
        for (unsigned int s = 0; s < 1 - r; s++)
 
5949
        {
 
5950
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5951
          {
 
5952
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
5953
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5954
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
5955
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5956
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5957
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
5958
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5959
          }// end loop over 't'
 
5960
        }// end loop over 's'
 
5961
      }// end loop over 'r'
 
5962
      for (unsigned int r = 0; r < 3; r++)
 
5963
      {
 
5964
        for (unsigned int s = 0; s < 3 - r; s++)
 
5965
        {
 
5966
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5967
          {
 
5968
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5969
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
5970
          }// end loop over 't'
 
5971
        }// end loop over 's'
 
5972
      }// end loop over 'r'
 
5973
      
 
5974
      // Table(s) of coefficients.
 
5975
      static const double coefficients0[10] = \
 
5976
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
5977
      
 
5978
      // Compute value(s).
 
5979
      for (unsigned int r = 0; r < 10; r++)
 
5980
      {
 
5981
        values[1] += coefficients0[r]*basisvalues[r];
 
5982
      }// end loop over 'r'
 
5983
        break;
 
5984
      }
 
5985
    case 18:
 
5986
      {
 
5987
        
 
5988
      // Array of basisvalues.
 
5989
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
5990
      
 
5991
      // Declare helper variables.
 
5992
      unsigned int rr = 0;
 
5993
      unsigned int ss = 0;
 
5994
      unsigned int tt = 0;
 
5995
      double tmp5 = 0.00000000;
 
5996
      double tmp6 = 0.00000000;
 
5997
      double tmp7 = 0.00000000;
 
5998
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
5999
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6000
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6001
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6002
      double tmp4 = tmp3*tmp3;
 
6003
      
 
6004
      // Compute basisvalues.
 
6005
      basisvalues[0] = 1.00000000;
 
6006
      basisvalues[1] = tmp0;
 
6007
      for (unsigned int r = 1; r < 2; r++)
 
6008
      {
 
6009
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6010
        ss = r*(r + 1)*(r + 2)/6;
 
6011
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6012
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6013
      }// end loop over 'r'
 
6014
      for (unsigned int r = 0; r < 2; r++)
 
6015
      {
 
6016
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6017
        ss = r*(r + 1)*(r + 2)/6;
 
6018
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6019
      }// end loop over 'r'
 
6020
      for (unsigned int r = 0; r < 1; r++)
 
6021
      {
 
6022
        for (unsigned int s = 1; s < 2 - r; s++)
 
6023
        {
 
6024
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6025
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6026
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6027
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6028
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6029
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6030
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6031
        }// end loop over 's'
 
6032
      }// end loop over 'r'
 
6033
      for (unsigned int r = 0; r < 2; r++)
 
6034
      {
 
6035
        for (unsigned int s = 0; s < 2 - r; s++)
 
6036
        {
 
6037
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6038
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6039
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6040
        }// end loop over 's'
 
6041
      }// end loop over 'r'
 
6042
      for (unsigned int r = 0; r < 1; r++)
 
6043
      {
 
6044
        for (unsigned int s = 0; s < 1 - r; s++)
 
6045
        {
 
6046
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6047
          {
 
6048
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6049
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6050
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6051
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6052
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6053
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6054
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6055
          }// end loop over 't'
 
6056
        }// end loop over 's'
 
6057
      }// end loop over 'r'
 
6058
      for (unsigned int r = 0; r < 3; r++)
 
6059
      {
 
6060
        for (unsigned int s = 0; s < 3 - r; s++)
 
6061
        {
 
6062
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6063
          {
 
6064
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6065
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6066
          }// end loop over 't'
 
6067
        }// end loop over 's'
 
6068
      }// end loop over 'r'
 
6069
      
 
6070
      // Table(s) of coefficients.
 
6071
      static const double coefficients0[10] = \
 
6072
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
6073
      
 
6074
      // Compute value(s).
 
6075
      for (unsigned int r = 0; r < 10; r++)
 
6076
      {
 
6077
        values[1] += coefficients0[r]*basisvalues[r];
 
6078
      }// end loop over 'r'
 
6079
        break;
 
6080
      }
 
6081
    case 19:
 
6082
      {
 
6083
        
 
6084
      // Array of basisvalues.
 
6085
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6086
      
 
6087
      // Declare helper variables.
 
6088
      unsigned int rr = 0;
 
6089
      unsigned int ss = 0;
 
6090
      unsigned int tt = 0;
 
6091
      double tmp5 = 0.00000000;
 
6092
      double tmp6 = 0.00000000;
 
6093
      double tmp7 = 0.00000000;
 
6094
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6095
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6096
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6097
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6098
      double tmp4 = tmp3*tmp3;
 
6099
      
 
6100
      // Compute basisvalues.
 
6101
      basisvalues[0] = 1.00000000;
 
6102
      basisvalues[1] = tmp0;
 
6103
      for (unsigned int r = 1; r < 2; r++)
 
6104
      {
 
6105
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6106
        ss = r*(r + 1)*(r + 2)/6;
 
6107
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6108
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6109
      }// end loop over 'r'
 
6110
      for (unsigned int r = 0; r < 2; r++)
 
6111
      {
 
6112
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6113
        ss = r*(r + 1)*(r + 2)/6;
 
6114
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6115
      }// end loop over 'r'
 
6116
      for (unsigned int r = 0; r < 1; r++)
 
6117
      {
 
6118
        for (unsigned int s = 1; s < 2 - r; s++)
 
6119
        {
 
6120
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6121
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6122
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6123
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6124
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6125
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6126
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6127
        }// end loop over 's'
 
6128
      }// end loop over 'r'
 
6129
      for (unsigned int r = 0; r < 2; r++)
 
6130
      {
 
6131
        for (unsigned int s = 0; s < 2 - r; s++)
 
6132
        {
 
6133
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6134
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6135
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6136
        }// end loop over 's'
 
6137
      }// end loop over 'r'
 
6138
      for (unsigned int r = 0; r < 1; r++)
 
6139
      {
 
6140
        for (unsigned int s = 0; s < 1 - r; s++)
 
6141
        {
 
6142
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6143
          {
 
6144
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6145
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6146
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6147
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6148
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6149
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6150
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6151
          }// end loop over 't'
 
6152
        }// end loop over 's'
 
6153
      }// end loop over 'r'
 
6154
      for (unsigned int r = 0; r < 3; r++)
 
6155
      {
 
6156
        for (unsigned int s = 0; s < 3 - r; s++)
 
6157
        {
 
6158
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6159
          {
 
6160
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6161
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6162
          }// end loop over 't'
 
6163
        }// end loop over 's'
 
6164
      }// end loop over 'r'
 
6165
      
 
6166
      // Table(s) of coefficients.
 
6167
      static const double coefficients0[10] = \
 
6168
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
6169
      
 
6170
      // Compute value(s).
 
6171
      for (unsigned int r = 0; r < 10; r++)
 
6172
      {
 
6173
        values[1] += coefficients0[r]*basisvalues[r];
 
6174
      }// end loop over 'r'
 
6175
        break;
 
6176
      }
 
6177
    case 20:
 
6178
      {
 
6179
        
 
6180
      // Array of basisvalues.
 
6181
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6182
      
 
6183
      // Declare helper variables.
 
6184
      unsigned int rr = 0;
 
6185
      unsigned int ss = 0;
 
6186
      unsigned int tt = 0;
 
6187
      double tmp5 = 0.00000000;
 
6188
      double tmp6 = 0.00000000;
 
6189
      double tmp7 = 0.00000000;
 
6190
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6191
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6192
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6193
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6194
      double tmp4 = tmp3*tmp3;
 
6195
      
 
6196
      // Compute basisvalues.
 
6197
      basisvalues[0] = 1.00000000;
 
6198
      basisvalues[1] = tmp0;
 
6199
      for (unsigned int r = 1; r < 2; r++)
 
6200
      {
 
6201
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6202
        ss = r*(r + 1)*(r + 2)/6;
 
6203
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6204
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6205
      }// end loop over 'r'
 
6206
      for (unsigned int r = 0; r < 2; r++)
 
6207
      {
 
6208
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6209
        ss = r*(r + 1)*(r + 2)/6;
 
6210
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6211
      }// end loop over 'r'
 
6212
      for (unsigned int r = 0; r < 1; r++)
 
6213
      {
 
6214
        for (unsigned int s = 1; s < 2 - r; s++)
 
6215
        {
 
6216
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6217
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6218
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6219
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6220
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6221
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6222
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6223
        }// end loop over 's'
 
6224
      }// end loop over 'r'
 
6225
      for (unsigned int r = 0; r < 2; r++)
 
6226
      {
 
6227
        for (unsigned int s = 0; s < 2 - r; s++)
 
6228
        {
 
6229
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6230
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6231
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6232
        }// end loop over 's'
 
6233
      }// end loop over 'r'
 
6234
      for (unsigned int r = 0; r < 1; r++)
 
6235
      {
 
6236
        for (unsigned int s = 0; s < 1 - r; s++)
 
6237
        {
 
6238
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6239
          {
 
6240
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6241
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6242
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6243
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6244
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6245
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6246
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6247
          }// end loop over 't'
 
6248
        }// end loop over 's'
 
6249
      }// end loop over 'r'
 
6250
      for (unsigned int r = 0; r < 3; r++)
 
6251
      {
 
6252
        for (unsigned int s = 0; s < 3 - r; s++)
 
6253
        {
 
6254
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6255
          {
 
6256
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6257
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6258
          }// end loop over 't'
 
6259
        }// end loop over 's'
 
6260
      }// end loop over 'r'
 
6261
      
 
6262
      // Table(s) of coefficients.
 
6263
      static const double coefficients0[10] = \
 
6264
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
6265
      
 
6266
      // Compute value(s).
 
6267
      for (unsigned int r = 0; r < 10; r++)
 
6268
      {
 
6269
        values[2] += coefficients0[r]*basisvalues[r];
 
6270
      }// end loop over 'r'
 
6271
        break;
 
6272
      }
 
6273
    case 21:
 
6274
      {
 
6275
        
 
6276
      // Array of basisvalues.
 
6277
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6278
      
 
6279
      // Declare helper variables.
 
6280
      unsigned int rr = 0;
 
6281
      unsigned int ss = 0;
 
6282
      unsigned int tt = 0;
 
6283
      double tmp5 = 0.00000000;
 
6284
      double tmp6 = 0.00000000;
 
6285
      double tmp7 = 0.00000000;
 
6286
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6287
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6288
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6289
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6290
      double tmp4 = tmp3*tmp3;
 
6291
      
 
6292
      // Compute basisvalues.
 
6293
      basisvalues[0] = 1.00000000;
 
6294
      basisvalues[1] = tmp0;
 
6295
      for (unsigned int r = 1; r < 2; r++)
 
6296
      {
 
6297
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6298
        ss = r*(r + 1)*(r + 2)/6;
 
6299
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6300
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6301
      }// end loop over 'r'
 
6302
      for (unsigned int r = 0; r < 2; r++)
 
6303
      {
 
6304
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6305
        ss = r*(r + 1)*(r + 2)/6;
 
6306
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6307
      }// end loop over 'r'
 
6308
      for (unsigned int r = 0; r < 1; r++)
 
6309
      {
 
6310
        for (unsigned int s = 1; s < 2 - r; s++)
 
6311
        {
 
6312
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6313
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6314
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6315
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6316
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6317
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6318
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6319
        }// end loop over 's'
 
6320
      }// end loop over 'r'
 
6321
      for (unsigned int r = 0; r < 2; r++)
 
6322
      {
 
6323
        for (unsigned int s = 0; s < 2 - r; s++)
 
6324
        {
 
6325
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6326
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6327
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6328
        }// end loop over 's'
 
6329
      }// end loop over 'r'
 
6330
      for (unsigned int r = 0; r < 1; r++)
 
6331
      {
 
6332
        for (unsigned int s = 0; s < 1 - r; s++)
 
6333
        {
 
6334
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6335
          {
 
6336
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6337
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6338
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6339
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6340
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6341
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6342
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6343
          }// end loop over 't'
 
6344
        }// end loop over 's'
 
6345
      }// end loop over 'r'
 
6346
      for (unsigned int r = 0; r < 3; r++)
 
6347
      {
 
6348
        for (unsigned int s = 0; s < 3 - r; s++)
 
6349
        {
 
6350
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6351
          {
 
6352
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6353
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6354
          }// end loop over 't'
 
6355
        }// end loop over 's'
 
6356
      }// end loop over 'r'
 
6357
      
 
6358
      // Table(s) of coefficients.
 
6359
      static const double coefficients0[10] = \
 
6360
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
6361
      
 
6362
      // Compute value(s).
 
6363
      for (unsigned int r = 0; r < 10; r++)
 
6364
      {
 
6365
        values[2] += coefficients0[r]*basisvalues[r];
 
6366
      }// end loop over 'r'
 
6367
        break;
 
6368
      }
 
6369
    case 22:
 
6370
      {
 
6371
        
 
6372
      // Array of basisvalues.
 
6373
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6374
      
 
6375
      // Declare helper variables.
 
6376
      unsigned int rr = 0;
 
6377
      unsigned int ss = 0;
 
6378
      unsigned int tt = 0;
 
6379
      double tmp5 = 0.00000000;
 
6380
      double tmp6 = 0.00000000;
 
6381
      double tmp7 = 0.00000000;
 
6382
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6383
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6384
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6385
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6386
      double tmp4 = tmp3*tmp3;
 
6387
      
 
6388
      // Compute basisvalues.
 
6389
      basisvalues[0] = 1.00000000;
 
6390
      basisvalues[1] = tmp0;
 
6391
      for (unsigned int r = 1; r < 2; r++)
 
6392
      {
 
6393
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6394
        ss = r*(r + 1)*(r + 2)/6;
 
6395
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6396
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6397
      }// end loop over 'r'
 
6398
      for (unsigned int r = 0; r < 2; r++)
 
6399
      {
 
6400
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6401
        ss = r*(r + 1)*(r + 2)/6;
 
6402
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6403
      }// end loop over 'r'
 
6404
      for (unsigned int r = 0; r < 1; r++)
 
6405
      {
 
6406
        for (unsigned int s = 1; s < 2 - r; s++)
 
6407
        {
 
6408
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6409
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6410
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6411
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6412
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6413
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6414
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6415
        }// end loop over 's'
 
6416
      }// end loop over 'r'
 
6417
      for (unsigned int r = 0; r < 2; r++)
 
6418
      {
 
6419
        for (unsigned int s = 0; s < 2 - r; s++)
 
6420
        {
 
6421
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6422
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6423
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6424
        }// end loop over 's'
 
6425
      }// end loop over 'r'
 
6426
      for (unsigned int r = 0; r < 1; r++)
 
6427
      {
 
6428
        for (unsigned int s = 0; s < 1 - r; s++)
 
6429
        {
 
6430
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6431
          {
 
6432
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6433
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6434
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6435
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6436
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6437
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6438
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6439
          }// end loop over 't'
 
6440
        }// end loop over 's'
 
6441
      }// end loop over 'r'
 
6442
      for (unsigned int r = 0; r < 3; r++)
 
6443
      {
 
6444
        for (unsigned int s = 0; s < 3 - r; s++)
 
6445
        {
 
6446
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6447
          {
 
6448
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6449
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6450
          }// end loop over 't'
 
6451
        }// end loop over 's'
 
6452
      }// end loop over 'r'
 
6453
      
 
6454
      // Table(s) of coefficients.
 
6455
      static const double coefficients0[10] = \
 
6456
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
6457
      
 
6458
      // Compute value(s).
 
6459
      for (unsigned int r = 0; r < 10; r++)
 
6460
      {
 
6461
        values[2] += coefficients0[r]*basisvalues[r];
 
6462
      }// end loop over 'r'
 
6463
        break;
 
6464
      }
 
6465
    case 23:
 
6466
      {
 
6467
        
 
6468
      // Array of basisvalues.
 
6469
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6470
      
 
6471
      // Declare helper variables.
 
6472
      unsigned int rr = 0;
 
6473
      unsigned int ss = 0;
 
6474
      unsigned int tt = 0;
 
6475
      double tmp5 = 0.00000000;
 
6476
      double tmp6 = 0.00000000;
 
6477
      double tmp7 = 0.00000000;
 
6478
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6479
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6480
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6481
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6482
      double tmp4 = tmp3*tmp3;
 
6483
      
 
6484
      // Compute basisvalues.
 
6485
      basisvalues[0] = 1.00000000;
 
6486
      basisvalues[1] = tmp0;
 
6487
      for (unsigned int r = 1; r < 2; r++)
 
6488
      {
 
6489
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6490
        ss = r*(r + 1)*(r + 2)/6;
 
6491
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6492
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6493
      }// end loop over 'r'
 
6494
      for (unsigned int r = 0; r < 2; r++)
 
6495
      {
 
6496
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6497
        ss = r*(r + 1)*(r + 2)/6;
 
6498
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6499
      }// end loop over 'r'
 
6500
      for (unsigned int r = 0; r < 1; r++)
 
6501
      {
 
6502
        for (unsigned int s = 1; s < 2 - r; s++)
 
6503
        {
 
6504
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6505
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6506
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6507
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6508
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6509
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6510
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6511
        }// end loop over 's'
 
6512
      }// end loop over 'r'
 
6513
      for (unsigned int r = 0; r < 2; r++)
 
6514
      {
 
6515
        for (unsigned int s = 0; s < 2 - r; s++)
 
6516
        {
 
6517
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6518
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6519
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6520
        }// end loop over 's'
 
6521
      }// end loop over 'r'
 
6522
      for (unsigned int r = 0; r < 1; r++)
 
6523
      {
 
6524
        for (unsigned int s = 0; s < 1 - r; s++)
 
6525
        {
 
6526
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6527
          {
 
6528
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6529
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6530
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6531
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6532
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6533
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6534
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6535
          }// end loop over 't'
 
6536
        }// end loop over 's'
 
6537
      }// end loop over 'r'
 
6538
      for (unsigned int r = 0; r < 3; r++)
 
6539
      {
 
6540
        for (unsigned int s = 0; s < 3 - r; s++)
 
6541
        {
 
6542
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6543
          {
 
6544
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6545
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6546
          }// end loop over 't'
 
6547
        }// end loop over 's'
 
6548
      }// end loop over 'r'
 
6549
      
 
6550
      // Table(s) of coefficients.
 
6551
      static const double coefficients0[10] = \
 
6552
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
6553
      
 
6554
      // Compute value(s).
 
6555
      for (unsigned int r = 0; r < 10; r++)
 
6556
      {
 
6557
        values[2] += coefficients0[r]*basisvalues[r];
 
6558
      }// end loop over 'r'
 
6559
        break;
 
6560
      }
 
6561
    case 24:
 
6562
      {
 
6563
        
 
6564
      // Array of basisvalues.
 
6565
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6566
      
 
6567
      // Declare helper variables.
 
6568
      unsigned int rr = 0;
 
6569
      unsigned int ss = 0;
 
6570
      unsigned int tt = 0;
 
6571
      double tmp5 = 0.00000000;
 
6572
      double tmp6 = 0.00000000;
 
6573
      double tmp7 = 0.00000000;
 
6574
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6575
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6576
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6577
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6578
      double tmp4 = tmp3*tmp3;
 
6579
      
 
6580
      // Compute basisvalues.
 
6581
      basisvalues[0] = 1.00000000;
 
6582
      basisvalues[1] = tmp0;
 
6583
      for (unsigned int r = 1; r < 2; r++)
 
6584
      {
 
6585
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6586
        ss = r*(r + 1)*(r + 2)/6;
 
6587
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6588
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6589
      }// end loop over 'r'
 
6590
      for (unsigned int r = 0; r < 2; r++)
 
6591
      {
 
6592
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6593
        ss = r*(r + 1)*(r + 2)/6;
 
6594
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6595
      }// end loop over 'r'
 
6596
      for (unsigned int r = 0; r < 1; r++)
 
6597
      {
 
6598
        for (unsigned int s = 1; s < 2 - r; s++)
 
6599
        {
 
6600
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6601
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6602
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6603
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6604
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6605
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6606
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6607
        }// end loop over 's'
 
6608
      }// end loop over 'r'
 
6609
      for (unsigned int r = 0; r < 2; r++)
 
6610
      {
 
6611
        for (unsigned int s = 0; s < 2 - r; s++)
 
6612
        {
 
6613
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6614
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6615
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6616
        }// end loop over 's'
 
6617
      }// end loop over 'r'
 
6618
      for (unsigned int r = 0; r < 1; r++)
 
6619
      {
 
6620
        for (unsigned int s = 0; s < 1 - r; s++)
 
6621
        {
 
6622
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6623
          {
 
6624
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6625
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6626
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6627
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6628
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6629
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6630
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6631
          }// end loop over 't'
 
6632
        }// end loop over 's'
 
6633
      }// end loop over 'r'
 
6634
      for (unsigned int r = 0; r < 3; r++)
 
6635
      {
 
6636
        for (unsigned int s = 0; s < 3 - r; s++)
 
6637
        {
 
6638
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6639
          {
 
6640
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6641
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6642
          }// end loop over 't'
 
6643
        }// end loop over 's'
 
6644
      }// end loop over 'r'
 
6645
      
 
6646
      // Table(s) of coefficients.
 
6647
      static const double coefficients0[10] = \
 
6648
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
6649
      
 
6650
      // Compute value(s).
 
6651
      for (unsigned int r = 0; r < 10; r++)
 
6652
      {
 
6653
        values[2] += coefficients0[r]*basisvalues[r];
 
6654
      }// end loop over 'r'
 
6655
        break;
 
6656
      }
 
6657
    case 25:
 
6658
      {
 
6659
        
 
6660
      // Array of basisvalues.
 
6661
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6662
      
 
6663
      // Declare helper variables.
 
6664
      unsigned int rr = 0;
 
6665
      unsigned int ss = 0;
 
6666
      unsigned int tt = 0;
 
6667
      double tmp5 = 0.00000000;
 
6668
      double tmp6 = 0.00000000;
 
6669
      double tmp7 = 0.00000000;
 
6670
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6671
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6672
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6673
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6674
      double tmp4 = tmp3*tmp3;
 
6675
      
 
6676
      // Compute basisvalues.
 
6677
      basisvalues[0] = 1.00000000;
 
6678
      basisvalues[1] = tmp0;
 
6679
      for (unsigned int r = 1; r < 2; r++)
 
6680
      {
 
6681
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6682
        ss = r*(r + 1)*(r + 2)/6;
 
6683
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6684
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6685
      }// end loop over 'r'
 
6686
      for (unsigned int r = 0; r < 2; r++)
 
6687
      {
 
6688
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6689
        ss = r*(r + 1)*(r + 2)/6;
 
6690
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6691
      }// end loop over 'r'
 
6692
      for (unsigned int r = 0; r < 1; r++)
 
6693
      {
 
6694
        for (unsigned int s = 1; s < 2 - r; s++)
 
6695
        {
 
6696
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6697
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6698
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6699
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6700
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6701
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6702
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6703
        }// end loop over 's'
 
6704
      }// end loop over 'r'
 
6705
      for (unsigned int r = 0; r < 2; r++)
 
6706
      {
 
6707
        for (unsigned int s = 0; s < 2 - r; s++)
 
6708
        {
 
6709
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6710
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6711
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6712
        }// end loop over 's'
 
6713
      }// end loop over 'r'
 
6714
      for (unsigned int r = 0; r < 1; r++)
 
6715
      {
 
6716
        for (unsigned int s = 0; s < 1 - r; s++)
 
6717
        {
 
6718
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6719
          {
 
6720
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6721
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6722
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6723
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6724
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6725
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6726
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6727
          }// end loop over 't'
 
6728
        }// end loop over 's'
 
6729
      }// end loop over 'r'
 
6730
      for (unsigned int r = 0; r < 3; r++)
 
6731
      {
 
6732
        for (unsigned int s = 0; s < 3 - r; s++)
 
6733
        {
 
6734
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6735
          {
 
6736
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6737
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6738
          }// end loop over 't'
 
6739
        }// end loop over 's'
 
6740
      }// end loop over 'r'
 
6741
      
 
6742
      // Table(s) of coefficients.
 
6743
      static const double coefficients0[10] = \
 
6744
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
6745
      
 
6746
      // Compute value(s).
 
6747
      for (unsigned int r = 0; r < 10; r++)
 
6748
      {
 
6749
        values[2] += coefficients0[r]*basisvalues[r];
 
6750
      }// end loop over 'r'
 
6751
        break;
 
6752
      }
 
6753
    case 26:
 
6754
      {
 
6755
        
 
6756
      // Array of basisvalues.
 
6757
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6758
      
 
6759
      // Declare helper variables.
 
6760
      unsigned int rr = 0;
 
6761
      unsigned int ss = 0;
 
6762
      unsigned int tt = 0;
 
6763
      double tmp5 = 0.00000000;
 
6764
      double tmp6 = 0.00000000;
 
6765
      double tmp7 = 0.00000000;
 
6766
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6767
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6768
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6769
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6770
      double tmp4 = tmp3*tmp3;
 
6771
      
 
6772
      // Compute basisvalues.
 
6773
      basisvalues[0] = 1.00000000;
 
6774
      basisvalues[1] = tmp0;
 
6775
      for (unsigned int r = 1; r < 2; r++)
 
6776
      {
 
6777
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6778
        ss = r*(r + 1)*(r + 2)/6;
 
6779
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6780
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6781
      }// end loop over 'r'
 
6782
      for (unsigned int r = 0; r < 2; r++)
 
6783
      {
 
6784
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6785
        ss = r*(r + 1)*(r + 2)/6;
 
6786
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6787
      }// end loop over 'r'
 
6788
      for (unsigned int r = 0; r < 1; r++)
 
6789
      {
 
6790
        for (unsigned int s = 1; s < 2 - r; s++)
 
6791
        {
 
6792
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6793
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6794
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6795
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6796
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6797
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6798
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6799
        }// end loop over 's'
 
6800
      }// end loop over 'r'
 
6801
      for (unsigned int r = 0; r < 2; r++)
 
6802
      {
 
6803
        for (unsigned int s = 0; s < 2 - r; s++)
 
6804
        {
 
6805
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6806
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6807
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6808
        }// end loop over 's'
 
6809
      }// end loop over 'r'
 
6810
      for (unsigned int r = 0; r < 1; r++)
 
6811
      {
 
6812
        for (unsigned int s = 0; s < 1 - r; s++)
 
6813
        {
 
6814
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6815
          {
 
6816
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6817
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6818
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6819
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6820
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6821
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6822
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6823
          }// end loop over 't'
 
6824
        }// end loop over 's'
 
6825
      }// end loop over 'r'
 
6826
      for (unsigned int r = 0; r < 3; r++)
 
6827
      {
 
6828
        for (unsigned int s = 0; s < 3 - r; s++)
 
6829
        {
 
6830
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6831
          {
 
6832
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6833
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6834
          }// end loop over 't'
 
6835
        }// end loop over 's'
 
6836
      }// end loop over 'r'
 
6837
      
 
6838
      // Table(s) of coefficients.
 
6839
      static const double coefficients0[10] = \
 
6840
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
6841
      
 
6842
      // Compute value(s).
 
6843
      for (unsigned int r = 0; r < 10; r++)
 
6844
      {
 
6845
        values[2] += coefficients0[r]*basisvalues[r];
 
6846
      }// end loop over 'r'
 
6847
        break;
 
6848
      }
 
6849
    case 27:
 
6850
      {
 
6851
        
 
6852
      // Array of basisvalues.
 
6853
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6854
      
 
6855
      // Declare helper variables.
 
6856
      unsigned int rr = 0;
 
6857
      unsigned int ss = 0;
 
6858
      unsigned int tt = 0;
 
6859
      double tmp5 = 0.00000000;
 
6860
      double tmp6 = 0.00000000;
 
6861
      double tmp7 = 0.00000000;
 
6862
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6863
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6864
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6865
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6866
      double tmp4 = tmp3*tmp3;
 
6867
      
 
6868
      // Compute basisvalues.
 
6869
      basisvalues[0] = 1.00000000;
 
6870
      basisvalues[1] = tmp0;
 
6871
      for (unsigned int r = 1; r < 2; r++)
 
6872
      {
 
6873
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6874
        ss = r*(r + 1)*(r + 2)/6;
 
6875
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6876
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6877
      }// end loop over 'r'
 
6878
      for (unsigned int r = 0; r < 2; r++)
 
6879
      {
 
6880
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6881
        ss = r*(r + 1)*(r + 2)/6;
 
6882
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6883
      }// end loop over 'r'
 
6884
      for (unsigned int r = 0; r < 1; r++)
 
6885
      {
 
6886
        for (unsigned int s = 1; s < 2 - r; s++)
 
6887
        {
 
6888
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6889
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6890
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6891
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6892
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6893
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6894
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6895
        }// end loop over 's'
 
6896
      }// end loop over 'r'
 
6897
      for (unsigned int r = 0; r < 2; r++)
 
6898
      {
 
6899
        for (unsigned int s = 0; s < 2 - r; s++)
 
6900
        {
 
6901
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6902
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6903
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
6904
        }// end loop over 's'
 
6905
      }// end loop over 'r'
 
6906
      for (unsigned int r = 0; r < 1; r++)
 
6907
      {
 
6908
        for (unsigned int s = 0; s < 1 - r; s++)
 
6909
        {
 
6910
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6911
          {
 
6912
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
6913
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6914
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
6915
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6916
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6917
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
6918
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6919
          }// end loop over 't'
 
6920
        }// end loop over 's'
 
6921
      }// end loop over 'r'
 
6922
      for (unsigned int r = 0; r < 3; r++)
 
6923
      {
 
6924
        for (unsigned int s = 0; s < 3 - r; s++)
 
6925
        {
 
6926
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6927
          {
 
6928
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6929
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
6930
          }// end loop over 't'
 
6931
        }// end loop over 's'
 
6932
      }// end loop over 'r'
 
6933
      
 
6934
      // Table(s) of coefficients.
 
6935
      static const double coefficients0[10] = \
 
6936
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
6937
      
 
6938
      // Compute value(s).
 
6939
      for (unsigned int r = 0; r < 10; r++)
 
6940
      {
 
6941
        values[2] += coefficients0[r]*basisvalues[r];
 
6942
      }// end loop over 'r'
 
6943
        break;
 
6944
      }
 
6945
    case 28:
 
6946
      {
 
6947
        
 
6948
      // Array of basisvalues.
 
6949
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
6950
      
 
6951
      // Declare helper variables.
 
6952
      unsigned int rr = 0;
 
6953
      unsigned int ss = 0;
 
6954
      unsigned int tt = 0;
 
6955
      double tmp5 = 0.00000000;
 
6956
      double tmp6 = 0.00000000;
 
6957
      double tmp7 = 0.00000000;
 
6958
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
6959
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
6960
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
6961
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
6962
      double tmp4 = tmp3*tmp3;
 
6963
      
 
6964
      // Compute basisvalues.
 
6965
      basisvalues[0] = 1.00000000;
 
6966
      basisvalues[1] = tmp0;
 
6967
      for (unsigned int r = 1; r < 2; r++)
 
6968
      {
 
6969
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6970
        ss = r*(r + 1)*(r + 2)/6;
 
6971
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6972
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
6973
      }// end loop over 'r'
 
6974
      for (unsigned int r = 0; r < 2; r++)
 
6975
      {
 
6976
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6977
        ss = r*(r + 1)*(r + 2)/6;
 
6978
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
6979
      }// end loop over 'r'
 
6980
      for (unsigned int r = 0; r < 1; r++)
 
6981
      {
 
6982
        for (unsigned int s = 1; s < 2 - r; s++)
 
6983
        {
 
6984
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6985
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6986
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6987
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6988
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6989
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
6990
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6991
        }// end loop over 's'
 
6992
      }// end loop over 'r'
 
6993
      for (unsigned int r = 0; r < 2; r++)
 
6994
      {
 
6995
        for (unsigned int s = 0; s < 2 - r; s++)
 
6996
        {
 
6997
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6998
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6999
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
7000
        }// end loop over 's'
 
7001
      }// end loop over 'r'
 
7002
      for (unsigned int r = 0; r < 1; r++)
 
7003
      {
 
7004
        for (unsigned int s = 0; s < 1 - r; s++)
 
7005
        {
 
7006
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7007
          {
 
7008
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
7009
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7010
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
7011
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7012
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7013
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7014
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7015
          }// end loop over 't'
 
7016
        }// end loop over 's'
 
7017
      }// end loop over 'r'
 
7018
      for (unsigned int r = 0; r < 3; r++)
 
7019
      {
 
7020
        for (unsigned int s = 0; s < 3 - r; s++)
 
7021
        {
 
7022
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7023
          {
 
7024
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7025
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
7026
          }// end loop over 't'
 
7027
        }// end loop over 's'
 
7028
      }// end loop over 'r'
 
7029
      
 
7030
      // Table(s) of coefficients.
 
7031
      static const double coefficients0[10] = \
 
7032
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
7033
      
 
7034
      // Compute value(s).
 
7035
      for (unsigned int r = 0; r < 10; r++)
 
7036
      {
 
7037
        values[2] += coefficients0[r]*basisvalues[r];
 
7038
      }// end loop over 'r'
 
7039
        break;
 
7040
      }
 
7041
    case 29:
 
7042
      {
 
7043
        
 
7044
      // Array of basisvalues.
 
7045
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
7046
      
 
7047
      // Declare helper variables.
 
7048
      unsigned int rr = 0;
 
7049
      unsigned int ss = 0;
 
7050
      unsigned int tt = 0;
 
7051
      double tmp5 = 0.00000000;
 
7052
      double tmp6 = 0.00000000;
 
7053
      double tmp7 = 0.00000000;
 
7054
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
7055
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
7056
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
7057
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
7058
      double tmp4 = tmp3*tmp3;
 
7059
      
 
7060
      // Compute basisvalues.
 
7061
      basisvalues[0] = 1.00000000;
 
7062
      basisvalues[1] = tmp0;
 
7063
      for (unsigned int r = 1; r < 2; r++)
 
7064
      {
 
7065
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7066
        ss = r*(r + 1)*(r + 2)/6;
 
7067
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7068
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
7069
      }// end loop over 'r'
 
7070
      for (unsigned int r = 0; r < 2; r++)
 
7071
      {
 
7072
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7073
        ss = r*(r + 1)*(r + 2)/6;
 
7074
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
7075
      }// end loop over 'r'
 
7076
      for (unsigned int r = 0; r < 1; r++)
 
7077
      {
 
7078
        for (unsigned int s = 1; s < 2 - r; s++)
 
7079
        {
 
7080
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7081
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7082
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7083
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7084
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7085
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7086
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7087
        }// end loop over 's'
 
7088
      }// end loop over 'r'
 
7089
      for (unsigned int r = 0; r < 2; r++)
 
7090
      {
 
7091
        for (unsigned int s = 0; s < 2 - r; s++)
 
7092
        {
 
7093
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7094
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7095
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
7096
        }// end loop over 's'
 
7097
      }// end loop over 'r'
 
7098
      for (unsigned int r = 0; r < 1; r++)
 
7099
      {
 
7100
        for (unsigned int s = 0; s < 1 - r; s++)
 
7101
        {
 
7102
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7103
          {
 
7104
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
7105
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7106
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
7107
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7108
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7109
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7110
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7111
          }// end loop over 't'
 
7112
        }// end loop over 's'
 
7113
      }// end loop over 'r'
 
7114
      for (unsigned int r = 0; r < 3; r++)
 
7115
      {
 
7116
        for (unsigned int s = 0; s < 3 - r; s++)
 
7117
        {
 
7118
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7119
          {
 
7120
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7121
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
7122
          }// end loop over 't'
 
7123
        }// end loop over 's'
 
7124
      }// end loop over 'r'
 
7125
      
 
7126
      // Table(s) of coefficients.
 
7127
      static const double coefficients0[10] = \
 
7128
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
7129
      
 
7130
      // Compute value(s).
 
7131
      for (unsigned int r = 0; r < 10; r++)
 
7132
      {
 
7133
        values[2] += coefficients0[r]*basisvalues[r];
 
7134
      }// end loop over 'r'
 
7135
        break;
 
7136
      }
1305
7137
    }
1306
7138
    
1307
7139
  }
1446
7278
      values[r] = 0.00000000;
1447
7279
    }// end loop over 'r'
1448
7280
    
1449
 
    if (0 <= i && i <= 9)
1450
 
    {
1451
 
      // Map degree of freedom to element degree of freedom
1452
 
      const unsigned int dof = i;
1453
 
      
1454
 
      // Array of basisvalues.
1455
 
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1456
 
      
1457
 
      // Declare helper variables.
1458
 
      unsigned int rr = 0;
1459
 
      unsigned int ss = 0;
1460
 
      unsigned int tt = 0;
1461
 
      double tmp5 = 0.00000000;
1462
 
      double tmp6 = 0.00000000;
1463
 
      double tmp7 = 0.00000000;
1464
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1465
 
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1466
 
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1467
 
      double tmp3 = 0.50000000*(1.00000000 - Z);
1468
 
      double tmp4 = tmp3*tmp3;
1469
 
      
1470
 
      // Compute basisvalues.
1471
 
      basisvalues[0] = 1.00000000;
1472
 
      basisvalues[1] = tmp0;
1473
 
      for (unsigned int r = 1; r < 2; r++)
1474
 
      {
1475
 
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1476
 
        ss = r*(r + 1)*(r + 2)/6;
1477
 
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1478
 
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1479
 
      }// end loop over 'r'
1480
 
      for (unsigned int r = 0; r < 2; r++)
1481
 
      {
1482
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1483
 
        ss = r*(r + 1)*(r + 2)/6;
1484
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1485
 
      }// end loop over 'r'
1486
 
      for (unsigned int r = 0; r < 1; r++)
1487
 
      {
1488
 
        for (unsigned int s = 1; s < 2 - r; s++)
1489
 
        {
1490
 
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1491
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1492
 
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1493
 
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1494
 
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1495
 
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1496
 
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1497
 
        }// end loop over 's'
1498
 
      }// end loop over 'r'
1499
 
      for (unsigned int r = 0; r < 2; r++)
1500
 
      {
1501
 
        for (unsigned int s = 0; s < 2 - r; s++)
1502
 
        {
1503
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1504
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1505
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1506
 
        }// end loop over 's'
1507
 
      }// end loop over 'r'
1508
 
      for (unsigned int r = 0; r < 1; r++)
1509
 
      {
1510
 
        for (unsigned int s = 0; s < 1 - r; s++)
1511
 
        {
1512
 
          for (unsigned int t = 1; t < 2 - r - s; t++)
1513
 
          {
1514
 
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1515
 
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1516
 
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1517
 
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1518
 
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1519
 
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1520
 
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1521
 
          }// end loop over 't'
1522
 
        }// end loop over 's'
1523
 
      }// end loop over 'r'
1524
 
      for (unsigned int r = 0; r < 3; r++)
1525
 
      {
1526
 
        for (unsigned int s = 0; s < 3 - r; s++)
1527
 
        {
1528
 
          for (unsigned int t = 0; t < 3 - r - s; t++)
1529
 
          {
1530
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1531
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1532
 
          }// end loop over 't'
1533
 
        }// end loop over 's'
1534
 
      }// end loop over 'r'
1535
 
      
1536
 
      // Table(s) of coefficients.
1537
 
      static const double coefficients0[10][10] = \
1538
 
      {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1539
 
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1540
 
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1541
 
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1542
 
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1543
 
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1544
 
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1545
 
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1546
 
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1547
 
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1548
 
      
1549
 
      // Tables of derivatives of the polynomial base (transpose).
1550
 
      static const double dmats0[10][10] = \
1551
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1552
 
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1553
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1554
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1555
 
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1556
 
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1557
 
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1558
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1559
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1560
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1561
 
      
1562
 
      static const double dmats1[10][10] = \
1563
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1564
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1565
 
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1566
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1567
 
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1568
 
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1569
 
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1570
 
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1571
 
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1572
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1573
 
      
1574
 
      static const double dmats2[10][10] = \
1575
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1576
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1577
 
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1578
 
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1579
 
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1580
 
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1581
 
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1582
 
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1583
 
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1584
 
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1585
 
      
1586
 
      // Compute reference derivatives.
1587
 
      // Declare pointer to array of derivatives on FIAT element.
1588
 
      double *derivatives = new double[num_derivatives];
1589
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1590
 
      {
1591
 
        derivatives[r] = 0.00000000;
1592
 
      }// end loop over 'r'
1593
 
      
1594
 
      // Declare derivative matrix (of polynomial basis).
1595
 
      double dmats[10][10] = \
1596
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1597
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1598
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1599
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1600
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1601
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1602
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1603
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1604
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1605
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1606
 
      
1607
 
      // Declare (auxiliary) derivative matrix (of polynomial basis).
1608
 
      double dmats_old[10][10] = \
1609
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1610
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1611
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1612
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1613
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1614
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1615
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1616
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1617
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1618
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1619
 
      
1620
 
      // Loop possible derivatives.
1621
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1622
 
      {
1623
 
        // Resetting dmats values to compute next derivative.
1624
 
        for (unsigned int t = 0; t < 10; t++)
1625
 
        {
1626
 
          for (unsigned int u = 0; u < 10; u++)
1627
 
          {
1628
 
            dmats[t][u] = 0.00000000;
1629
 
            if (t == u)
1630
 
            {
1631
 
            dmats[t][u] = 1.00000000;
1632
 
            }
1633
 
            
1634
 
          }// end loop over 'u'
1635
 
        }// end loop over 't'
1636
 
        
1637
 
        // Looping derivative order to generate dmats.
1638
 
        for (unsigned int s = 0; s < n; s++)
1639
 
        {
1640
 
          // Updating dmats_old with new values and resetting dmats.
1641
 
          for (unsigned int t = 0; t < 10; t++)
1642
 
          {
1643
 
            for (unsigned int u = 0; u < 10; u++)
1644
 
            {
1645
 
              dmats_old[t][u] = dmats[t][u];
1646
 
              dmats[t][u] = 0.00000000;
1647
 
            }// end loop over 'u'
1648
 
          }// end loop over 't'
1649
 
          
1650
 
          // Update dmats using an inner product.
1651
 
          if (combinations[r][s] == 0)
1652
 
          {
1653
 
          for (unsigned int t = 0; t < 10; t++)
1654
 
          {
1655
 
            for (unsigned int u = 0; u < 10; u++)
1656
 
            {
1657
 
              for (unsigned int tu = 0; tu < 10; tu++)
1658
 
              {
1659
 
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1660
 
              }// end loop over 'tu'
1661
 
            }// end loop over 'u'
1662
 
          }// end loop over 't'
1663
 
          }
1664
 
          
1665
 
          if (combinations[r][s] == 1)
1666
 
          {
1667
 
          for (unsigned int t = 0; t < 10; t++)
1668
 
          {
1669
 
            for (unsigned int u = 0; u < 10; u++)
1670
 
            {
1671
 
              for (unsigned int tu = 0; tu < 10; tu++)
1672
 
              {
1673
 
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1674
 
              }// end loop over 'tu'
1675
 
            }// end loop over 'u'
1676
 
          }// end loop over 't'
1677
 
          }
1678
 
          
1679
 
          if (combinations[r][s] == 2)
1680
 
          {
1681
 
          for (unsigned int t = 0; t < 10; t++)
1682
 
          {
1683
 
            for (unsigned int u = 0; u < 10; u++)
1684
 
            {
1685
 
              for (unsigned int tu = 0; tu < 10; tu++)
1686
 
              {
1687
 
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1688
 
              }// end loop over 'tu'
1689
 
            }// end loop over 'u'
1690
 
          }// end loop over 't'
1691
 
          }
1692
 
          
1693
 
        }// end loop over 's'
1694
 
        for (unsigned int s = 0; s < 10; s++)
1695
 
        {
1696
 
          for (unsigned int t = 0; t < 10; t++)
1697
 
          {
1698
 
            derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1699
 
          }// end loop over 't'
1700
 
        }// end loop over 's'
1701
 
      }// end loop over 'r'
1702
 
      
1703
 
      // Transform derivatives back to physical element
1704
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1705
 
      {
1706
 
        for (unsigned int s = 0; s < num_derivatives; s++)
1707
 
        {
1708
 
          values[r] += transform[r][s]*derivatives[s];
1709
 
        }// end loop over 's'
1710
 
      }// end loop over 'r'
1711
 
      
1712
 
      // Delete pointer to array of derivatives on FIAT element
1713
 
      delete [] derivatives;
1714
 
      
1715
 
      // Delete pointer to array of combinations of derivatives and transform
1716
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1717
 
      {
1718
 
        delete [] combinations[r];
1719
 
      }// end loop over 'r'
1720
 
      delete [] combinations;
1721
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1722
 
      {
1723
 
        delete [] transform[r];
1724
 
      }// end loop over 'r'
1725
 
      delete [] transform;
1726
 
    }
1727
 
    
1728
 
    if (10 <= i && i <= 19)
1729
 
    {
1730
 
      // Map degree of freedom to element degree of freedom
1731
 
      const unsigned int dof = i - 10;
1732
 
      
1733
 
      // Array of basisvalues.
1734
 
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1735
 
      
1736
 
      // Declare helper variables.
1737
 
      unsigned int rr = 0;
1738
 
      unsigned int ss = 0;
1739
 
      unsigned int tt = 0;
1740
 
      double tmp5 = 0.00000000;
1741
 
      double tmp6 = 0.00000000;
1742
 
      double tmp7 = 0.00000000;
1743
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1744
 
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1745
 
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1746
 
      double tmp3 = 0.50000000*(1.00000000 - Z);
1747
 
      double tmp4 = tmp3*tmp3;
1748
 
      
1749
 
      // Compute basisvalues.
1750
 
      basisvalues[0] = 1.00000000;
1751
 
      basisvalues[1] = tmp0;
1752
 
      for (unsigned int r = 1; r < 2; r++)
1753
 
      {
1754
 
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1755
 
        ss = r*(r + 1)*(r + 2)/6;
1756
 
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1757
 
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1758
 
      }// end loop over 'r'
1759
 
      for (unsigned int r = 0; r < 2; r++)
1760
 
      {
1761
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1762
 
        ss = r*(r + 1)*(r + 2)/6;
1763
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1764
 
      }// end loop over 'r'
1765
 
      for (unsigned int r = 0; r < 1; r++)
1766
 
      {
1767
 
        for (unsigned int s = 1; s < 2 - r; s++)
1768
 
        {
1769
 
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1770
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1771
 
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1772
 
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1773
 
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1774
 
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1775
 
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1776
 
        }// end loop over 's'
1777
 
      }// end loop over 'r'
1778
 
      for (unsigned int r = 0; r < 2; r++)
1779
 
      {
1780
 
        for (unsigned int s = 0; s < 2 - r; s++)
1781
 
        {
1782
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1783
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1784
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1785
 
        }// end loop over 's'
1786
 
      }// end loop over 'r'
1787
 
      for (unsigned int r = 0; r < 1; r++)
1788
 
      {
1789
 
        for (unsigned int s = 0; s < 1 - r; s++)
1790
 
        {
1791
 
          for (unsigned int t = 1; t < 2 - r - s; t++)
1792
 
          {
1793
 
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1794
 
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1795
 
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1796
 
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1797
 
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1798
 
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1799
 
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1800
 
          }// end loop over 't'
1801
 
        }// end loop over 's'
1802
 
      }// end loop over 'r'
1803
 
      for (unsigned int r = 0; r < 3; r++)
1804
 
      {
1805
 
        for (unsigned int s = 0; s < 3 - r; s++)
1806
 
        {
1807
 
          for (unsigned int t = 0; t < 3 - r - s; t++)
1808
 
          {
1809
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1810
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1811
 
          }// end loop over 't'
1812
 
        }// end loop over 's'
1813
 
      }// end loop over 'r'
1814
 
      
1815
 
      // Table(s) of coefficients.
1816
 
      static const double coefficients0[10][10] = \
1817
 
      {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1818
 
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1819
 
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1820
 
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1821
 
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1822
 
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1823
 
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1824
 
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1825
 
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1826
 
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1827
 
      
1828
 
      // Tables of derivatives of the polynomial base (transpose).
1829
 
      static const double dmats0[10][10] = \
1830
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1831
 
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1832
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1833
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1834
 
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1835
 
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1836
 
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1837
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1838
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1839
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1840
 
      
1841
 
      static const double dmats1[10][10] = \
1842
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1843
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1844
 
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1845
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1846
 
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1847
 
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1848
 
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1849
 
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1850
 
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1851
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1852
 
      
1853
 
      static const double dmats2[10][10] = \
1854
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1855
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1856
 
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1857
 
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1858
 
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1859
 
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1860
 
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1861
 
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1862
 
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1863
 
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1864
 
      
1865
 
      // Compute reference derivatives.
1866
 
      // Declare pointer to array of derivatives on FIAT element.
1867
 
      double *derivatives = new double[num_derivatives];
1868
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1869
 
      {
1870
 
        derivatives[r] = 0.00000000;
1871
 
      }// end loop over 'r'
1872
 
      
1873
 
      // Declare derivative matrix (of polynomial basis).
1874
 
      double dmats[10][10] = \
1875
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1876
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1877
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1878
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1879
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1880
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1881
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1882
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1883
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1884
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1885
 
      
1886
 
      // Declare (auxiliary) derivative matrix (of polynomial basis).
1887
 
      double dmats_old[10][10] = \
1888
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1889
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1890
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1891
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1892
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1893
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1894
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1895
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1896
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1897
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1898
 
      
1899
 
      // Loop possible derivatives.
1900
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1901
 
      {
1902
 
        // Resetting dmats values to compute next derivative.
1903
 
        for (unsigned int t = 0; t < 10; t++)
1904
 
        {
1905
 
          for (unsigned int u = 0; u < 10; u++)
1906
 
          {
1907
 
            dmats[t][u] = 0.00000000;
1908
 
            if (t == u)
1909
 
            {
1910
 
            dmats[t][u] = 1.00000000;
1911
 
            }
1912
 
            
1913
 
          }// end loop over 'u'
1914
 
        }// end loop over 't'
1915
 
        
1916
 
        // Looping derivative order to generate dmats.
1917
 
        for (unsigned int s = 0; s < n; s++)
1918
 
        {
1919
 
          // Updating dmats_old with new values and resetting dmats.
1920
 
          for (unsigned int t = 0; t < 10; t++)
1921
 
          {
1922
 
            for (unsigned int u = 0; u < 10; u++)
1923
 
            {
1924
 
              dmats_old[t][u] = dmats[t][u];
1925
 
              dmats[t][u] = 0.00000000;
1926
 
            }// end loop over 'u'
1927
 
          }// end loop over 't'
1928
 
          
1929
 
          // Update dmats using an inner product.
1930
 
          if (combinations[r][s] == 0)
1931
 
          {
1932
 
          for (unsigned int t = 0; t < 10; t++)
1933
 
          {
1934
 
            for (unsigned int u = 0; u < 10; u++)
1935
 
            {
1936
 
              for (unsigned int tu = 0; tu < 10; tu++)
1937
 
              {
1938
 
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1939
 
              }// end loop over 'tu'
1940
 
            }// end loop over 'u'
1941
 
          }// end loop over 't'
1942
 
          }
1943
 
          
1944
 
          if (combinations[r][s] == 1)
1945
 
          {
1946
 
          for (unsigned int t = 0; t < 10; t++)
1947
 
          {
1948
 
            for (unsigned int u = 0; u < 10; u++)
1949
 
            {
1950
 
              for (unsigned int tu = 0; tu < 10; tu++)
1951
 
              {
1952
 
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1953
 
              }// end loop over 'tu'
1954
 
            }// end loop over 'u'
1955
 
          }// end loop over 't'
1956
 
          }
1957
 
          
1958
 
          if (combinations[r][s] == 2)
1959
 
          {
1960
 
          for (unsigned int t = 0; t < 10; t++)
1961
 
          {
1962
 
            for (unsigned int u = 0; u < 10; u++)
1963
 
            {
1964
 
              for (unsigned int tu = 0; tu < 10; tu++)
1965
 
              {
1966
 
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1967
 
              }// end loop over 'tu'
1968
 
            }// end loop over 'u'
1969
 
          }// end loop over 't'
1970
 
          }
1971
 
          
1972
 
        }// end loop over 's'
1973
 
        for (unsigned int s = 0; s < 10; s++)
1974
 
        {
1975
 
          for (unsigned int t = 0; t < 10; t++)
1976
 
          {
1977
 
            derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1978
 
          }// end loop over 't'
1979
 
        }// end loop over 's'
1980
 
      }// end loop over 'r'
1981
 
      
1982
 
      // Transform derivatives back to physical element
1983
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1984
 
      {
1985
 
        for (unsigned int s = 0; s < num_derivatives; s++)
1986
 
        {
1987
 
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
1988
 
        }// end loop over 's'
1989
 
      }// end loop over 'r'
1990
 
      
1991
 
      // Delete pointer to array of derivatives on FIAT element
1992
 
      delete [] derivatives;
1993
 
      
1994
 
      // Delete pointer to array of combinations of derivatives and transform
1995
 
      for (unsigned int r = 0; r < num_derivatives; r++)
1996
 
      {
1997
 
        delete [] combinations[r];
1998
 
      }// end loop over 'r'
1999
 
      delete [] combinations;
2000
 
      for (unsigned int r = 0; r < num_derivatives; r++)
2001
 
      {
2002
 
        delete [] transform[r];
2003
 
      }// end loop over 'r'
2004
 
      delete [] transform;
2005
 
    }
2006
 
    
2007
 
    if (20 <= i && i <= 29)
2008
 
    {
2009
 
      // Map degree of freedom to element degree of freedom
2010
 
      const unsigned int dof = i - 20;
2011
 
      
2012
 
      // Array of basisvalues.
2013
 
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2014
 
      
2015
 
      // Declare helper variables.
2016
 
      unsigned int rr = 0;
2017
 
      unsigned int ss = 0;
2018
 
      unsigned int tt = 0;
2019
 
      double tmp5 = 0.00000000;
2020
 
      double tmp6 = 0.00000000;
2021
 
      double tmp7 = 0.00000000;
2022
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2023
 
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
2024
 
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
2025
 
      double tmp3 = 0.50000000*(1.00000000 - Z);
2026
 
      double tmp4 = tmp3*tmp3;
2027
 
      
2028
 
      // Compute basisvalues.
2029
 
      basisvalues[0] = 1.00000000;
2030
 
      basisvalues[1] = tmp0;
2031
 
      for (unsigned int r = 1; r < 2; r++)
2032
 
      {
2033
 
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
2034
 
        ss = r*(r + 1)*(r + 2)/6;
2035
 
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
2036
 
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
2037
 
      }// end loop over 'r'
2038
 
      for (unsigned int r = 0; r < 2; r++)
2039
 
      {
2040
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2041
 
        ss = r*(r + 1)*(r + 2)/6;
2042
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2043
 
      }// end loop over 'r'
2044
 
      for (unsigned int r = 0; r < 1; r++)
2045
 
      {
2046
 
        for (unsigned int s = 1; s < 2 - r; s++)
2047
 
        {
2048
 
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
2049
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2050
 
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
2051
 
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2052
 
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2053
 
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2054
 
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
2055
 
        }// end loop over 's'
2056
 
      }// end loop over 'r'
2057
 
      for (unsigned int r = 0; r < 2; r++)
2058
 
      {
2059
 
        for (unsigned int s = 0; s < 2 - r; s++)
2060
 
        {
2061
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2062
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2063
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2064
 
        }// end loop over 's'
2065
 
      }// end loop over 'r'
2066
 
      for (unsigned int r = 0; r < 1; r++)
2067
 
      {
2068
 
        for (unsigned int s = 0; s < 1 - r; s++)
2069
 
        {
2070
 
          for (unsigned int t = 1; t < 2 - r - s; t++)
2071
 
          {
2072
 
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
2073
 
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2074
 
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
2075
 
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2076
 
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2077
 
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2078
 
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
2079
 
          }// end loop over 't'
2080
 
        }// end loop over 's'
2081
 
      }// end loop over 'r'
2082
 
      for (unsigned int r = 0; r < 3; r++)
2083
 
      {
2084
 
        for (unsigned int s = 0; s < 3 - r; s++)
2085
 
        {
2086
 
          for (unsigned int t = 0; t < 3 - r - s; t++)
2087
 
          {
2088
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2089
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2090
 
          }// end loop over 't'
2091
 
        }// end loop over 's'
2092
 
      }// end loop over 'r'
2093
 
      
2094
 
      // Table(s) of coefficients.
2095
 
      static const double coefficients0[10][10] = \
2096
 
      {{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
2097
 
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
2098
 
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
2099
 
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
2100
 
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
2101
 
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
2102
 
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
2103
 
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
2104
 
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
2105
 
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
2106
 
      
2107
 
      // Tables of derivatives of the polynomial base (transpose).
2108
 
      static const double dmats0[10][10] = \
2109
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2110
 
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2111
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2112
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2113
 
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2114
 
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2115
 
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2116
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2117
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2118
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2119
 
      
2120
 
      static const double dmats1[10][10] = \
2121
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2122
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2123
 
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2124
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2125
 
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2126
 
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2127
 
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2128
 
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2129
 
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2130
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2131
 
      
2132
 
      static const double dmats2[10][10] = \
2133
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2134
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2135
 
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2136
 
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2137
 
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2138
 
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2139
 
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2140
 
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2141
 
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2142
 
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2143
 
      
2144
 
      // Compute reference derivatives.
2145
 
      // Declare pointer to array of derivatives on FIAT element.
2146
 
      double *derivatives = new double[num_derivatives];
2147
 
      for (unsigned int r = 0; r < num_derivatives; r++)
2148
 
      {
2149
 
        derivatives[r] = 0.00000000;
2150
 
      }// end loop over 'r'
2151
 
      
2152
 
      // Declare derivative matrix (of polynomial basis).
2153
 
      double dmats[10][10] = \
2154
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2155
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2156
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2157
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2158
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2159
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2160
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2161
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2162
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2163
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2164
 
      
2165
 
      // Declare (auxiliary) derivative matrix (of polynomial basis).
2166
 
      double dmats_old[10][10] = \
2167
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2168
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2169
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2170
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2171
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2172
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2173
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2174
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2175
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2176
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2177
 
      
2178
 
      // Loop possible derivatives.
2179
 
      for (unsigned int r = 0; r < num_derivatives; r++)
2180
 
      {
2181
 
        // Resetting dmats values to compute next derivative.
2182
 
        for (unsigned int t = 0; t < 10; t++)
2183
 
        {
2184
 
          for (unsigned int u = 0; u < 10; u++)
2185
 
          {
2186
 
            dmats[t][u] = 0.00000000;
2187
 
            if (t == u)
2188
 
            {
2189
 
            dmats[t][u] = 1.00000000;
2190
 
            }
2191
 
            
2192
 
          }// end loop over 'u'
2193
 
        }// end loop over 't'
2194
 
        
2195
 
        // Looping derivative order to generate dmats.
2196
 
        for (unsigned int s = 0; s < n; s++)
2197
 
        {
2198
 
          // Updating dmats_old with new values and resetting dmats.
2199
 
          for (unsigned int t = 0; t < 10; t++)
2200
 
          {
2201
 
            for (unsigned int u = 0; u < 10; u++)
2202
 
            {
2203
 
              dmats_old[t][u] = dmats[t][u];
2204
 
              dmats[t][u] = 0.00000000;
2205
 
            }// end loop over 'u'
2206
 
          }// end loop over 't'
2207
 
          
2208
 
          // Update dmats using an inner product.
2209
 
          if (combinations[r][s] == 0)
2210
 
          {
2211
 
          for (unsigned int t = 0; t < 10; t++)
2212
 
          {
2213
 
            for (unsigned int u = 0; u < 10; u++)
2214
 
            {
2215
 
              for (unsigned int tu = 0; tu < 10; tu++)
2216
 
              {
2217
 
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2218
 
              }// end loop over 'tu'
2219
 
            }// end loop over 'u'
2220
 
          }// end loop over 't'
2221
 
          }
2222
 
          
2223
 
          if (combinations[r][s] == 1)
2224
 
          {
2225
 
          for (unsigned int t = 0; t < 10; t++)
2226
 
          {
2227
 
            for (unsigned int u = 0; u < 10; u++)
2228
 
            {
2229
 
              for (unsigned int tu = 0; tu < 10; tu++)
2230
 
              {
2231
 
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2232
 
              }// end loop over 'tu'
2233
 
            }// end loop over 'u'
2234
 
          }// end loop over 't'
2235
 
          }
2236
 
          
2237
 
          if (combinations[r][s] == 2)
2238
 
          {
2239
 
          for (unsigned int t = 0; t < 10; t++)
2240
 
          {
2241
 
            for (unsigned int u = 0; u < 10; u++)
2242
 
            {
2243
 
              for (unsigned int tu = 0; tu < 10; tu++)
2244
 
              {
2245
 
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2246
 
              }// end loop over 'tu'
2247
 
            }// end loop over 'u'
2248
 
          }// end loop over 't'
2249
 
          }
2250
 
          
2251
 
        }// end loop over 's'
2252
 
        for (unsigned int s = 0; s < 10; s++)
2253
 
        {
2254
 
          for (unsigned int t = 0; t < 10; t++)
2255
 
          {
2256
 
            derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
2257
 
          }// end loop over 't'
2258
 
        }// end loop over 's'
2259
 
      }// end loop over 'r'
2260
 
      
2261
 
      // Transform derivatives back to physical element
2262
 
      for (unsigned int r = 0; r < num_derivatives; r++)
2263
 
      {
2264
 
        for (unsigned int s = 0; s < num_derivatives; s++)
2265
 
        {
2266
 
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
2267
 
        }// end loop over 's'
2268
 
      }// end loop over 'r'
2269
 
      
2270
 
      // Delete pointer to array of derivatives on FIAT element
2271
 
      delete [] derivatives;
2272
 
      
2273
 
      // Delete pointer to array of combinations of derivatives and transform
2274
 
      for (unsigned int r = 0; r < num_derivatives; r++)
2275
 
      {
2276
 
        delete [] combinations[r];
2277
 
      }// end loop over 'r'
2278
 
      delete [] combinations;
2279
 
      for (unsigned int r = 0; r < num_derivatives; r++)
2280
 
      {
2281
 
        delete [] transform[r];
2282
 
      }// end loop over 'r'
2283
 
      delete [] transform;
 
7281
    switch (i)
 
7282
    {
 
7283
    case 0:
 
7284
      {
 
7285
        
 
7286
      // Array of basisvalues.
 
7287
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
7288
      
 
7289
      // Declare helper variables.
 
7290
      unsigned int rr = 0;
 
7291
      unsigned int ss = 0;
 
7292
      unsigned int tt = 0;
 
7293
      double tmp5 = 0.00000000;
 
7294
      double tmp6 = 0.00000000;
 
7295
      double tmp7 = 0.00000000;
 
7296
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
7297
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
7298
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
7299
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
7300
      double tmp4 = tmp3*tmp3;
 
7301
      
 
7302
      // Compute basisvalues.
 
7303
      basisvalues[0] = 1.00000000;
 
7304
      basisvalues[1] = tmp0;
 
7305
      for (unsigned int r = 1; r < 2; r++)
 
7306
      {
 
7307
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7308
        ss = r*(r + 1)*(r + 2)/6;
 
7309
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7310
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
7311
      }// end loop over 'r'
 
7312
      for (unsigned int r = 0; r < 2; r++)
 
7313
      {
 
7314
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7315
        ss = r*(r + 1)*(r + 2)/6;
 
7316
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
7317
      }// end loop over 'r'
 
7318
      for (unsigned int r = 0; r < 1; r++)
 
7319
      {
 
7320
        for (unsigned int s = 1; s < 2 - r; s++)
 
7321
        {
 
7322
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7323
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7324
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7325
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7326
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7327
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7328
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7329
        }// end loop over 's'
 
7330
      }// end loop over 'r'
 
7331
      for (unsigned int r = 0; r < 2; r++)
 
7332
      {
 
7333
        for (unsigned int s = 0; s < 2 - r; s++)
 
7334
        {
 
7335
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7336
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7337
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
7338
        }// end loop over 's'
 
7339
      }// end loop over 'r'
 
7340
      for (unsigned int r = 0; r < 1; r++)
 
7341
      {
 
7342
        for (unsigned int s = 0; s < 1 - r; s++)
 
7343
        {
 
7344
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7345
          {
 
7346
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
7347
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7348
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
7349
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7350
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7351
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7352
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7353
          }// end loop over 't'
 
7354
        }// end loop over 's'
 
7355
      }// end loop over 'r'
 
7356
      for (unsigned int r = 0; r < 3; r++)
 
7357
      {
 
7358
        for (unsigned int s = 0; s < 3 - r; s++)
 
7359
        {
 
7360
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7361
          {
 
7362
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7363
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
7364
          }// end loop over 't'
 
7365
        }// end loop over 's'
 
7366
      }// end loop over 'r'
 
7367
      
 
7368
      // Table(s) of coefficients.
 
7369
      static const double coefficients0[10] = \
 
7370
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
7371
      
 
7372
      // Tables of derivatives of the polynomial base (transpose).
 
7373
      static const double dmats0[10][10] = \
 
7374
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7375
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7376
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7377
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7378
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7379
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7380
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7381
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7382
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7383
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7384
      
 
7385
      static const double dmats1[10][10] = \
 
7386
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7387
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7388
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7389
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7390
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7391
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7392
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7393
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7394
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7395
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7396
      
 
7397
      static const double dmats2[10][10] = \
 
7398
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7399
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7400
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7401
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7402
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7403
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7404
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7405
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7406
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7407
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7408
      
 
7409
      // Compute reference derivatives.
 
7410
      // Declare pointer to array of derivatives on FIAT element.
 
7411
      double *derivatives = new double[num_derivatives];
 
7412
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7413
      {
 
7414
        derivatives[r] = 0.00000000;
 
7415
      }// end loop over 'r'
 
7416
      
 
7417
      // Declare derivative matrix (of polynomial basis).
 
7418
      double dmats[10][10] = \
 
7419
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7420
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7421
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7422
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7423
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7424
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7425
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7426
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
7427
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
7428
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
7429
      
 
7430
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
7431
      double dmats_old[10][10] = \
 
7432
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7433
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7434
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7435
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7436
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7437
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7438
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7439
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
7440
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
7441
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
7442
      
 
7443
      // Loop possible derivatives.
 
7444
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7445
      {
 
7446
        // Resetting dmats values to compute next derivative.
 
7447
        for (unsigned int t = 0; t < 10; t++)
 
7448
        {
 
7449
          for (unsigned int u = 0; u < 10; u++)
 
7450
          {
 
7451
            dmats[t][u] = 0.00000000;
 
7452
            if (t == u)
 
7453
            {
 
7454
            dmats[t][u] = 1.00000000;
 
7455
            }
 
7456
            
 
7457
          }// end loop over 'u'
 
7458
        }// end loop over 't'
 
7459
        
 
7460
        // Looping derivative order to generate dmats.
 
7461
        for (unsigned int s = 0; s < n; s++)
 
7462
        {
 
7463
          // Updating dmats_old with new values and resetting dmats.
 
7464
          for (unsigned int t = 0; t < 10; t++)
 
7465
          {
 
7466
            for (unsigned int u = 0; u < 10; u++)
 
7467
            {
 
7468
              dmats_old[t][u] = dmats[t][u];
 
7469
              dmats[t][u] = 0.00000000;
 
7470
            }// end loop over 'u'
 
7471
          }// end loop over 't'
 
7472
          
 
7473
          // Update dmats using an inner product.
 
7474
          if (combinations[r][s] == 0)
 
7475
          {
 
7476
          for (unsigned int t = 0; t < 10; t++)
 
7477
          {
 
7478
            for (unsigned int u = 0; u < 10; u++)
 
7479
            {
 
7480
              for (unsigned int tu = 0; tu < 10; tu++)
 
7481
              {
 
7482
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
7483
              }// end loop over 'tu'
 
7484
            }// end loop over 'u'
 
7485
          }// end loop over 't'
 
7486
          }
 
7487
          
 
7488
          if (combinations[r][s] == 1)
 
7489
          {
 
7490
          for (unsigned int t = 0; t < 10; t++)
 
7491
          {
 
7492
            for (unsigned int u = 0; u < 10; u++)
 
7493
            {
 
7494
              for (unsigned int tu = 0; tu < 10; tu++)
 
7495
              {
 
7496
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
7497
              }// end loop over 'tu'
 
7498
            }// end loop over 'u'
 
7499
          }// end loop over 't'
 
7500
          }
 
7501
          
 
7502
          if (combinations[r][s] == 2)
 
7503
          {
 
7504
          for (unsigned int t = 0; t < 10; t++)
 
7505
          {
 
7506
            for (unsigned int u = 0; u < 10; u++)
 
7507
            {
 
7508
              for (unsigned int tu = 0; tu < 10; tu++)
 
7509
              {
 
7510
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
7511
              }// end loop over 'tu'
 
7512
            }// end loop over 'u'
 
7513
          }// end loop over 't'
 
7514
          }
 
7515
          
 
7516
        }// end loop over 's'
 
7517
        for (unsigned int s = 0; s < 10; s++)
 
7518
        {
 
7519
          for (unsigned int t = 0; t < 10; t++)
 
7520
          {
 
7521
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
7522
          }// end loop over 't'
 
7523
        }// end loop over 's'
 
7524
      }// end loop over 'r'
 
7525
      
 
7526
      // Transform derivatives back to physical element
 
7527
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7528
      {
 
7529
        for (unsigned int s = 0; s < num_derivatives; s++)
 
7530
        {
 
7531
          values[r] += transform[r][s]*derivatives[s];
 
7532
        }// end loop over 's'
 
7533
      }// end loop over 'r'
 
7534
      
 
7535
      // Delete pointer to array of derivatives on FIAT element
 
7536
      delete [] derivatives;
 
7537
      
 
7538
      // Delete pointer to array of combinations of derivatives and transform
 
7539
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7540
      {
 
7541
        delete [] combinations[r];
 
7542
      }// end loop over 'r'
 
7543
      delete [] combinations;
 
7544
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7545
      {
 
7546
        delete [] transform[r];
 
7547
      }// end loop over 'r'
 
7548
      delete [] transform;
 
7549
        break;
 
7550
      }
 
7551
    case 1:
 
7552
      {
 
7553
        
 
7554
      // Array of basisvalues.
 
7555
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
7556
      
 
7557
      // Declare helper variables.
 
7558
      unsigned int rr = 0;
 
7559
      unsigned int ss = 0;
 
7560
      unsigned int tt = 0;
 
7561
      double tmp5 = 0.00000000;
 
7562
      double tmp6 = 0.00000000;
 
7563
      double tmp7 = 0.00000000;
 
7564
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
7565
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
7566
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
7567
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
7568
      double tmp4 = tmp3*tmp3;
 
7569
      
 
7570
      // Compute basisvalues.
 
7571
      basisvalues[0] = 1.00000000;
 
7572
      basisvalues[1] = tmp0;
 
7573
      for (unsigned int r = 1; r < 2; r++)
 
7574
      {
 
7575
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7576
        ss = r*(r + 1)*(r + 2)/6;
 
7577
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7578
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
7579
      }// end loop over 'r'
 
7580
      for (unsigned int r = 0; r < 2; r++)
 
7581
      {
 
7582
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7583
        ss = r*(r + 1)*(r + 2)/6;
 
7584
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
7585
      }// end loop over 'r'
 
7586
      for (unsigned int r = 0; r < 1; r++)
 
7587
      {
 
7588
        for (unsigned int s = 1; s < 2 - r; s++)
 
7589
        {
 
7590
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7591
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7592
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7593
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7594
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7595
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7596
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7597
        }// end loop over 's'
 
7598
      }// end loop over 'r'
 
7599
      for (unsigned int r = 0; r < 2; r++)
 
7600
      {
 
7601
        for (unsigned int s = 0; s < 2 - r; s++)
 
7602
        {
 
7603
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7604
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7605
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
7606
        }// end loop over 's'
 
7607
      }// end loop over 'r'
 
7608
      for (unsigned int r = 0; r < 1; r++)
 
7609
      {
 
7610
        for (unsigned int s = 0; s < 1 - r; s++)
 
7611
        {
 
7612
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7613
          {
 
7614
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
7615
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7616
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
7617
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7618
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7619
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7620
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7621
          }// end loop over 't'
 
7622
        }// end loop over 's'
 
7623
      }// end loop over 'r'
 
7624
      for (unsigned int r = 0; r < 3; r++)
 
7625
      {
 
7626
        for (unsigned int s = 0; s < 3 - r; s++)
 
7627
        {
 
7628
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7629
          {
 
7630
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7631
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
7632
          }// end loop over 't'
 
7633
        }// end loop over 's'
 
7634
      }// end loop over 'r'
 
7635
      
 
7636
      // Table(s) of coefficients.
 
7637
      static const double coefficients0[10] = \
 
7638
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
7639
      
 
7640
      // Tables of derivatives of the polynomial base (transpose).
 
7641
      static const double dmats0[10][10] = \
 
7642
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7643
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7644
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7645
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7646
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7647
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7648
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7649
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7650
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7651
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7652
      
 
7653
      static const double dmats1[10][10] = \
 
7654
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7655
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7656
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7657
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7658
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7659
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7660
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7661
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7662
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7663
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7664
      
 
7665
      static const double dmats2[10][10] = \
 
7666
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7667
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7668
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7669
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7670
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7671
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7672
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7673
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7674
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7675
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7676
      
 
7677
      // Compute reference derivatives.
 
7678
      // Declare pointer to array of derivatives on FIAT element.
 
7679
      double *derivatives = new double[num_derivatives];
 
7680
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7681
      {
 
7682
        derivatives[r] = 0.00000000;
 
7683
      }// end loop over 'r'
 
7684
      
 
7685
      // Declare derivative matrix (of polynomial basis).
 
7686
      double dmats[10][10] = \
 
7687
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7688
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7689
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7690
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7691
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7692
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7693
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7694
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
7695
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
7696
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
7697
      
 
7698
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
7699
      double dmats_old[10][10] = \
 
7700
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7701
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7702
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7703
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7704
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7705
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7706
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7707
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
7708
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
7709
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
7710
      
 
7711
      // Loop possible derivatives.
 
7712
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7713
      {
 
7714
        // Resetting dmats values to compute next derivative.
 
7715
        for (unsigned int t = 0; t < 10; t++)
 
7716
        {
 
7717
          for (unsigned int u = 0; u < 10; u++)
 
7718
          {
 
7719
            dmats[t][u] = 0.00000000;
 
7720
            if (t == u)
 
7721
            {
 
7722
            dmats[t][u] = 1.00000000;
 
7723
            }
 
7724
            
 
7725
          }// end loop over 'u'
 
7726
        }// end loop over 't'
 
7727
        
 
7728
        // Looping derivative order to generate dmats.
 
7729
        for (unsigned int s = 0; s < n; s++)
 
7730
        {
 
7731
          // Updating dmats_old with new values and resetting dmats.
 
7732
          for (unsigned int t = 0; t < 10; t++)
 
7733
          {
 
7734
            for (unsigned int u = 0; u < 10; u++)
 
7735
            {
 
7736
              dmats_old[t][u] = dmats[t][u];
 
7737
              dmats[t][u] = 0.00000000;
 
7738
            }// end loop over 'u'
 
7739
          }// end loop over 't'
 
7740
          
 
7741
          // Update dmats using an inner product.
 
7742
          if (combinations[r][s] == 0)
 
7743
          {
 
7744
          for (unsigned int t = 0; t < 10; t++)
 
7745
          {
 
7746
            for (unsigned int u = 0; u < 10; u++)
 
7747
            {
 
7748
              for (unsigned int tu = 0; tu < 10; tu++)
 
7749
              {
 
7750
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
7751
              }// end loop over 'tu'
 
7752
            }// end loop over 'u'
 
7753
          }// end loop over 't'
 
7754
          }
 
7755
          
 
7756
          if (combinations[r][s] == 1)
 
7757
          {
 
7758
          for (unsigned int t = 0; t < 10; t++)
 
7759
          {
 
7760
            for (unsigned int u = 0; u < 10; u++)
 
7761
            {
 
7762
              for (unsigned int tu = 0; tu < 10; tu++)
 
7763
              {
 
7764
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
7765
              }// end loop over 'tu'
 
7766
            }// end loop over 'u'
 
7767
          }// end loop over 't'
 
7768
          }
 
7769
          
 
7770
          if (combinations[r][s] == 2)
 
7771
          {
 
7772
          for (unsigned int t = 0; t < 10; t++)
 
7773
          {
 
7774
            for (unsigned int u = 0; u < 10; u++)
 
7775
            {
 
7776
              for (unsigned int tu = 0; tu < 10; tu++)
 
7777
              {
 
7778
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
7779
              }// end loop over 'tu'
 
7780
            }// end loop over 'u'
 
7781
          }// end loop over 't'
 
7782
          }
 
7783
          
 
7784
        }// end loop over 's'
 
7785
        for (unsigned int s = 0; s < 10; s++)
 
7786
        {
 
7787
          for (unsigned int t = 0; t < 10; t++)
 
7788
          {
 
7789
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
7790
          }// end loop over 't'
 
7791
        }// end loop over 's'
 
7792
      }// end loop over 'r'
 
7793
      
 
7794
      // Transform derivatives back to physical element
 
7795
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7796
      {
 
7797
        for (unsigned int s = 0; s < num_derivatives; s++)
 
7798
        {
 
7799
          values[r] += transform[r][s]*derivatives[s];
 
7800
        }// end loop over 's'
 
7801
      }// end loop over 'r'
 
7802
      
 
7803
      // Delete pointer to array of derivatives on FIAT element
 
7804
      delete [] derivatives;
 
7805
      
 
7806
      // Delete pointer to array of combinations of derivatives and transform
 
7807
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7808
      {
 
7809
        delete [] combinations[r];
 
7810
      }// end loop over 'r'
 
7811
      delete [] combinations;
 
7812
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7813
      {
 
7814
        delete [] transform[r];
 
7815
      }// end loop over 'r'
 
7816
      delete [] transform;
 
7817
        break;
 
7818
      }
 
7819
    case 2:
 
7820
      {
 
7821
        
 
7822
      // Array of basisvalues.
 
7823
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
7824
      
 
7825
      // Declare helper variables.
 
7826
      unsigned int rr = 0;
 
7827
      unsigned int ss = 0;
 
7828
      unsigned int tt = 0;
 
7829
      double tmp5 = 0.00000000;
 
7830
      double tmp6 = 0.00000000;
 
7831
      double tmp7 = 0.00000000;
 
7832
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
7833
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
7834
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
7835
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
7836
      double tmp4 = tmp3*tmp3;
 
7837
      
 
7838
      // Compute basisvalues.
 
7839
      basisvalues[0] = 1.00000000;
 
7840
      basisvalues[1] = tmp0;
 
7841
      for (unsigned int r = 1; r < 2; r++)
 
7842
      {
 
7843
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7844
        ss = r*(r + 1)*(r + 2)/6;
 
7845
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7846
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
7847
      }// end loop over 'r'
 
7848
      for (unsigned int r = 0; r < 2; r++)
 
7849
      {
 
7850
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7851
        ss = r*(r + 1)*(r + 2)/6;
 
7852
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
7853
      }// end loop over 'r'
 
7854
      for (unsigned int r = 0; r < 1; r++)
 
7855
      {
 
7856
        for (unsigned int s = 1; s < 2 - r; s++)
 
7857
        {
 
7858
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7859
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7860
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7861
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7862
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7863
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
7864
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7865
        }// end loop over 's'
 
7866
      }// end loop over 'r'
 
7867
      for (unsigned int r = 0; r < 2; r++)
 
7868
      {
 
7869
        for (unsigned int s = 0; s < 2 - r; s++)
 
7870
        {
 
7871
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7872
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7873
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
7874
        }// end loop over 's'
 
7875
      }// end loop over 'r'
 
7876
      for (unsigned int r = 0; r < 1; r++)
 
7877
      {
 
7878
        for (unsigned int s = 0; s < 1 - r; s++)
 
7879
        {
 
7880
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7881
          {
 
7882
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
7883
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7884
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
7885
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7886
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7887
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
7888
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7889
          }// end loop over 't'
 
7890
        }// end loop over 's'
 
7891
      }// end loop over 'r'
 
7892
      for (unsigned int r = 0; r < 3; r++)
 
7893
      {
 
7894
        for (unsigned int s = 0; s < 3 - r; s++)
 
7895
        {
 
7896
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7897
          {
 
7898
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7899
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
7900
          }// end loop over 't'
 
7901
        }// end loop over 's'
 
7902
      }// end loop over 'r'
 
7903
      
 
7904
      // Table(s) of coefficients.
 
7905
      static const double coefficients0[10] = \
 
7906
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
7907
      
 
7908
      // Tables of derivatives of the polynomial base (transpose).
 
7909
      static const double dmats0[10][10] = \
 
7910
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7911
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7912
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7913
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7914
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7915
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7916
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7917
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7918
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7919
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7920
      
 
7921
      static const double dmats1[10][10] = \
 
7922
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7923
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7924
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7925
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7926
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7927
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7928
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7929
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7930
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7931
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7932
      
 
7933
      static const double dmats2[10][10] = \
 
7934
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7935
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7936
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7937
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7938
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7939
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7940
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7941
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7942
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7943
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
7944
      
 
7945
      // Compute reference derivatives.
 
7946
      // Declare pointer to array of derivatives on FIAT element.
 
7947
      double *derivatives = new double[num_derivatives];
 
7948
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7949
      {
 
7950
        derivatives[r] = 0.00000000;
 
7951
      }// end loop over 'r'
 
7952
      
 
7953
      // Declare derivative matrix (of polynomial basis).
 
7954
      double dmats[10][10] = \
 
7955
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7956
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7957
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7958
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7959
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7960
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7961
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7962
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
7963
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
7964
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
7965
      
 
7966
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
7967
      double dmats_old[10][10] = \
 
7968
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7969
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7970
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7971
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7972
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7973
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7974
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
7975
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
7976
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
7977
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
7978
      
 
7979
      // Loop possible derivatives.
 
7980
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7981
      {
 
7982
        // Resetting dmats values to compute next derivative.
 
7983
        for (unsigned int t = 0; t < 10; t++)
 
7984
        {
 
7985
          for (unsigned int u = 0; u < 10; u++)
 
7986
          {
 
7987
            dmats[t][u] = 0.00000000;
 
7988
            if (t == u)
 
7989
            {
 
7990
            dmats[t][u] = 1.00000000;
 
7991
            }
 
7992
            
 
7993
          }// end loop over 'u'
 
7994
        }// end loop over 't'
 
7995
        
 
7996
        // Looping derivative order to generate dmats.
 
7997
        for (unsigned int s = 0; s < n; s++)
 
7998
        {
 
7999
          // Updating dmats_old with new values and resetting dmats.
 
8000
          for (unsigned int t = 0; t < 10; t++)
 
8001
          {
 
8002
            for (unsigned int u = 0; u < 10; u++)
 
8003
            {
 
8004
              dmats_old[t][u] = dmats[t][u];
 
8005
              dmats[t][u] = 0.00000000;
 
8006
            }// end loop over 'u'
 
8007
          }// end loop over 't'
 
8008
          
 
8009
          // Update dmats using an inner product.
 
8010
          if (combinations[r][s] == 0)
 
8011
          {
 
8012
          for (unsigned int t = 0; t < 10; t++)
 
8013
          {
 
8014
            for (unsigned int u = 0; u < 10; u++)
 
8015
            {
 
8016
              for (unsigned int tu = 0; tu < 10; tu++)
 
8017
              {
 
8018
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8019
              }// end loop over 'tu'
 
8020
            }// end loop over 'u'
 
8021
          }// end loop over 't'
 
8022
          }
 
8023
          
 
8024
          if (combinations[r][s] == 1)
 
8025
          {
 
8026
          for (unsigned int t = 0; t < 10; t++)
 
8027
          {
 
8028
            for (unsigned int u = 0; u < 10; u++)
 
8029
            {
 
8030
              for (unsigned int tu = 0; tu < 10; tu++)
 
8031
              {
 
8032
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8033
              }// end loop over 'tu'
 
8034
            }// end loop over 'u'
 
8035
          }// end loop over 't'
 
8036
          }
 
8037
          
 
8038
          if (combinations[r][s] == 2)
 
8039
          {
 
8040
          for (unsigned int t = 0; t < 10; t++)
 
8041
          {
 
8042
            for (unsigned int u = 0; u < 10; u++)
 
8043
            {
 
8044
              for (unsigned int tu = 0; tu < 10; tu++)
 
8045
              {
 
8046
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8047
              }// end loop over 'tu'
 
8048
            }// end loop over 'u'
 
8049
          }// end loop over 't'
 
8050
          }
 
8051
          
 
8052
        }// end loop over 's'
 
8053
        for (unsigned int s = 0; s < 10; s++)
 
8054
        {
 
8055
          for (unsigned int t = 0; t < 10; t++)
 
8056
          {
 
8057
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8058
          }// end loop over 't'
 
8059
        }// end loop over 's'
 
8060
      }// end loop over 'r'
 
8061
      
 
8062
      // Transform derivatives back to physical element
 
8063
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8064
      {
 
8065
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8066
        {
 
8067
          values[r] += transform[r][s]*derivatives[s];
 
8068
        }// end loop over 's'
 
8069
      }// end loop over 'r'
 
8070
      
 
8071
      // Delete pointer to array of derivatives on FIAT element
 
8072
      delete [] derivatives;
 
8073
      
 
8074
      // Delete pointer to array of combinations of derivatives and transform
 
8075
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8076
      {
 
8077
        delete [] combinations[r];
 
8078
      }// end loop over 'r'
 
8079
      delete [] combinations;
 
8080
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8081
      {
 
8082
        delete [] transform[r];
 
8083
      }// end loop over 'r'
 
8084
      delete [] transform;
 
8085
        break;
 
8086
      }
 
8087
    case 3:
 
8088
      {
 
8089
        
 
8090
      // Array of basisvalues.
 
8091
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
8092
      
 
8093
      // Declare helper variables.
 
8094
      unsigned int rr = 0;
 
8095
      unsigned int ss = 0;
 
8096
      unsigned int tt = 0;
 
8097
      double tmp5 = 0.00000000;
 
8098
      double tmp6 = 0.00000000;
 
8099
      double tmp7 = 0.00000000;
 
8100
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
8101
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
8102
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
8103
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
8104
      double tmp4 = tmp3*tmp3;
 
8105
      
 
8106
      // Compute basisvalues.
 
8107
      basisvalues[0] = 1.00000000;
 
8108
      basisvalues[1] = tmp0;
 
8109
      for (unsigned int r = 1; r < 2; r++)
 
8110
      {
 
8111
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8112
        ss = r*(r + 1)*(r + 2)/6;
 
8113
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8114
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
8115
      }// end loop over 'r'
 
8116
      for (unsigned int r = 0; r < 2; r++)
 
8117
      {
 
8118
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8119
        ss = r*(r + 1)*(r + 2)/6;
 
8120
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
8121
      }// end loop over 'r'
 
8122
      for (unsigned int r = 0; r < 1; r++)
 
8123
      {
 
8124
        for (unsigned int s = 1; s < 2 - r; s++)
 
8125
        {
 
8126
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8127
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8128
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8129
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8130
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8131
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8132
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8133
        }// end loop over 's'
 
8134
      }// end loop over 'r'
 
8135
      for (unsigned int r = 0; r < 2; r++)
 
8136
      {
 
8137
        for (unsigned int s = 0; s < 2 - r; s++)
 
8138
        {
 
8139
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8140
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8141
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
8142
        }// end loop over 's'
 
8143
      }// end loop over 'r'
 
8144
      for (unsigned int r = 0; r < 1; r++)
 
8145
      {
 
8146
        for (unsigned int s = 0; s < 1 - r; s++)
 
8147
        {
 
8148
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8149
          {
 
8150
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
8151
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8152
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
8153
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8154
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8155
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8156
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8157
          }// end loop over 't'
 
8158
        }// end loop over 's'
 
8159
      }// end loop over 'r'
 
8160
      for (unsigned int r = 0; r < 3; r++)
 
8161
      {
 
8162
        for (unsigned int s = 0; s < 3 - r; s++)
 
8163
        {
 
8164
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8165
          {
 
8166
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8167
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
8168
          }// end loop over 't'
 
8169
        }// end loop over 's'
 
8170
      }// end loop over 'r'
 
8171
      
 
8172
      // Table(s) of coefficients.
 
8173
      static const double coefficients0[10] = \
 
8174
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
8175
      
 
8176
      // Tables of derivatives of the polynomial base (transpose).
 
8177
      static const double dmats0[10][10] = \
 
8178
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8179
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8180
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8181
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8182
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8183
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8184
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8185
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8186
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8187
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8188
      
 
8189
      static const double dmats1[10][10] = \
 
8190
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8191
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8192
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8193
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8194
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8195
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8196
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8197
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8198
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8199
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8200
      
 
8201
      static const double dmats2[10][10] = \
 
8202
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8203
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8204
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8205
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8206
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8207
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8208
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8209
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8210
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8211
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8212
      
 
8213
      // Compute reference derivatives.
 
8214
      // Declare pointer to array of derivatives on FIAT element.
 
8215
      double *derivatives = new double[num_derivatives];
 
8216
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8217
      {
 
8218
        derivatives[r] = 0.00000000;
 
8219
      }// end loop over 'r'
 
8220
      
 
8221
      // Declare derivative matrix (of polynomial basis).
 
8222
      double dmats[10][10] = \
 
8223
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8224
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8225
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8226
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8227
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8228
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8229
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8230
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
8231
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
8232
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
8233
      
 
8234
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8235
      double dmats_old[10][10] = \
 
8236
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8237
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8238
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8239
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8240
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8241
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8242
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8243
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
8244
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
8245
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
8246
      
 
8247
      // Loop possible derivatives.
 
8248
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8249
      {
 
8250
        // Resetting dmats values to compute next derivative.
 
8251
        for (unsigned int t = 0; t < 10; t++)
 
8252
        {
 
8253
          for (unsigned int u = 0; u < 10; u++)
 
8254
          {
 
8255
            dmats[t][u] = 0.00000000;
 
8256
            if (t == u)
 
8257
            {
 
8258
            dmats[t][u] = 1.00000000;
 
8259
            }
 
8260
            
 
8261
          }// end loop over 'u'
 
8262
        }// end loop over 't'
 
8263
        
 
8264
        // Looping derivative order to generate dmats.
 
8265
        for (unsigned int s = 0; s < n; s++)
 
8266
        {
 
8267
          // Updating dmats_old with new values and resetting dmats.
 
8268
          for (unsigned int t = 0; t < 10; t++)
 
8269
          {
 
8270
            for (unsigned int u = 0; u < 10; u++)
 
8271
            {
 
8272
              dmats_old[t][u] = dmats[t][u];
 
8273
              dmats[t][u] = 0.00000000;
 
8274
            }// end loop over 'u'
 
8275
          }// end loop over 't'
 
8276
          
 
8277
          // Update dmats using an inner product.
 
8278
          if (combinations[r][s] == 0)
 
8279
          {
 
8280
          for (unsigned int t = 0; t < 10; t++)
 
8281
          {
 
8282
            for (unsigned int u = 0; u < 10; u++)
 
8283
            {
 
8284
              for (unsigned int tu = 0; tu < 10; tu++)
 
8285
              {
 
8286
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8287
              }// end loop over 'tu'
 
8288
            }// end loop over 'u'
 
8289
          }// end loop over 't'
 
8290
          }
 
8291
          
 
8292
          if (combinations[r][s] == 1)
 
8293
          {
 
8294
          for (unsigned int t = 0; t < 10; t++)
 
8295
          {
 
8296
            for (unsigned int u = 0; u < 10; u++)
 
8297
            {
 
8298
              for (unsigned int tu = 0; tu < 10; tu++)
 
8299
              {
 
8300
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8301
              }// end loop over 'tu'
 
8302
            }// end loop over 'u'
 
8303
          }// end loop over 't'
 
8304
          }
 
8305
          
 
8306
          if (combinations[r][s] == 2)
 
8307
          {
 
8308
          for (unsigned int t = 0; t < 10; t++)
 
8309
          {
 
8310
            for (unsigned int u = 0; u < 10; u++)
 
8311
            {
 
8312
              for (unsigned int tu = 0; tu < 10; tu++)
 
8313
              {
 
8314
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8315
              }// end loop over 'tu'
 
8316
            }// end loop over 'u'
 
8317
          }// end loop over 't'
 
8318
          }
 
8319
          
 
8320
        }// end loop over 's'
 
8321
        for (unsigned int s = 0; s < 10; s++)
 
8322
        {
 
8323
          for (unsigned int t = 0; t < 10; t++)
 
8324
          {
 
8325
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8326
          }// end loop over 't'
 
8327
        }// end loop over 's'
 
8328
      }// end loop over 'r'
 
8329
      
 
8330
      // Transform derivatives back to physical element
 
8331
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8332
      {
 
8333
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8334
        {
 
8335
          values[r] += transform[r][s]*derivatives[s];
 
8336
        }// end loop over 's'
 
8337
      }// end loop over 'r'
 
8338
      
 
8339
      // Delete pointer to array of derivatives on FIAT element
 
8340
      delete [] derivatives;
 
8341
      
 
8342
      // Delete pointer to array of combinations of derivatives and transform
 
8343
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8344
      {
 
8345
        delete [] combinations[r];
 
8346
      }// end loop over 'r'
 
8347
      delete [] combinations;
 
8348
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8349
      {
 
8350
        delete [] transform[r];
 
8351
      }// end loop over 'r'
 
8352
      delete [] transform;
 
8353
        break;
 
8354
      }
 
8355
    case 4:
 
8356
      {
 
8357
        
 
8358
      // Array of basisvalues.
 
8359
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
8360
      
 
8361
      // Declare helper variables.
 
8362
      unsigned int rr = 0;
 
8363
      unsigned int ss = 0;
 
8364
      unsigned int tt = 0;
 
8365
      double tmp5 = 0.00000000;
 
8366
      double tmp6 = 0.00000000;
 
8367
      double tmp7 = 0.00000000;
 
8368
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
8369
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
8370
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
8371
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
8372
      double tmp4 = tmp3*tmp3;
 
8373
      
 
8374
      // Compute basisvalues.
 
8375
      basisvalues[0] = 1.00000000;
 
8376
      basisvalues[1] = tmp0;
 
8377
      for (unsigned int r = 1; r < 2; r++)
 
8378
      {
 
8379
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8380
        ss = r*(r + 1)*(r + 2)/6;
 
8381
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8382
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
8383
      }// end loop over 'r'
 
8384
      for (unsigned int r = 0; r < 2; r++)
 
8385
      {
 
8386
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8387
        ss = r*(r + 1)*(r + 2)/6;
 
8388
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
8389
      }// end loop over 'r'
 
8390
      for (unsigned int r = 0; r < 1; r++)
 
8391
      {
 
8392
        for (unsigned int s = 1; s < 2 - r; s++)
 
8393
        {
 
8394
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8395
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8396
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8397
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8398
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8399
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8400
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8401
        }// end loop over 's'
 
8402
      }// end loop over 'r'
 
8403
      for (unsigned int r = 0; r < 2; r++)
 
8404
      {
 
8405
        for (unsigned int s = 0; s < 2 - r; s++)
 
8406
        {
 
8407
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8408
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8409
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
8410
        }// end loop over 's'
 
8411
      }// end loop over 'r'
 
8412
      for (unsigned int r = 0; r < 1; r++)
 
8413
      {
 
8414
        for (unsigned int s = 0; s < 1 - r; s++)
 
8415
        {
 
8416
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8417
          {
 
8418
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
8419
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8420
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
8421
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8422
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8423
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8424
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8425
          }// end loop over 't'
 
8426
        }// end loop over 's'
 
8427
      }// end loop over 'r'
 
8428
      for (unsigned int r = 0; r < 3; r++)
 
8429
      {
 
8430
        for (unsigned int s = 0; s < 3 - r; s++)
 
8431
        {
 
8432
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8433
          {
 
8434
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8435
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
8436
          }// end loop over 't'
 
8437
        }// end loop over 's'
 
8438
      }// end loop over 'r'
 
8439
      
 
8440
      // Table(s) of coefficients.
 
8441
      static const double coefficients0[10] = \
 
8442
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
8443
      
 
8444
      // Tables of derivatives of the polynomial base (transpose).
 
8445
      static const double dmats0[10][10] = \
 
8446
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8447
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8448
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8449
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8450
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8451
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8452
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8453
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8454
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8455
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8456
      
 
8457
      static const double dmats1[10][10] = \
 
8458
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8459
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8460
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8461
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8462
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8463
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8464
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8465
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8466
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8467
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8468
      
 
8469
      static const double dmats2[10][10] = \
 
8470
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8471
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8472
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8473
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8474
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8475
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8476
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8477
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8478
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8479
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8480
      
 
8481
      // Compute reference derivatives.
 
8482
      // Declare pointer to array of derivatives on FIAT element.
 
8483
      double *derivatives = new double[num_derivatives];
 
8484
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8485
      {
 
8486
        derivatives[r] = 0.00000000;
 
8487
      }// end loop over 'r'
 
8488
      
 
8489
      // Declare derivative matrix (of polynomial basis).
 
8490
      double dmats[10][10] = \
 
8491
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8492
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8493
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8494
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8495
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8496
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8497
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8498
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
8499
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
8500
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
8501
      
 
8502
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8503
      double dmats_old[10][10] = \
 
8504
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8505
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8506
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8507
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8508
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8509
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8510
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8511
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
8512
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
8513
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
8514
      
 
8515
      // Loop possible derivatives.
 
8516
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8517
      {
 
8518
        // Resetting dmats values to compute next derivative.
 
8519
        for (unsigned int t = 0; t < 10; t++)
 
8520
        {
 
8521
          for (unsigned int u = 0; u < 10; u++)
 
8522
          {
 
8523
            dmats[t][u] = 0.00000000;
 
8524
            if (t == u)
 
8525
            {
 
8526
            dmats[t][u] = 1.00000000;
 
8527
            }
 
8528
            
 
8529
          }// end loop over 'u'
 
8530
        }// end loop over 't'
 
8531
        
 
8532
        // Looping derivative order to generate dmats.
 
8533
        for (unsigned int s = 0; s < n; s++)
 
8534
        {
 
8535
          // Updating dmats_old with new values and resetting dmats.
 
8536
          for (unsigned int t = 0; t < 10; t++)
 
8537
          {
 
8538
            for (unsigned int u = 0; u < 10; u++)
 
8539
            {
 
8540
              dmats_old[t][u] = dmats[t][u];
 
8541
              dmats[t][u] = 0.00000000;
 
8542
            }// end loop over 'u'
 
8543
          }// end loop over 't'
 
8544
          
 
8545
          // Update dmats using an inner product.
 
8546
          if (combinations[r][s] == 0)
 
8547
          {
 
8548
          for (unsigned int t = 0; t < 10; t++)
 
8549
          {
 
8550
            for (unsigned int u = 0; u < 10; u++)
 
8551
            {
 
8552
              for (unsigned int tu = 0; tu < 10; tu++)
 
8553
              {
 
8554
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8555
              }// end loop over 'tu'
 
8556
            }// end loop over 'u'
 
8557
          }// end loop over 't'
 
8558
          }
 
8559
          
 
8560
          if (combinations[r][s] == 1)
 
8561
          {
 
8562
          for (unsigned int t = 0; t < 10; t++)
 
8563
          {
 
8564
            for (unsigned int u = 0; u < 10; u++)
 
8565
            {
 
8566
              for (unsigned int tu = 0; tu < 10; tu++)
 
8567
              {
 
8568
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8569
              }// end loop over 'tu'
 
8570
            }// end loop over 'u'
 
8571
          }// end loop over 't'
 
8572
          }
 
8573
          
 
8574
          if (combinations[r][s] == 2)
 
8575
          {
 
8576
          for (unsigned int t = 0; t < 10; t++)
 
8577
          {
 
8578
            for (unsigned int u = 0; u < 10; u++)
 
8579
            {
 
8580
              for (unsigned int tu = 0; tu < 10; tu++)
 
8581
              {
 
8582
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8583
              }// end loop over 'tu'
 
8584
            }// end loop over 'u'
 
8585
          }// end loop over 't'
 
8586
          }
 
8587
          
 
8588
        }// end loop over 's'
 
8589
        for (unsigned int s = 0; s < 10; s++)
 
8590
        {
 
8591
          for (unsigned int t = 0; t < 10; t++)
 
8592
          {
 
8593
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8594
          }// end loop over 't'
 
8595
        }// end loop over 's'
 
8596
      }// end loop over 'r'
 
8597
      
 
8598
      // Transform derivatives back to physical element
 
8599
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8600
      {
 
8601
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8602
        {
 
8603
          values[r] += transform[r][s]*derivatives[s];
 
8604
        }// end loop over 's'
 
8605
      }// end loop over 'r'
 
8606
      
 
8607
      // Delete pointer to array of derivatives on FIAT element
 
8608
      delete [] derivatives;
 
8609
      
 
8610
      // Delete pointer to array of combinations of derivatives and transform
 
8611
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8612
      {
 
8613
        delete [] combinations[r];
 
8614
      }// end loop over 'r'
 
8615
      delete [] combinations;
 
8616
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8617
      {
 
8618
        delete [] transform[r];
 
8619
      }// end loop over 'r'
 
8620
      delete [] transform;
 
8621
        break;
 
8622
      }
 
8623
    case 5:
 
8624
      {
 
8625
        
 
8626
      // Array of basisvalues.
 
8627
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
8628
      
 
8629
      // Declare helper variables.
 
8630
      unsigned int rr = 0;
 
8631
      unsigned int ss = 0;
 
8632
      unsigned int tt = 0;
 
8633
      double tmp5 = 0.00000000;
 
8634
      double tmp6 = 0.00000000;
 
8635
      double tmp7 = 0.00000000;
 
8636
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
8637
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
8638
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
8639
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
8640
      double tmp4 = tmp3*tmp3;
 
8641
      
 
8642
      // Compute basisvalues.
 
8643
      basisvalues[0] = 1.00000000;
 
8644
      basisvalues[1] = tmp0;
 
8645
      for (unsigned int r = 1; r < 2; r++)
 
8646
      {
 
8647
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8648
        ss = r*(r + 1)*(r + 2)/6;
 
8649
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8650
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
8651
      }// end loop over 'r'
 
8652
      for (unsigned int r = 0; r < 2; r++)
 
8653
      {
 
8654
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8655
        ss = r*(r + 1)*(r + 2)/6;
 
8656
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
8657
      }// end loop over 'r'
 
8658
      for (unsigned int r = 0; r < 1; r++)
 
8659
      {
 
8660
        for (unsigned int s = 1; s < 2 - r; s++)
 
8661
        {
 
8662
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8663
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8664
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8665
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8666
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8667
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8668
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8669
        }// end loop over 's'
 
8670
      }// end loop over 'r'
 
8671
      for (unsigned int r = 0; r < 2; r++)
 
8672
      {
 
8673
        for (unsigned int s = 0; s < 2 - r; s++)
 
8674
        {
 
8675
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8676
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8677
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
8678
        }// end loop over 's'
 
8679
      }// end loop over 'r'
 
8680
      for (unsigned int r = 0; r < 1; r++)
 
8681
      {
 
8682
        for (unsigned int s = 0; s < 1 - r; s++)
 
8683
        {
 
8684
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8685
          {
 
8686
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
8687
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8688
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
8689
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8690
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8691
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8692
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8693
          }// end loop over 't'
 
8694
        }// end loop over 's'
 
8695
      }// end loop over 'r'
 
8696
      for (unsigned int r = 0; r < 3; r++)
 
8697
      {
 
8698
        for (unsigned int s = 0; s < 3 - r; s++)
 
8699
        {
 
8700
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8701
          {
 
8702
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8703
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
8704
          }// end loop over 't'
 
8705
        }// end loop over 's'
 
8706
      }// end loop over 'r'
 
8707
      
 
8708
      // Table(s) of coefficients.
 
8709
      static const double coefficients0[10] = \
 
8710
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
8711
      
 
8712
      // Tables of derivatives of the polynomial base (transpose).
 
8713
      static const double dmats0[10][10] = \
 
8714
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8715
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8716
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8717
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8718
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8719
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8720
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8721
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8722
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8723
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8724
      
 
8725
      static const double dmats1[10][10] = \
 
8726
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8727
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8728
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8729
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8730
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8731
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8732
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8733
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8734
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8735
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8736
      
 
8737
      static const double dmats2[10][10] = \
 
8738
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8739
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8740
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8741
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8742
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8743
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8744
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8745
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8746
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8747
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8748
      
 
8749
      // Compute reference derivatives.
 
8750
      // Declare pointer to array of derivatives on FIAT element.
 
8751
      double *derivatives = new double[num_derivatives];
 
8752
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8753
      {
 
8754
        derivatives[r] = 0.00000000;
 
8755
      }// end loop over 'r'
 
8756
      
 
8757
      // Declare derivative matrix (of polynomial basis).
 
8758
      double dmats[10][10] = \
 
8759
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8760
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8761
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8762
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8763
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8764
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8765
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8766
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
8767
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
8768
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
8769
      
 
8770
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8771
      double dmats_old[10][10] = \
 
8772
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8773
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8774
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8775
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8776
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8777
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8778
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8779
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
8780
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
8781
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
8782
      
 
8783
      // Loop possible derivatives.
 
8784
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8785
      {
 
8786
        // Resetting dmats values to compute next derivative.
 
8787
        for (unsigned int t = 0; t < 10; t++)
 
8788
        {
 
8789
          for (unsigned int u = 0; u < 10; u++)
 
8790
          {
 
8791
            dmats[t][u] = 0.00000000;
 
8792
            if (t == u)
 
8793
            {
 
8794
            dmats[t][u] = 1.00000000;
 
8795
            }
 
8796
            
 
8797
          }// end loop over 'u'
 
8798
        }// end loop over 't'
 
8799
        
 
8800
        // Looping derivative order to generate dmats.
 
8801
        for (unsigned int s = 0; s < n; s++)
 
8802
        {
 
8803
          // Updating dmats_old with new values and resetting dmats.
 
8804
          for (unsigned int t = 0; t < 10; t++)
 
8805
          {
 
8806
            for (unsigned int u = 0; u < 10; u++)
 
8807
            {
 
8808
              dmats_old[t][u] = dmats[t][u];
 
8809
              dmats[t][u] = 0.00000000;
 
8810
            }// end loop over 'u'
 
8811
          }// end loop over 't'
 
8812
          
 
8813
          // Update dmats using an inner product.
 
8814
          if (combinations[r][s] == 0)
 
8815
          {
 
8816
          for (unsigned int t = 0; t < 10; t++)
 
8817
          {
 
8818
            for (unsigned int u = 0; u < 10; u++)
 
8819
            {
 
8820
              for (unsigned int tu = 0; tu < 10; tu++)
 
8821
              {
 
8822
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8823
              }// end loop over 'tu'
 
8824
            }// end loop over 'u'
 
8825
          }// end loop over 't'
 
8826
          }
 
8827
          
 
8828
          if (combinations[r][s] == 1)
 
8829
          {
 
8830
          for (unsigned int t = 0; t < 10; t++)
 
8831
          {
 
8832
            for (unsigned int u = 0; u < 10; u++)
 
8833
            {
 
8834
              for (unsigned int tu = 0; tu < 10; tu++)
 
8835
              {
 
8836
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8837
              }// end loop over 'tu'
 
8838
            }// end loop over 'u'
 
8839
          }// end loop over 't'
 
8840
          }
 
8841
          
 
8842
          if (combinations[r][s] == 2)
 
8843
          {
 
8844
          for (unsigned int t = 0; t < 10; t++)
 
8845
          {
 
8846
            for (unsigned int u = 0; u < 10; u++)
 
8847
            {
 
8848
              for (unsigned int tu = 0; tu < 10; tu++)
 
8849
              {
 
8850
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8851
              }// end loop over 'tu'
 
8852
            }// end loop over 'u'
 
8853
          }// end loop over 't'
 
8854
          }
 
8855
          
 
8856
        }// end loop over 's'
 
8857
        for (unsigned int s = 0; s < 10; s++)
 
8858
        {
 
8859
          for (unsigned int t = 0; t < 10; t++)
 
8860
          {
 
8861
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8862
          }// end loop over 't'
 
8863
        }// end loop over 's'
 
8864
      }// end loop over 'r'
 
8865
      
 
8866
      // Transform derivatives back to physical element
 
8867
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8868
      {
 
8869
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8870
        {
 
8871
          values[r] += transform[r][s]*derivatives[s];
 
8872
        }// end loop over 's'
 
8873
      }// end loop over 'r'
 
8874
      
 
8875
      // Delete pointer to array of derivatives on FIAT element
 
8876
      delete [] derivatives;
 
8877
      
 
8878
      // Delete pointer to array of combinations of derivatives and transform
 
8879
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8880
      {
 
8881
        delete [] combinations[r];
 
8882
      }// end loop over 'r'
 
8883
      delete [] combinations;
 
8884
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8885
      {
 
8886
        delete [] transform[r];
 
8887
      }// end loop over 'r'
 
8888
      delete [] transform;
 
8889
        break;
 
8890
      }
 
8891
    case 6:
 
8892
      {
 
8893
        
 
8894
      // Array of basisvalues.
 
8895
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
8896
      
 
8897
      // Declare helper variables.
 
8898
      unsigned int rr = 0;
 
8899
      unsigned int ss = 0;
 
8900
      unsigned int tt = 0;
 
8901
      double tmp5 = 0.00000000;
 
8902
      double tmp6 = 0.00000000;
 
8903
      double tmp7 = 0.00000000;
 
8904
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
8905
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
8906
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
8907
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
8908
      double tmp4 = tmp3*tmp3;
 
8909
      
 
8910
      // Compute basisvalues.
 
8911
      basisvalues[0] = 1.00000000;
 
8912
      basisvalues[1] = tmp0;
 
8913
      for (unsigned int r = 1; r < 2; r++)
 
8914
      {
 
8915
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8916
        ss = r*(r + 1)*(r + 2)/6;
 
8917
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8918
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
8919
      }// end loop over 'r'
 
8920
      for (unsigned int r = 0; r < 2; r++)
 
8921
      {
 
8922
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8923
        ss = r*(r + 1)*(r + 2)/6;
 
8924
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
8925
      }// end loop over 'r'
 
8926
      for (unsigned int r = 0; r < 1; r++)
 
8927
      {
 
8928
        for (unsigned int s = 1; s < 2 - r; s++)
 
8929
        {
 
8930
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8931
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8932
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8933
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8934
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8935
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
8936
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8937
        }// end loop over 's'
 
8938
      }// end loop over 'r'
 
8939
      for (unsigned int r = 0; r < 2; r++)
 
8940
      {
 
8941
        for (unsigned int s = 0; s < 2 - r; s++)
 
8942
        {
 
8943
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8944
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8945
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
8946
        }// end loop over 's'
 
8947
      }// end loop over 'r'
 
8948
      for (unsigned int r = 0; r < 1; r++)
 
8949
      {
 
8950
        for (unsigned int s = 0; s < 1 - r; s++)
 
8951
        {
 
8952
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8953
          {
 
8954
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
8955
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8956
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
8957
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8958
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8959
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
8960
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8961
          }// end loop over 't'
 
8962
        }// end loop over 's'
 
8963
      }// end loop over 'r'
 
8964
      for (unsigned int r = 0; r < 3; r++)
 
8965
      {
 
8966
        for (unsigned int s = 0; s < 3 - r; s++)
 
8967
        {
 
8968
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8969
          {
 
8970
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8971
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
8972
          }// end loop over 't'
 
8973
        }// end loop over 's'
 
8974
      }// end loop over 'r'
 
8975
      
 
8976
      // Table(s) of coefficients.
 
8977
      static const double coefficients0[10] = \
 
8978
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
8979
      
 
8980
      // Tables of derivatives of the polynomial base (transpose).
 
8981
      static const double dmats0[10][10] = \
 
8982
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8983
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8984
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8985
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8986
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8987
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8988
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8989
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8990
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8991
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
8992
      
 
8993
      static const double dmats1[10][10] = \
 
8994
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8995
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8996
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8997
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8998
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
8999
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9000
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9001
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9002
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9003
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9004
      
 
9005
      static const double dmats2[10][10] = \
 
9006
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9007
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9008
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9009
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9010
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9011
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9012
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9013
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9014
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9015
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9016
      
 
9017
      // Compute reference derivatives.
 
9018
      // Declare pointer to array of derivatives on FIAT element.
 
9019
      double *derivatives = new double[num_derivatives];
 
9020
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9021
      {
 
9022
        derivatives[r] = 0.00000000;
 
9023
      }// end loop over 'r'
 
9024
      
 
9025
      // Declare derivative matrix (of polynomial basis).
 
9026
      double dmats[10][10] = \
 
9027
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9028
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9029
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9030
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9031
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9032
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9033
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9034
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9035
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9036
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9037
      
 
9038
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9039
      double dmats_old[10][10] = \
 
9040
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9041
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9042
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9043
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9044
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9045
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9046
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9047
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9048
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9049
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9050
      
 
9051
      // Loop possible derivatives.
 
9052
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9053
      {
 
9054
        // Resetting dmats values to compute next derivative.
 
9055
        for (unsigned int t = 0; t < 10; t++)
 
9056
        {
 
9057
          for (unsigned int u = 0; u < 10; u++)
 
9058
          {
 
9059
            dmats[t][u] = 0.00000000;
 
9060
            if (t == u)
 
9061
            {
 
9062
            dmats[t][u] = 1.00000000;
 
9063
            }
 
9064
            
 
9065
          }// end loop over 'u'
 
9066
        }// end loop over 't'
 
9067
        
 
9068
        // Looping derivative order to generate dmats.
 
9069
        for (unsigned int s = 0; s < n; s++)
 
9070
        {
 
9071
          // Updating dmats_old with new values and resetting dmats.
 
9072
          for (unsigned int t = 0; t < 10; t++)
 
9073
          {
 
9074
            for (unsigned int u = 0; u < 10; u++)
 
9075
            {
 
9076
              dmats_old[t][u] = dmats[t][u];
 
9077
              dmats[t][u] = 0.00000000;
 
9078
            }// end loop over 'u'
 
9079
          }// end loop over 't'
 
9080
          
 
9081
          // Update dmats using an inner product.
 
9082
          if (combinations[r][s] == 0)
 
9083
          {
 
9084
          for (unsigned int t = 0; t < 10; t++)
 
9085
          {
 
9086
            for (unsigned int u = 0; u < 10; u++)
 
9087
            {
 
9088
              for (unsigned int tu = 0; tu < 10; tu++)
 
9089
              {
 
9090
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9091
              }// end loop over 'tu'
 
9092
            }// end loop over 'u'
 
9093
          }// end loop over 't'
 
9094
          }
 
9095
          
 
9096
          if (combinations[r][s] == 1)
 
9097
          {
 
9098
          for (unsigned int t = 0; t < 10; t++)
 
9099
          {
 
9100
            for (unsigned int u = 0; u < 10; u++)
 
9101
            {
 
9102
              for (unsigned int tu = 0; tu < 10; tu++)
 
9103
              {
 
9104
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9105
              }// end loop over 'tu'
 
9106
            }// end loop over 'u'
 
9107
          }// end loop over 't'
 
9108
          }
 
9109
          
 
9110
          if (combinations[r][s] == 2)
 
9111
          {
 
9112
          for (unsigned int t = 0; t < 10; t++)
 
9113
          {
 
9114
            for (unsigned int u = 0; u < 10; u++)
 
9115
            {
 
9116
              for (unsigned int tu = 0; tu < 10; tu++)
 
9117
              {
 
9118
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9119
              }// end loop over 'tu'
 
9120
            }// end loop over 'u'
 
9121
          }// end loop over 't'
 
9122
          }
 
9123
          
 
9124
        }// end loop over 's'
 
9125
        for (unsigned int s = 0; s < 10; s++)
 
9126
        {
 
9127
          for (unsigned int t = 0; t < 10; t++)
 
9128
          {
 
9129
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9130
          }// end loop over 't'
 
9131
        }// end loop over 's'
 
9132
      }// end loop over 'r'
 
9133
      
 
9134
      // Transform derivatives back to physical element
 
9135
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9136
      {
 
9137
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9138
        {
 
9139
          values[r] += transform[r][s]*derivatives[s];
 
9140
        }// end loop over 's'
 
9141
      }// end loop over 'r'
 
9142
      
 
9143
      // Delete pointer to array of derivatives on FIAT element
 
9144
      delete [] derivatives;
 
9145
      
 
9146
      // Delete pointer to array of combinations of derivatives and transform
 
9147
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9148
      {
 
9149
        delete [] combinations[r];
 
9150
      }// end loop over 'r'
 
9151
      delete [] combinations;
 
9152
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9153
      {
 
9154
        delete [] transform[r];
 
9155
      }// end loop over 'r'
 
9156
      delete [] transform;
 
9157
        break;
 
9158
      }
 
9159
    case 7:
 
9160
      {
 
9161
        
 
9162
      // Array of basisvalues.
 
9163
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
9164
      
 
9165
      // Declare helper variables.
 
9166
      unsigned int rr = 0;
 
9167
      unsigned int ss = 0;
 
9168
      unsigned int tt = 0;
 
9169
      double tmp5 = 0.00000000;
 
9170
      double tmp6 = 0.00000000;
 
9171
      double tmp7 = 0.00000000;
 
9172
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
9173
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
9174
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
9175
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
9176
      double tmp4 = tmp3*tmp3;
 
9177
      
 
9178
      // Compute basisvalues.
 
9179
      basisvalues[0] = 1.00000000;
 
9180
      basisvalues[1] = tmp0;
 
9181
      for (unsigned int r = 1; r < 2; r++)
 
9182
      {
 
9183
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9184
        ss = r*(r + 1)*(r + 2)/6;
 
9185
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9186
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
9187
      }// end loop over 'r'
 
9188
      for (unsigned int r = 0; r < 2; r++)
 
9189
      {
 
9190
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9191
        ss = r*(r + 1)*(r + 2)/6;
 
9192
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
9193
      }// end loop over 'r'
 
9194
      for (unsigned int r = 0; r < 1; r++)
 
9195
      {
 
9196
        for (unsigned int s = 1; s < 2 - r; s++)
 
9197
        {
 
9198
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
9199
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9200
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
9201
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9202
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9203
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9204
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
9205
        }// end loop over 's'
 
9206
      }// end loop over 'r'
 
9207
      for (unsigned int r = 0; r < 2; r++)
 
9208
      {
 
9209
        for (unsigned int s = 0; s < 2 - r; s++)
 
9210
        {
 
9211
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
9212
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9213
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
9214
        }// end loop over 's'
 
9215
      }// end loop over 'r'
 
9216
      for (unsigned int r = 0; r < 1; r++)
 
9217
      {
 
9218
        for (unsigned int s = 0; s < 1 - r; s++)
 
9219
        {
 
9220
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9221
          {
 
9222
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
9223
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9224
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
9225
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9226
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9227
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9228
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9229
          }// end loop over 't'
 
9230
        }// end loop over 's'
 
9231
      }// end loop over 'r'
 
9232
      for (unsigned int r = 0; r < 3; r++)
 
9233
      {
 
9234
        for (unsigned int s = 0; s < 3 - r; s++)
 
9235
        {
 
9236
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9237
          {
 
9238
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9239
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
9240
          }// end loop over 't'
 
9241
        }// end loop over 's'
 
9242
      }// end loop over 'r'
 
9243
      
 
9244
      // Table(s) of coefficients.
 
9245
      static const double coefficients0[10] = \
 
9246
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
9247
      
 
9248
      // Tables of derivatives of the polynomial base (transpose).
 
9249
      static const double dmats0[10][10] = \
 
9250
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9251
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9252
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9253
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9254
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9255
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9256
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9257
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9258
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9259
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9260
      
 
9261
      static const double dmats1[10][10] = \
 
9262
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9263
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9264
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9265
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9266
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9267
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9268
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9269
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9270
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9271
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9272
      
 
9273
      static const double dmats2[10][10] = \
 
9274
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9275
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9276
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9277
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9278
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9279
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9280
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9281
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9282
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9283
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9284
      
 
9285
      // Compute reference derivatives.
 
9286
      // Declare pointer to array of derivatives on FIAT element.
 
9287
      double *derivatives = new double[num_derivatives];
 
9288
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9289
      {
 
9290
        derivatives[r] = 0.00000000;
 
9291
      }// end loop over 'r'
 
9292
      
 
9293
      // Declare derivative matrix (of polynomial basis).
 
9294
      double dmats[10][10] = \
 
9295
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9296
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9297
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9298
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9299
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9300
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9301
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9302
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9303
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9304
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9305
      
 
9306
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9307
      double dmats_old[10][10] = \
 
9308
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9309
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9310
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9311
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9312
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9313
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9314
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9315
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9316
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9317
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9318
      
 
9319
      // Loop possible derivatives.
 
9320
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9321
      {
 
9322
        // Resetting dmats values to compute next derivative.
 
9323
        for (unsigned int t = 0; t < 10; t++)
 
9324
        {
 
9325
          for (unsigned int u = 0; u < 10; u++)
 
9326
          {
 
9327
            dmats[t][u] = 0.00000000;
 
9328
            if (t == u)
 
9329
            {
 
9330
            dmats[t][u] = 1.00000000;
 
9331
            }
 
9332
            
 
9333
          }// end loop over 'u'
 
9334
        }// end loop over 't'
 
9335
        
 
9336
        // Looping derivative order to generate dmats.
 
9337
        for (unsigned int s = 0; s < n; s++)
 
9338
        {
 
9339
          // Updating dmats_old with new values and resetting dmats.
 
9340
          for (unsigned int t = 0; t < 10; t++)
 
9341
          {
 
9342
            for (unsigned int u = 0; u < 10; u++)
 
9343
            {
 
9344
              dmats_old[t][u] = dmats[t][u];
 
9345
              dmats[t][u] = 0.00000000;
 
9346
            }// end loop over 'u'
 
9347
          }// end loop over 't'
 
9348
          
 
9349
          // Update dmats using an inner product.
 
9350
          if (combinations[r][s] == 0)
 
9351
          {
 
9352
          for (unsigned int t = 0; t < 10; t++)
 
9353
          {
 
9354
            for (unsigned int u = 0; u < 10; u++)
 
9355
            {
 
9356
              for (unsigned int tu = 0; tu < 10; tu++)
 
9357
              {
 
9358
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9359
              }// end loop over 'tu'
 
9360
            }// end loop over 'u'
 
9361
          }// end loop over 't'
 
9362
          }
 
9363
          
 
9364
          if (combinations[r][s] == 1)
 
9365
          {
 
9366
          for (unsigned int t = 0; t < 10; t++)
 
9367
          {
 
9368
            for (unsigned int u = 0; u < 10; u++)
 
9369
            {
 
9370
              for (unsigned int tu = 0; tu < 10; tu++)
 
9371
              {
 
9372
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9373
              }// end loop over 'tu'
 
9374
            }// end loop over 'u'
 
9375
          }// end loop over 't'
 
9376
          }
 
9377
          
 
9378
          if (combinations[r][s] == 2)
 
9379
          {
 
9380
          for (unsigned int t = 0; t < 10; t++)
 
9381
          {
 
9382
            for (unsigned int u = 0; u < 10; u++)
 
9383
            {
 
9384
              for (unsigned int tu = 0; tu < 10; tu++)
 
9385
              {
 
9386
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9387
              }// end loop over 'tu'
 
9388
            }// end loop over 'u'
 
9389
          }// end loop over 't'
 
9390
          }
 
9391
          
 
9392
        }// end loop over 's'
 
9393
        for (unsigned int s = 0; s < 10; s++)
 
9394
        {
 
9395
          for (unsigned int t = 0; t < 10; t++)
 
9396
          {
 
9397
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9398
          }// end loop over 't'
 
9399
        }// end loop over 's'
 
9400
      }// end loop over 'r'
 
9401
      
 
9402
      // Transform derivatives back to physical element
 
9403
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9404
      {
 
9405
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9406
        {
 
9407
          values[r] += transform[r][s]*derivatives[s];
 
9408
        }// end loop over 's'
 
9409
      }// end loop over 'r'
 
9410
      
 
9411
      // Delete pointer to array of derivatives on FIAT element
 
9412
      delete [] derivatives;
 
9413
      
 
9414
      // Delete pointer to array of combinations of derivatives and transform
 
9415
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9416
      {
 
9417
        delete [] combinations[r];
 
9418
      }// end loop over 'r'
 
9419
      delete [] combinations;
 
9420
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9421
      {
 
9422
        delete [] transform[r];
 
9423
      }// end loop over 'r'
 
9424
      delete [] transform;
 
9425
        break;
 
9426
      }
 
9427
    case 8:
 
9428
      {
 
9429
        
 
9430
      // Array of basisvalues.
 
9431
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
9432
      
 
9433
      // Declare helper variables.
 
9434
      unsigned int rr = 0;
 
9435
      unsigned int ss = 0;
 
9436
      unsigned int tt = 0;
 
9437
      double tmp5 = 0.00000000;
 
9438
      double tmp6 = 0.00000000;
 
9439
      double tmp7 = 0.00000000;
 
9440
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
9441
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
9442
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
9443
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
9444
      double tmp4 = tmp3*tmp3;
 
9445
      
 
9446
      // Compute basisvalues.
 
9447
      basisvalues[0] = 1.00000000;
 
9448
      basisvalues[1] = tmp0;
 
9449
      for (unsigned int r = 1; r < 2; r++)
 
9450
      {
 
9451
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9452
        ss = r*(r + 1)*(r + 2)/6;
 
9453
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9454
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
9455
      }// end loop over 'r'
 
9456
      for (unsigned int r = 0; r < 2; r++)
 
9457
      {
 
9458
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9459
        ss = r*(r + 1)*(r + 2)/6;
 
9460
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
9461
      }// end loop over 'r'
 
9462
      for (unsigned int r = 0; r < 1; r++)
 
9463
      {
 
9464
        for (unsigned int s = 1; s < 2 - r; s++)
 
9465
        {
 
9466
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
9467
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9468
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
9469
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9470
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9471
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9472
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
9473
        }// end loop over 's'
 
9474
      }// end loop over 'r'
 
9475
      for (unsigned int r = 0; r < 2; r++)
 
9476
      {
 
9477
        for (unsigned int s = 0; s < 2 - r; s++)
 
9478
        {
 
9479
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
9480
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9481
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
9482
        }// end loop over 's'
 
9483
      }// end loop over 'r'
 
9484
      for (unsigned int r = 0; r < 1; r++)
 
9485
      {
 
9486
        for (unsigned int s = 0; s < 1 - r; s++)
 
9487
        {
 
9488
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9489
          {
 
9490
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
9491
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9492
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
9493
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9494
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9495
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9496
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9497
          }// end loop over 't'
 
9498
        }// end loop over 's'
 
9499
      }// end loop over 'r'
 
9500
      for (unsigned int r = 0; r < 3; r++)
 
9501
      {
 
9502
        for (unsigned int s = 0; s < 3 - r; s++)
 
9503
        {
 
9504
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9505
          {
 
9506
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9507
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
9508
          }// end loop over 't'
 
9509
        }// end loop over 's'
 
9510
      }// end loop over 'r'
 
9511
      
 
9512
      // Table(s) of coefficients.
 
9513
      static const double coefficients0[10] = \
 
9514
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
9515
      
 
9516
      // Tables of derivatives of the polynomial base (transpose).
 
9517
      static const double dmats0[10][10] = \
 
9518
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9519
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9520
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9521
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9522
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9523
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9524
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9525
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9526
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9527
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9528
      
 
9529
      static const double dmats1[10][10] = \
 
9530
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9531
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9532
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9533
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9534
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9535
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9536
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9537
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9538
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9539
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9540
      
 
9541
      static const double dmats2[10][10] = \
 
9542
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9543
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9544
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9545
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9546
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9547
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9548
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9549
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9550
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9551
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9552
      
 
9553
      // Compute reference derivatives.
 
9554
      // Declare pointer to array of derivatives on FIAT element.
 
9555
      double *derivatives = new double[num_derivatives];
 
9556
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9557
      {
 
9558
        derivatives[r] = 0.00000000;
 
9559
      }// end loop over 'r'
 
9560
      
 
9561
      // Declare derivative matrix (of polynomial basis).
 
9562
      double dmats[10][10] = \
 
9563
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9564
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9565
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9566
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9567
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9568
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9569
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9570
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9571
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9572
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9573
      
 
9574
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9575
      double dmats_old[10][10] = \
 
9576
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9577
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9578
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9579
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9580
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9581
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9582
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9583
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9584
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9585
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9586
      
 
9587
      // Loop possible derivatives.
 
9588
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9589
      {
 
9590
        // Resetting dmats values to compute next derivative.
 
9591
        for (unsigned int t = 0; t < 10; t++)
 
9592
        {
 
9593
          for (unsigned int u = 0; u < 10; u++)
 
9594
          {
 
9595
            dmats[t][u] = 0.00000000;
 
9596
            if (t == u)
 
9597
            {
 
9598
            dmats[t][u] = 1.00000000;
 
9599
            }
 
9600
            
 
9601
          }// end loop over 'u'
 
9602
        }// end loop over 't'
 
9603
        
 
9604
        // Looping derivative order to generate dmats.
 
9605
        for (unsigned int s = 0; s < n; s++)
 
9606
        {
 
9607
          // Updating dmats_old with new values and resetting dmats.
 
9608
          for (unsigned int t = 0; t < 10; t++)
 
9609
          {
 
9610
            for (unsigned int u = 0; u < 10; u++)
 
9611
            {
 
9612
              dmats_old[t][u] = dmats[t][u];
 
9613
              dmats[t][u] = 0.00000000;
 
9614
            }// end loop over 'u'
 
9615
          }// end loop over 't'
 
9616
          
 
9617
          // Update dmats using an inner product.
 
9618
          if (combinations[r][s] == 0)
 
9619
          {
 
9620
          for (unsigned int t = 0; t < 10; t++)
 
9621
          {
 
9622
            for (unsigned int u = 0; u < 10; u++)
 
9623
            {
 
9624
              for (unsigned int tu = 0; tu < 10; tu++)
 
9625
              {
 
9626
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9627
              }// end loop over 'tu'
 
9628
            }// end loop over 'u'
 
9629
          }// end loop over 't'
 
9630
          }
 
9631
          
 
9632
          if (combinations[r][s] == 1)
 
9633
          {
 
9634
          for (unsigned int t = 0; t < 10; t++)
 
9635
          {
 
9636
            for (unsigned int u = 0; u < 10; u++)
 
9637
            {
 
9638
              for (unsigned int tu = 0; tu < 10; tu++)
 
9639
              {
 
9640
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9641
              }// end loop over 'tu'
 
9642
            }// end loop over 'u'
 
9643
          }// end loop over 't'
 
9644
          }
 
9645
          
 
9646
          if (combinations[r][s] == 2)
 
9647
          {
 
9648
          for (unsigned int t = 0; t < 10; t++)
 
9649
          {
 
9650
            for (unsigned int u = 0; u < 10; u++)
 
9651
            {
 
9652
              for (unsigned int tu = 0; tu < 10; tu++)
 
9653
              {
 
9654
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9655
              }// end loop over 'tu'
 
9656
            }// end loop over 'u'
 
9657
          }// end loop over 't'
 
9658
          }
 
9659
          
 
9660
        }// end loop over 's'
 
9661
        for (unsigned int s = 0; s < 10; s++)
 
9662
        {
 
9663
          for (unsigned int t = 0; t < 10; t++)
 
9664
          {
 
9665
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9666
          }// end loop over 't'
 
9667
        }// end loop over 's'
 
9668
      }// end loop over 'r'
 
9669
      
 
9670
      // Transform derivatives back to physical element
 
9671
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9672
      {
 
9673
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9674
        {
 
9675
          values[r] += transform[r][s]*derivatives[s];
 
9676
        }// end loop over 's'
 
9677
      }// end loop over 'r'
 
9678
      
 
9679
      // Delete pointer to array of derivatives on FIAT element
 
9680
      delete [] derivatives;
 
9681
      
 
9682
      // Delete pointer to array of combinations of derivatives and transform
 
9683
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9684
      {
 
9685
        delete [] combinations[r];
 
9686
      }// end loop over 'r'
 
9687
      delete [] combinations;
 
9688
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9689
      {
 
9690
        delete [] transform[r];
 
9691
      }// end loop over 'r'
 
9692
      delete [] transform;
 
9693
        break;
 
9694
      }
 
9695
    case 9:
 
9696
      {
 
9697
        
 
9698
      // Array of basisvalues.
 
9699
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
9700
      
 
9701
      // Declare helper variables.
 
9702
      unsigned int rr = 0;
 
9703
      unsigned int ss = 0;
 
9704
      unsigned int tt = 0;
 
9705
      double tmp5 = 0.00000000;
 
9706
      double tmp6 = 0.00000000;
 
9707
      double tmp7 = 0.00000000;
 
9708
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
9709
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
9710
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
9711
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
9712
      double tmp4 = tmp3*tmp3;
 
9713
      
 
9714
      // Compute basisvalues.
 
9715
      basisvalues[0] = 1.00000000;
 
9716
      basisvalues[1] = tmp0;
 
9717
      for (unsigned int r = 1; r < 2; r++)
 
9718
      {
 
9719
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9720
        ss = r*(r + 1)*(r + 2)/6;
 
9721
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9722
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
9723
      }// end loop over 'r'
 
9724
      for (unsigned int r = 0; r < 2; r++)
 
9725
      {
 
9726
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9727
        ss = r*(r + 1)*(r + 2)/6;
 
9728
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
9729
      }// end loop over 'r'
 
9730
      for (unsigned int r = 0; r < 1; r++)
 
9731
      {
 
9732
        for (unsigned int s = 1; s < 2 - r; s++)
 
9733
        {
 
9734
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
9735
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9736
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
9737
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9738
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9739
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
9740
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
9741
        }// end loop over 's'
 
9742
      }// end loop over 'r'
 
9743
      for (unsigned int r = 0; r < 2; r++)
 
9744
      {
 
9745
        for (unsigned int s = 0; s < 2 - r; s++)
 
9746
        {
 
9747
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
9748
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9749
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
9750
        }// end loop over 's'
 
9751
      }// end loop over 'r'
 
9752
      for (unsigned int r = 0; r < 1; r++)
 
9753
      {
 
9754
        for (unsigned int s = 0; s < 1 - r; s++)
 
9755
        {
 
9756
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9757
          {
 
9758
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
9759
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9760
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
9761
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9762
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9763
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
9764
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9765
          }// end loop over 't'
 
9766
        }// end loop over 's'
 
9767
      }// end loop over 'r'
 
9768
      for (unsigned int r = 0; r < 3; r++)
 
9769
      {
 
9770
        for (unsigned int s = 0; s < 3 - r; s++)
 
9771
        {
 
9772
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9773
          {
 
9774
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9775
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
9776
          }// end loop over 't'
 
9777
        }// end loop over 's'
 
9778
      }// end loop over 'r'
 
9779
      
 
9780
      // Table(s) of coefficients.
 
9781
      static const double coefficients0[10] = \
 
9782
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
9783
      
 
9784
      // Tables of derivatives of the polynomial base (transpose).
 
9785
      static const double dmats0[10][10] = \
 
9786
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9787
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9788
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9789
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9790
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9791
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9792
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9793
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9794
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9795
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9796
      
 
9797
      static const double dmats1[10][10] = \
 
9798
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9799
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9800
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9801
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9802
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9803
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9804
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9805
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9806
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9807
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9808
      
 
9809
      static const double dmats2[10][10] = \
 
9810
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9811
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9812
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9813
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9814
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9815
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9816
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9817
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9818
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9819
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
9820
      
 
9821
      // Compute reference derivatives.
 
9822
      // Declare pointer to array of derivatives on FIAT element.
 
9823
      double *derivatives = new double[num_derivatives];
 
9824
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9825
      {
 
9826
        derivatives[r] = 0.00000000;
 
9827
      }// end loop over 'r'
 
9828
      
 
9829
      // Declare derivative matrix (of polynomial basis).
 
9830
      double dmats[10][10] = \
 
9831
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9832
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9833
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9834
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9835
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9836
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9837
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9838
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9839
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9840
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9841
      
 
9842
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9843
      double dmats_old[10][10] = \
 
9844
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9845
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9846
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9847
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9848
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9849
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9850
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
9851
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
9852
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
9853
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
9854
      
 
9855
      // Loop possible derivatives.
 
9856
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9857
      {
 
9858
        // Resetting dmats values to compute next derivative.
 
9859
        for (unsigned int t = 0; t < 10; t++)
 
9860
        {
 
9861
          for (unsigned int u = 0; u < 10; u++)
 
9862
          {
 
9863
            dmats[t][u] = 0.00000000;
 
9864
            if (t == u)
 
9865
            {
 
9866
            dmats[t][u] = 1.00000000;
 
9867
            }
 
9868
            
 
9869
          }// end loop over 'u'
 
9870
        }// end loop over 't'
 
9871
        
 
9872
        // Looping derivative order to generate dmats.
 
9873
        for (unsigned int s = 0; s < n; s++)
 
9874
        {
 
9875
          // Updating dmats_old with new values and resetting dmats.
 
9876
          for (unsigned int t = 0; t < 10; t++)
 
9877
          {
 
9878
            for (unsigned int u = 0; u < 10; u++)
 
9879
            {
 
9880
              dmats_old[t][u] = dmats[t][u];
 
9881
              dmats[t][u] = 0.00000000;
 
9882
            }// end loop over 'u'
 
9883
          }// end loop over 't'
 
9884
          
 
9885
          // Update dmats using an inner product.
 
9886
          if (combinations[r][s] == 0)
 
9887
          {
 
9888
          for (unsigned int t = 0; t < 10; t++)
 
9889
          {
 
9890
            for (unsigned int u = 0; u < 10; u++)
 
9891
            {
 
9892
              for (unsigned int tu = 0; tu < 10; tu++)
 
9893
              {
 
9894
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9895
              }// end loop over 'tu'
 
9896
            }// end loop over 'u'
 
9897
          }// end loop over 't'
 
9898
          }
 
9899
          
 
9900
          if (combinations[r][s] == 1)
 
9901
          {
 
9902
          for (unsigned int t = 0; t < 10; t++)
 
9903
          {
 
9904
            for (unsigned int u = 0; u < 10; u++)
 
9905
            {
 
9906
              for (unsigned int tu = 0; tu < 10; tu++)
 
9907
              {
 
9908
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9909
              }// end loop over 'tu'
 
9910
            }// end loop over 'u'
 
9911
          }// end loop over 't'
 
9912
          }
 
9913
          
 
9914
          if (combinations[r][s] == 2)
 
9915
          {
 
9916
          for (unsigned int t = 0; t < 10; t++)
 
9917
          {
 
9918
            for (unsigned int u = 0; u < 10; u++)
 
9919
            {
 
9920
              for (unsigned int tu = 0; tu < 10; tu++)
 
9921
              {
 
9922
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9923
              }// end loop over 'tu'
 
9924
            }// end loop over 'u'
 
9925
          }// end loop over 't'
 
9926
          }
 
9927
          
 
9928
        }// end loop over 's'
 
9929
        for (unsigned int s = 0; s < 10; s++)
 
9930
        {
 
9931
          for (unsigned int t = 0; t < 10; t++)
 
9932
          {
 
9933
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9934
          }// end loop over 't'
 
9935
        }// end loop over 's'
 
9936
      }// end loop over 'r'
 
9937
      
 
9938
      // Transform derivatives back to physical element
 
9939
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9940
      {
 
9941
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9942
        {
 
9943
          values[r] += transform[r][s]*derivatives[s];
 
9944
        }// end loop over 's'
 
9945
      }// end loop over 'r'
 
9946
      
 
9947
      // Delete pointer to array of derivatives on FIAT element
 
9948
      delete [] derivatives;
 
9949
      
 
9950
      // Delete pointer to array of combinations of derivatives and transform
 
9951
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9952
      {
 
9953
        delete [] combinations[r];
 
9954
      }// end loop over 'r'
 
9955
      delete [] combinations;
 
9956
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9957
      {
 
9958
        delete [] transform[r];
 
9959
      }// end loop over 'r'
 
9960
      delete [] transform;
 
9961
        break;
 
9962
      }
 
9963
    case 10:
 
9964
      {
 
9965
        
 
9966
      // Array of basisvalues.
 
9967
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
9968
      
 
9969
      // Declare helper variables.
 
9970
      unsigned int rr = 0;
 
9971
      unsigned int ss = 0;
 
9972
      unsigned int tt = 0;
 
9973
      double tmp5 = 0.00000000;
 
9974
      double tmp6 = 0.00000000;
 
9975
      double tmp7 = 0.00000000;
 
9976
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
9977
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
9978
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
9979
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
9980
      double tmp4 = tmp3*tmp3;
 
9981
      
 
9982
      // Compute basisvalues.
 
9983
      basisvalues[0] = 1.00000000;
 
9984
      basisvalues[1] = tmp0;
 
9985
      for (unsigned int r = 1; r < 2; r++)
 
9986
      {
 
9987
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9988
        ss = r*(r + 1)*(r + 2)/6;
 
9989
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9990
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
9991
      }// end loop over 'r'
 
9992
      for (unsigned int r = 0; r < 2; r++)
 
9993
      {
 
9994
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9995
        ss = r*(r + 1)*(r + 2)/6;
 
9996
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
9997
      }// end loop over 'r'
 
9998
      for (unsigned int r = 0; r < 1; r++)
 
9999
      {
 
10000
        for (unsigned int s = 1; s < 2 - r; s++)
 
10001
        {
 
10002
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10003
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10004
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10005
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10006
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10007
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10008
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10009
        }// end loop over 's'
 
10010
      }// end loop over 'r'
 
10011
      for (unsigned int r = 0; r < 2; r++)
 
10012
      {
 
10013
        for (unsigned int s = 0; s < 2 - r; s++)
 
10014
        {
 
10015
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10016
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10017
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
10018
        }// end loop over 's'
 
10019
      }// end loop over 'r'
 
10020
      for (unsigned int r = 0; r < 1; r++)
 
10021
      {
 
10022
        for (unsigned int s = 0; s < 1 - r; s++)
 
10023
        {
 
10024
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10025
          {
 
10026
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
10027
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10028
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
10029
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10030
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10031
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10032
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10033
          }// end loop over 't'
 
10034
        }// end loop over 's'
 
10035
      }// end loop over 'r'
 
10036
      for (unsigned int r = 0; r < 3; r++)
 
10037
      {
 
10038
        for (unsigned int s = 0; s < 3 - r; s++)
 
10039
        {
 
10040
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10041
          {
 
10042
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10043
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
10044
          }// end loop over 't'
 
10045
        }// end loop over 's'
 
10046
      }// end loop over 'r'
 
10047
      
 
10048
      // Table(s) of coefficients.
 
10049
      static const double coefficients0[10] = \
 
10050
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
10051
      
 
10052
      // Tables of derivatives of the polynomial base (transpose).
 
10053
      static const double dmats0[10][10] = \
 
10054
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10055
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10056
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10057
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10058
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10059
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10060
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10061
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10062
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10063
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10064
      
 
10065
      static const double dmats1[10][10] = \
 
10066
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10067
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10068
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10069
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10070
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10071
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10072
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10073
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10074
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10075
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10076
      
 
10077
      static const double dmats2[10][10] = \
 
10078
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10079
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10080
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10081
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10082
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10083
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10084
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10085
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10086
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10087
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10088
      
 
10089
      // Compute reference derivatives.
 
10090
      // Declare pointer to array of derivatives on FIAT element.
 
10091
      double *derivatives = new double[num_derivatives];
 
10092
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10093
      {
 
10094
        derivatives[r] = 0.00000000;
 
10095
      }// end loop over 'r'
 
10096
      
 
10097
      // Declare derivative matrix (of polynomial basis).
 
10098
      double dmats[10][10] = \
 
10099
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10100
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10101
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10102
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10103
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10104
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10105
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10106
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10107
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10108
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10109
      
 
10110
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10111
      double dmats_old[10][10] = \
 
10112
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10113
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10114
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10115
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10116
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10117
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10118
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10119
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10120
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10121
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10122
      
 
10123
      // Loop possible derivatives.
 
10124
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10125
      {
 
10126
        // Resetting dmats values to compute next derivative.
 
10127
        for (unsigned int t = 0; t < 10; t++)
 
10128
        {
 
10129
          for (unsigned int u = 0; u < 10; u++)
 
10130
          {
 
10131
            dmats[t][u] = 0.00000000;
 
10132
            if (t == u)
 
10133
            {
 
10134
            dmats[t][u] = 1.00000000;
 
10135
            }
 
10136
            
 
10137
          }// end loop over 'u'
 
10138
        }// end loop over 't'
 
10139
        
 
10140
        // Looping derivative order to generate dmats.
 
10141
        for (unsigned int s = 0; s < n; s++)
 
10142
        {
 
10143
          // Updating dmats_old with new values and resetting dmats.
 
10144
          for (unsigned int t = 0; t < 10; t++)
 
10145
          {
 
10146
            for (unsigned int u = 0; u < 10; u++)
 
10147
            {
 
10148
              dmats_old[t][u] = dmats[t][u];
 
10149
              dmats[t][u] = 0.00000000;
 
10150
            }// end loop over 'u'
 
10151
          }// end loop over 't'
 
10152
          
 
10153
          // Update dmats using an inner product.
 
10154
          if (combinations[r][s] == 0)
 
10155
          {
 
10156
          for (unsigned int t = 0; t < 10; t++)
 
10157
          {
 
10158
            for (unsigned int u = 0; u < 10; u++)
 
10159
            {
 
10160
              for (unsigned int tu = 0; tu < 10; tu++)
 
10161
              {
 
10162
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10163
              }// end loop over 'tu'
 
10164
            }// end loop over 'u'
 
10165
          }// end loop over 't'
 
10166
          }
 
10167
          
 
10168
          if (combinations[r][s] == 1)
 
10169
          {
 
10170
          for (unsigned int t = 0; t < 10; t++)
 
10171
          {
 
10172
            for (unsigned int u = 0; u < 10; u++)
 
10173
            {
 
10174
              for (unsigned int tu = 0; tu < 10; tu++)
 
10175
              {
 
10176
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10177
              }// end loop over 'tu'
 
10178
            }// end loop over 'u'
 
10179
          }// end loop over 't'
 
10180
          }
 
10181
          
 
10182
          if (combinations[r][s] == 2)
 
10183
          {
 
10184
          for (unsigned int t = 0; t < 10; t++)
 
10185
          {
 
10186
            for (unsigned int u = 0; u < 10; u++)
 
10187
            {
 
10188
              for (unsigned int tu = 0; tu < 10; tu++)
 
10189
              {
 
10190
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10191
              }// end loop over 'tu'
 
10192
            }// end loop over 'u'
 
10193
          }// end loop over 't'
 
10194
          }
 
10195
          
 
10196
        }// end loop over 's'
 
10197
        for (unsigned int s = 0; s < 10; s++)
 
10198
        {
 
10199
          for (unsigned int t = 0; t < 10; t++)
 
10200
          {
 
10201
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
10202
          }// end loop over 't'
 
10203
        }// end loop over 's'
 
10204
      }// end loop over 'r'
 
10205
      
 
10206
      // Transform derivatives back to physical element
 
10207
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10208
      {
 
10209
        for (unsigned int s = 0; s < num_derivatives; s++)
 
10210
        {
 
10211
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
10212
        }// end loop over 's'
 
10213
      }// end loop over 'r'
 
10214
      
 
10215
      // Delete pointer to array of derivatives on FIAT element
 
10216
      delete [] derivatives;
 
10217
      
 
10218
      // Delete pointer to array of combinations of derivatives and transform
 
10219
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10220
      {
 
10221
        delete [] combinations[r];
 
10222
      }// end loop over 'r'
 
10223
      delete [] combinations;
 
10224
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10225
      {
 
10226
        delete [] transform[r];
 
10227
      }// end loop over 'r'
 
10228
      delete [] transform;
 
10229
        break;
 
10230
      }
 
10231
    case 11:
 
10232
      {
 
10233
        
 
10234
      // Array of basisvalues.
 
10235
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
10236
      
 
10237
      // Declare helper variables.
 
10238
      unsigned int rr = 0;
 
10239
      unsigned int ss = 0;
 
10240
      unsigned int tt = 0;
 
10241
      double tmp5 = 0.00000000;
 
10242
      double tmp6 = 0.00000000;
 
10243
      double tmp7 = 0.00000000;
 
10244
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
10245
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
10246
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
10247
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
10248
      double tmp4 = tmp3*tmp3;
 
10249
      
 
10250
      // Compute basisvalues.
 
10251
      basisvalues[0] = 1.00000000;
 
10252
      basisvalues[1] = tmp0;
 
10253
      for (unsigned int r = 1; r < 2; r++)
 
10254
      {
 
10255
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10256
        ss = r*(r + 1)*(r + 2)/6;
 
10257
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10258
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
10259
      }// end loop over 'r'
 
10260
      for (unsigned int r = 0; r < 2; r++)
 
10261
      {
 
10262
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10263
        ss = r*(r + 1)*(r + 2)/6;
 
10264
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
10265
      }// end loop over 'r'
 
10266
      for (unsigned int r = 0; r < 1; r++)
 
10267
      {
 
10268
        for (unsigned int s = 1; s < 2 - r; s++)
 
10269
        {
 
10270
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10271
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10272
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10273
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10274
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10275
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10276
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10277
        }// end loop over 's'
 
10278
      }// end loop over 'r'
 
10279
      for (unsigned int r = 0; r < 2; r++)
 
10280
      {
 
10281
        for (unsigned int s = 0; s < 2 - r; s++)
 
10282
        {
 
10283
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10284
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10285
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
10286
        }// end loop over 's'
 
10287
      }// end loop over 'r'
 
10288
      for (unsigned int r = 0; r < 1; r++)
 
10289
      {
 
10290
        for (unsigned int s = 0; s < 1 - r; s++)
 
10291
        {
 
10292
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10293
          {
 
10294
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
10295
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10296
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
10297
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10298
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10299
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10300
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10301
          }// end loop over 't'
 
10302
        }// end loop over 's'
 
10303
      }// end loop over 'r'
 
10304
      for (unsigned int r = 0; r < 3; r++)
 
10305
      {
 
10306
        for (unsigned int s = 0; s < 3 - r; s++)
 
10307
        {
 
10308
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10309
          {
 
10310
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10311
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
10312
          }// end loop over 't'
 
10313
        }// end loop over 's'
 
10314
      }// end loop over 'r'
 
10315
      
 
10316
      // Table(s) of coefficients.
 
10317
      static const double coefficients0[10] = \
 
10318
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
10319
      
 
10320
      // Tables of derivatives of the polynomial base (transpose).
 
10321
      static const double dmats0[10][10] = \
 
10322
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10323
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10324
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10325
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10326
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10327
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10328
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10329
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10330
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10331
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10332
      
 
10333
      static const double dmats1[10][10] = \
 
10334
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10335
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10336
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10337
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10338
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10339
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10340
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10341
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10342
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10343
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10344
      
 
10345
      static const double dmats2[10][10] = \
 
10346
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10347
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10348
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10349
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10350
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10351
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10352
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10353
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10354
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10355
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10356
      
 
10357
      // Compute reference derivatives.
 
10358
      // Declare pointer to array of derivatives on FIAT element.
 
10359
      double *derivatives = new double[num_derivatives];
 
10360
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10361
      {
 
10362
        derivatives[r] = 0.00000000;
 
10363
      }// end loop over 'r'
 
10364
      
 
10365
      // Declare derivative matrix (of polynomial basis).
 
10366
      double dmats[10][10] = \
 
10367
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10368
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10369
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10370
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10371
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10372
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10373
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10374
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10375
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10376
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10377
      
 
10378
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10379
      double dmats_old[10][10] = \
 
10380
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10381
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10382
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10383
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10384
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10385
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10386
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10387
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10388
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10389
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10390
      
 
10391
      // Loop possible derivatives.
 
10392
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10393
      {
 
10394
        // Resetting dmats values to compute next derivative.
 
10395
        for (unsigned int t = 0; t < 10; t++)
 
10396
        {
 
10397
          for (unsigned int u = 0; u < 10; u++)
 
10398
          {
 
10399
            dmats[t][u] = 0.00000000;
 
10400
            if (t == u)
 
10401
            {
 
10402
            dmats[t][u] = 1.00000000;
 
10403
            }
 
10404
            
 
10405
          }// end loop over 'u'
 
10406
        }// end loop over 't'
 
10407
        
 
10408
        // Looping derivative order to generate dmats.
 
10409
        for (unsigned int s = 0; s < n; s++)
 
10410
        {
 
10411
          // Updating dmats_old with new values and resetting dmats.
 
10412
          for (unsigned int t = 0; t < 10; t++)
 
10413
          {
 
10414
            for (unsigned int u = 0; u < 10; u++)
 
10415
            {
 
10416
              dmats_old[t][u] = dmats[t][u];
 
10417
              dmats[t][u] = 0.00000000;
 
10418
            }// end loop over 'u'
 
10419
          }// end loop over 't'
 
10420
          
 
10421
          // Update dmats using an inner product.
 
10422
          if (combinations[r][s] == 0)
 
10423
          {
 
10424
          for (unsigned int t = 0; t < 10; t++)
 
10425
          {
 
10426
            for (unsigned int u = 0; u < 10; u++)
 
10427
            {
 
10428
              for (unsigned int tu = 0; tu < 10; tu++)
 
10429
              {
 
10430
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10431
              }// end loop over 'tu'
 
10432
            }// end loop over 'u'
 
10433
          }// end loop over 't'
 
10434
          }
 
10435
          
 
10436
          if (combinations[r][s] == 1)
 
10437
          {
 
10438
          for (unsigned int t = 0; t < 10; t++)
 
10439
          {
 
10440
            for (unsigned int u = 0; u < 10; u++)
 
10441
            {
 
10442
              for (unsigned int tu = 0; tu < 10; tu++)
 
10443
              {
 
10444
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10445
              }// end loop over 'tu'
 
10446
            }// end loop over 'u'
 
10447
          }// end loop over 't'
 
10448
          }
 
10449
          
 
10450
          if (combinations[r][s] == 2)
 
10451
          {
 
10452
          for (unsigned int t = 0; t < 10; t++)
 
10453
          {
 
10454
            for (unsigned int u = 0; u < 10; u++)
 
10455
            {
 
10456
              for (unsigned int tu = 0; tu < 10; tu++)
 
10457
              {
 
10458
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10459
              }// end loop over 'tu'
 
10460
            }// end loop over 'u'
 
10461
          }// end loop over 't'
 
10462
          }
 
10463
          
 
10464
        }// end loop over 's'
 
10465
        for (unsigned int s = 0; s < 10; s++)
 
10466
        {
 
10467
          for (unsigned int t = 0; t < 10; t++)
 
10468
          {
 
10469
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
10470
          }// end loop over 't'
 
10471
        }// end loop over 's'
 
10472
      }// end loop over 'r'
 
10473
      
 
10474
      // Transform derivatives back to physical element
 
10475
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10476
      {
 
10477
        for (unsigned int s = 0; s < num_derivatives; s++)
 
10478
        {
 
10479
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
10480
        }// end loop over 's'
 
10481
      }// end loop over 'r'
 
10482
      
 
10483
      // Delete pointer to array of derivatives on FIAT element
 
10484
      delete [] derivatives;
 
10485
      
 
10486
      // Delete pointer to array of combinations of derivatives and transform
 
10487
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10488
      {
 
10489
        delete [] combinations[r];
 
10490
      }// end loop over 'r'
 
10491
      delete [] combinations;
 
10492
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10493
      {
 
10494
        delete [] transform[r];
 
10495
      }// end loop over 'r'
 
10496
      delete [] transform;
 
10497
        break;
 
10498
      }
 
10499
    case 12:
 
10500
      {
 
10501
        
 
10502
      // Array of basisvalues.
 
10503
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
10504
      
 
10505
      // Declare helper variables.
 
10506
      unsigned int rr = 0;
 
10507
      unsigned int ss = 0;
 
10508
      unsigned int tt = 0;
 
10509
      double tmp5 = 0.00000000;
 
10510
      double tmp6 = 0.00000000;
 
10511
      double tmp7 = 0.00000000;
 
10512
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
10513
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
10514
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
10515
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
10516
      double tmp4 = tmp3*tmp3;
 
10517
      
 
10518
      // Compute basisvalues.
 
10519
      basisvalues[0] = 1.00000000;
 
10520
      basisvalues[1] = tmp0;
 
10521
      for (unsigned int r = 1; r < 2; r++)
 
10522
      {
 
10523
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10524
        ss = r*(r + 1)*(r + 2)/6;
 
10525
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10526
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
10527
      }// end loop over 'r'
 
10528
      for (unsigned int r = 0; r < 2; r++)
 
10529
      {
 
10530
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10531
        ss = r*(r + 1)*(r + 2)/6;
 
10532
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
10533
      }// end loop over 'r'
 
10534
      for (unsigned int r = 0; r < 1; r++)
 
10535
      {
 
10536
        for (unsigned int s = 1; s < 2 - r; s++)
 
10537
        {
 
10538
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10539
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10540
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10541
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10542
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10543
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10544
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10545
        }// end loop over 's'
 
10546
      }// end loop over 'r'
 
10547
      for (unsigned int r = 0; r < 2; r++)
 
10548
      {
 
10549
        for (unsigned int s = 0; s < 2 - r; s++)
 
10550
        {
 
10551
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10552
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10553
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
10554
        }// end loop over 's'
 
10555
      }// end loop over 'r'
 
10556
      for (unsigned int r = 0; r < 1; r++)
 
10557
      {
 
10558
        for (unsigned int s = 0; s < 1 - r; s++)
 
10559
        {
 
10560
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10561
          {
 
10562
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
10563
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10564
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
10565
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10566
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10567
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10568
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10569
          }// end loop over 't'
 
10570
        }// end loop over 's'
 
10571
      }// end loop over 'r'
 
10572
      for (unsigned int r = 0; r < 3; r++)
 
10573
      {
 
10574
        for (unsigned int s = 0; s < 3 - r; s++)
 
10575
        {
 
10576
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10577
          {
 
10578
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10579
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
10580
          }// end loop over 't'
 
10581
        }// end loop over 's'
 
10582
      }// end loop over 'r'
 
10583
      
 
10584
      // Table(s) of coefficients.
 
10585
      static const double coefficients0[10] = \
 
10586
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
10587
      
 
10588
      // Tables of derivatives of the polynomial base (transpose).
 
10589
      static const double dmats0[10][10] = \
 
10590
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10591
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10592
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10593
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10594
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10595
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10596
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10597
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10598
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10599
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10600
      
 
10601
      static const double dmats1[10][10] = \
 
10602
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10603
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10604
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10605
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10606
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10607
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10608
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10609
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10610
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10611
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10612
      
 
10613
      static const double dmats2[10][10] = \
 
10614
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10615
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10616
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10617
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10618
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10619
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10620
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10621
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10622
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10623
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10624
      
 
10625
      // Compute reference derivatives.
 
10626
      // Declare pointer to array of derivatives on FIAT element.
 
10627
      double *derivatives = new double[num_derivatives];
 
10628
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10629
      {
 
10630
        derivatives[r] = 0.00000000;
 
10631
      }// end loop over 'r'
 
10632
      
 
10633
      // Declare derivative matrix (of polynomial basis).
 
10634
      double dmats[10][10] = \
 
10635
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10636
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10637
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10638
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10639
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10640
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10641
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10642
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10643
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10644
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10645
      
 
10646
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10647
      double dmats_old[10][10] = \
 
10648
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10649
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10650
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10651
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10652
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10653
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10654
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10655
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10656
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10657
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10658
      
 
10659
      // Loop possible derivatives.
 
10660
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10661
      {
 
10662
        // Resetting dmats values to compute next derivative.
 
10663
        for (unsigned int t = 0; t < 10; t++)
 
10664
        {
 
10665
          for (unsigned int u = 0; u < 10; u++)
 
10666
          {
 
10667
            dmats[t][u] = 0.00000000;
 
10668
            if (t == u)
 
10669
            {
 
10670
            dmats[t][u] = 1.00000000;
 
10671
            }
 
10672
            
 
10673
          }// end loop over 'u'
 
10674
        }// end loop over 't'
 
10675
        
 
10676
        // Looping derivative order to generate dmats.
 
10677
        for (unsigned int s = 0; s < n; s++)
 
10678
        {
 
10679
          // Updating dmats_old with new values and resetting dmats.
 
10680
          for (unsigned int t = 0; t < 10; t++)
 
10681
          {
 
10682
            for (unsigned int u = 0; u < 10; u++)
 
10683
            {
 
10684
              dmats_old[t][u] = dmats[t][u];
 
10685
              dmats[t][u] = 0.00000000;
 
10686
            }// end loop over 'u'
 
10687
          }// end loop over 't'
 
10688
          
 
10689
          // Update dmats using an inner product.
 
10690
          if (combinations[r][s] == 0)
 
10691
          {
 
10692
          for (unsigned int t = 0; t < 10; t++)
 
10693
          {
 
10694
            for (unsigned int u = 0; u < 10; u++)
 
10695
            {
 
10696
              for (unsigned int tu = 0; tu < 10; tu++)
 
10697
              {
 
10698
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10699
              }// end loop over 'tu'
 
10700
            }// end loop over 'u'
 
10701
          }// end loop over 't'
 
10702
          }
 
10703
          
 
10704
          if (combinations[r][s] == 1)
 
10705
          {
 
10706
          for (unsigned int t = 0; t < 10; t++)
 
10707
          {
 
10708
            for (unsigned int u = 0; u < 10; u++)
 
10709
            {
 
10710
              for (unsigned int tu = 0; tu < 10; tu++)
 
10711
              {
 
10712
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10713
              }// end loop over 'tu'
 
10714
            }// end loop over 'u'
 
10715
          }// end loop over 't'
 
10716
          }
 
10717
          
 
10718
          if (combinations[r][s] == 2)
 
10719
          {
 
10720
          for (unsigned int t = 0; t < 10; t++)
 
10721
          {
 
10722
            for (unsigned int u = 0; u < 10; u++)
 
10723
            {
 
10724
              for (unsigned int tu = 0; tu < 10; tu++)
 
10725
              {
 
10726
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10727
              }// end loop over 'tu'
 
10728
            }// end loop over 'u'
 
10729
          }// end loop over 't'
 
10730
          }
 
10731
          
 
10732
        }// end loop over 's'
 
10733
        for (unsigned int s = 0; s < 10; s++)
 
10734
        {
 
10735
          for (unsigned int t = 0; t < 10; t++)
 
10736
          {
 
10737
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
10738
          }// end loop over 't'
 
10739
        }// end loop over 's'
 
10740
      }// end loop over 'r'
 
10741
      
 
10742
      // Transform derivatives back to physical element
 
10743
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10744
      {
 
10745
        for (unsigned int s = 0; s < num_derivatives; s++)
 
10746
        {
 
10747
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
10748
        }// end loop over 's'
 
10749
      }// end loop over 'r'
 
10750
      
 
10751
      // Delete pointer to array of derivatives on FIAT element
 
10752
      delete [] derivatives;
 
10753
      
 
10754
      // Delete pointer to array of combinations of derivatives and transform
 
10755
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10756
      {
 
10757
        delete [] combinations[r];
 
10758
      }// end loop over 'r'
 
10759
      delete [] combinations;
 
10760
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10761
      {
 
10762
        delete [] transform[r];
 
10763
      }// end loop over 'r'
 
10764
      delete [] transform;
 
10765
        break;
 
10766
      }
 
10767
    case 13:
 
10768
      {
 
10769
        
 
10770
      // Array of basisvalues.
 
10771
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
10772
      
 
10773
      // Declare helper variables.
 
10774
      unsigned int rr = 0;
 
10775
      unsigned int ss = 0;
 
10776
      unsigned int tt = 0;
 
10777
      double tmp5 = 0.00000000;
 
10778
      double tmp6 = 0.00000000;
 
10779
      double tmp7 = 0.00000000;
 
10780
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
10781
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
10782
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
10783
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
10784
      double tmp4 = tmp3*tmp3;
 
10785
      
 
10786
      // Compute basisvalues.
 
10787
      basisvalues[0] = 1.00000000;
 
10788
      basisvalues[1] = tmp0;
 
10789
      for (unsigned int r = 1; r < 2; r++)
 
10790
      {
 
10791
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10792
        ss = r*(r + 1)*(r + 2)/6;
 
10793
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10794
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
10795
      }// end loop over 'r'
 
10796
      for (unsigned int r = 0; r < 2; r++)
 
10797
      {
 
10798
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10799
        ss = r*(r + 1)*(r + 2)/6;
 
10800
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
10801
      }// end loop over 'r'
 
10802
      for (unsigned int r = 0; r < 1; r++)
 
10803
      {
 
10804
        for (unsigned int s = 1; s < 2 - r; s++)
 
10805
        {
 
10806
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10807
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10808
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10809
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10810
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10811
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
10812
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10813
        }// end loop over 's'
 
10814
      }// end loop over 'r'
 
10815
      for (unsigned int r = 0; r < 2; r++)
 
10816
      {
 
10817
        for (unsigned int s = 0; s < 2 - r; s++)
 
10818
        {
 
10819
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10820
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10821
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
10822
        }// end loop over 's'
 
10823
      }// end loop over 'r'
 
10824
      for (unsigned int r = 0; r < 1; r++)
 
10825
      {
 
10826
        for (unsigned int s = 0; s < 1 - r; s++)
 
10827
        {
 
10828
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10829
          {
 
10830
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
10831
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10832
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
10833
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10834
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10835
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
10836
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10837
          }// end loop over 't'
 
10838
        }// end loop over 's'
 
10839
      }// end loop over 'r'
 
10840
      for (unsigned int r = 0; r < 3; r++)
 
10841
      {
 
10842
        for (unsigned int s = 0; s < 3 - r; s++)
 
10843
        {
 
10844
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10845
          {
 
10846
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10847
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
10848
          }// end loop over 't'
 
10849
        }// end loop over 's'
 
10850
      }// end loop over 'r'
 
10851
      
 
10852
      // Table(s) of coefficients.
 
10853
      static const double coefficients0[10] = \
 
10854
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
10855
      
 
10856
      // Tables of derivatives of the polynomial base (transpose).
 
10857
      static const double dmats0[10][10] = \
 
10858
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10859
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10860
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10861
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10862
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10863
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10864
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10865
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10866
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10867
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10868
      
 
10869
      static const double dmats1[10][10] = \
 
10870
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10871
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10872
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10873
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10874
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10875
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10876
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10877
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10878
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10879
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10880
      
 
10881
      static const double dmats2[10][10] = \
 
10882
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10883
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10884
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10885
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10886
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10887
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10888
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10889
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10890
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10891
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
10892
      
 
10893
      // Compute reference derivatives.
 
10894
      // Declare pointer to array of derivatives on FIAT element.
 
10895
      double *derivatives = new double[num_derivatives];
 
10896
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10897
      {
 
10898
        derivatives[r] = 0.00000000;
 
10899
      }// end loop over 'r'
 
10900
      
 
10901
      // Declare derivative matrix (of polynomial basis).
 
10902
      double dmats[10][10] = \
 
10903
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10904
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10905
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10906
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10907
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10908
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10909
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10910
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10911
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10912
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10913
      
 
10914
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10915
      double dmats_old[10][10] = \
 
10916
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10917
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10918
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10919
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10920
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10921
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10922
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
10923
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
10924
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
10925
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
10926
      
 
10927
      // Loop possible derivatives.
 
10928
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10929
      {
 
10930
        // Resetting dmats values to compute next derivative.
 
10931
        for (unsigned int t = 0; t < 10; t++)
 
10932
        {
 
10933
          for (unsigned int u = 0; u < 10; u++)
 
10934
          {
 
10935
            dmats[t][u] = 0.00000000;
 
10936
            if (t == u)
 
10937
            {
 
10938
            dmats[t][u] = 1.00000000;
 
10939
            }
 
10940
            
 
10941
          }// end loop over 'u'
 
10942
        }// end loop over 't'
 
10943
        
 
10944
        // Looping derivative order to generate dmats.
 
10945
        for (unsigned int s = 0; s < n; s++)
 
10946
        {
 
10947
          // Updating dmats_old with new values and resetting dmats.
 
10948
          for (unsigned int t = 0; t < 10; t++)
 
10949
          {
 
10950
            for (unsigned int u = 0; u < 10; u++)
 
10951
            {
 
10952
              dmats_old[t][u] = dmats[t][u];
 
10953
              dmats[t][u] = 0.00000000;
 
10954
            }// end loop over 'u'
 
10955
          }// end loop over 't'
 
10956
          
 
10957
          // Update dmats using an inner product.
 
10958
          if (combinations[r][s] == 0)
 
10959
          {
 
10960
          for (unsigned int t = 0; t < 10; t++)
 
10961
          {
 
10962
            for (unsigned int u = 0; u < 10; u++)
 
10963
            {
 
10964
              for (unsigned int tu = 0; tu < 10; tu++)
 
10965
              {
 
10966
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10967
              }// end loop over 'tu'
 
10968
            }// end loop over 'u'
 
10969
          }// end loop over 't'
 
10970
          }
 
10971
          
 
10972
          if (combinations[r][s] == 1)
 
10973
          {
 
10974
          for (unsigned int t = 0; t < 10; t++)
 
10975
          {
 
10976
            for (unsigned int u = 0; u < 10; u++)
 
10977
            {
 
10978
              for (unsigned int tu = 0; tu < 10; tu++)
 
10979
              {
 
10980
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10981
              }// end loop over 'tu'
 
10982
            }// end loop over 'u'
 
10983
          }// end loop over 't'
 
10984
          }
 
10985
          
 
10986
          if (combinations[r][s] == 2)
 
10987
          {
 
10988
          for (unsigned int t = 0; t < 10; t++)
 
10989
          {
 
10990
            for (unsigned int u = 0; u < 10; u++)
 
10991
            {
 
10992
              for (unsigned int tu = 0; tu < 10; tu++)
 
10993
              {
 
10994
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10995
              }// end loop over 'tu'
 
10996
            }// end loop over 'u'
 
10997
          }// end loop over 't'
 
10998
          }
 
10999
          
 
11000
        }// end loop over 's'
 
11001
        for (unsigned int s = 0; s < 10; s++)
 
11002
        {
 
11003
          for (unsigned int t = 0; t < 10; t++)
 
11004
          {
 
11005
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11006
          }// end loop over 't'
 
11007
        }// end loop over 's'
 
11008
      }// end loop over 'r'
 
11009
      
 
11010
      // Transform derivatives back to physical element
 
11011
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11012
      {
 
11013
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11014
        {
 
11015
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11016
        }// end loop over 's'
 
11017
      }// end loop over 'r'
 
11018
      
 
11019
      // Delete pointer to array of derivatives on FIAT element
 
11020
      delete [] derivatives;
 
11021
      
 
11022
      // Delete pointer to array of combinations of derivatives and transform
 
11023
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11024
      {
 
11025
        delete [] combinations[r];
 
11026
      }// end loop over 'r'
 
11027
      delete [] combinations;
 
11028
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11029
      {
 
11030
        delete [] transform[r];
 
11031
      }// end loop over 'r'
 
11032
      delete [] transform;
 
11033
        break;
 
11034
      }
 
11035
    case 14:
 
11036
      {
 
11037
        
 
11038
      // Array of basisvalues.
 
11039
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
11040
      
 
11041
      // Declare helper variables.
 
11042
      unsigned int rr = 0;
 
11043
      unsigned int ss = 0;
 
11044
      unsigned int tt = 0;
 
11045
      double tmp5 = 0.00000000;
 
11046
      double tmp6 = 0.00000000;
 
11047
      double tmp7 = 0.00000000;
 
11048
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
11049
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
11050
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
11051
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
11052
      double tmp4 = tmp3*tmp3;
 
11053
      
 
11054
      // Compute basisvalues.
 
11055
      basisvalues[0] = 1.00000000;
 
11056
      basisvalues[1] = tmp0;
 
11057
      for (unsigned int r = 1; r < 2; r++)
 
11058
      {
 
11059
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11060
        ss = r*(r + 1)*(r + 2)/6;
 
11061
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11062
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
11063
      }// end loop over 'r'
 
11064
      for (unsigned int r = 0; r < 2; r++)
 
11065
      {
 
11066
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11067
        ss = r*(r + 1)*(r + 2)/6;
 
11068
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
11069
      }// end loop over 'r'
 
11070
      for (unsigned int r = 0; r < 1; r++)
 
11071
      {
 
11072
        for (unsigned int s = 1; s < 2 - r; s++)
 
11073
        {
 
11074
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11075
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11076
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11077
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11078
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11079
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11080
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11081
        }// end loop over 's'
 
11082
      }// end loop over 'r'
 
11083
      for (unsigned int r = 0; r < 2; r++)
 
11084
      {
 
11085
        for (unsigned int s = 0; s < 2 - r; s++)
 
11086
        {
 
11087
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11088
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11089
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
11090
        }// end loop over 's'
 
11091
      }// end loop over 'r'
 
11092
      for (unsigned int r = 0; r < 1; r++)
 
11093
      {
 
11094
        for (unsigned int s = 0; s < 1 - r; s++)
 
11095
        {
 
11096
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11097
          {
 
11098
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
11099
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11100
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
11101
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11102
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11103
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11104
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11105
          }// end loop over 't'
 
11106
        }// end loop over 's'
 
11107
      }// end loop over 'r'
 
11108
      for (unsigned int r = 0; r < 3; r++)
 
11109
      {
 
11110
        for (unsigned int s = 0; s < 3 - r; s++)
 
11111
        {
 
11112
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11113
          {
 
11114
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11115
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
11116
          }// end loop over 't'
 
11117
        }// end loop over 's'
 
11118
      }// end loop over 'r'
 
11119
      
 
11120
      // Table(s) of coefficients.
 
11121
      static const double coefficients0[10] = \
 
11122
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
11123
      
 
11124
      // Tables of derivatives of the polynomial base (transpose).
 
11125
      static const double dmats0[10][10] = \
 
11126
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11127
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11128
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11129
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11130
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11131
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11132
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11133
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11134
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11135
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11136
      
 
11137
      static const double dmats1[10][10] = \
 
11138
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11139
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11140
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11141
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11142
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11143
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11144
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11145
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11146
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11147
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11148
      
 
11149
      static const double dmats2[10][10] = \
 
11150
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11151
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11152
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11153
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11154
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11155
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11156
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11157
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11158
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11159
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11160
      
 
11161
      // Compute reference derivatives.
 
11162
      // Declare pointer to array of derivatives on FIAT element.
 
11163
      double *derivatives = new double[num_derivatives];
 
11164
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11165
      {
 
11166
        derivatives[r] = 0.00000000;
 
11167
      }// end loop over 'r'
 
11168
      
 
11169
      // Declare derivative matrix (of polynomial basis).
 
11170
      double dmats[10][10] = \
 
11171
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11172
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11173
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11174
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11175
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11176
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11177
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11178
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11179
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11180
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11181
      
 
11182
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11183
      double dmats_old[10][10] = \
 
11184
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11185
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11186
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11187
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11188
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11189
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11190
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11191
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11192
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11193
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11194
      
 
11195
      // Loop possible derivatives.
 
11196
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11197
      {
 
11198
        // Resetting dmats values to compute next derivative.
 
11199
        for (unsigned int t = 0; t < 10; t++)
 
11200
        {
 
11201
          for (unsigned int u = 0; u < 10; u++)
 
11202
          {
 
11203
            dmats[t][u] = 0.00000000;
 
11204
            if (t == u)
 
11205
            {
 
11206
            dmats[t][u] = 1.00000000;
 
11207
            }
 
11208
            
 
11209
          }// end loop over 'u'
 
11210
        }// end loop over 't'
 
11211
        
 
11212
        // Looping derivative order to generate dmats.
 
11213
        for (unsigned int s = 0; s < n; s++)
 
11214
        {
 
11215
          // Updating dmats_old with new values and resetting dmats.
 
11216
          for (unsigned int t = 0; t < 10; t++)
 
11217
          {
 
11218
            for (unsigned int u = 0; u < 10; u++)
 
11219
            {
 
11220
              dmats_old[t][u] = dmats[t][u];
 
11221
              dmats[t][u] = 0.00000000;
 
11222
            }// end loop over 'u'
 
11223
          }// end loop over 't'
 
11224
          
 
11225
          // Update dmats using an inner product.
 
11226
          if (combinations[r][s] == 0)
 
11227
          {
 
11228
          for (unsigned int t = 0; t < 10; t++)
 
11229
          {
 
11230
            for (unsigned int u = 0; u < 10; u++)
 
11231
            {
 
11232
              for (unsigned int tu = 0; tu < 10; tu++)
 
11233
              {
 
11234
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11235
              }// end loop over 'tu'
 
11236
            }// end loop over 'u'
 
11237
          }// end loop over 't'
 
11238
          }
 
11239
          
 
11240
          if (combinations[r][s] == 1)
 
11241
          {
 
11242
          for (unsigned int t = 0; t < 10; t++)
 
11243
          {
 
11244
            for (unsigned int u = 0; u < 10; u++)
 
11245
            {
 
11246
              for (unsigned int tu = 0; tu < 10; tu++)
 
11247
              {
 
11248
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11249
              }// end loop over 'tu'
 
11250
            }// end loop over 'u'
 
11251
          }// end loop over 't'
 
11252
          }
 
11253
          
 
11254
          if (combinations[r][s] == 2)
 
11255
          {
 
11256
          for (unsigned int t = 0; t < 10; t++)
 
11257
          {
 
11258
            for (unsigned int u = 0; u < 10; u++)
 
11259
            {
 
11260
              for (unsigned int tu = 0; tu < 10; tu++)
 
11261
              {
 
11262
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11263
              }// end loop over 'tu'
 
11264
            }// end loop over 'u'
 
11265
          }// end loop over 't'
 
11266
          }
 
11267
          
 
11268
        }// end loop over 's'
 
11269
        for (unsigned int s = 0; s < 10; s++)
 
11270
        {
 
11271
          for (unsigned int t = 0; t < 10; t++)
 
11272
          {
 
11273
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11274
          }// end loop over 't'
 
11275
        }// end loop over 's'
 
11276
      }// end loop over 'r'
 
11277
      
 
11278
      // Transform derivatives back to physical element
 
11279
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11280
      {
 
11281
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11282
        {
 
11283
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11284
        }// end loop over 's'
 
11285
      }// end loop over 'r'
 
11286
      
 
11287
      // Delete pointer to array of derivatives on FIAT element
 
11288
      delete [] derivatives;
 
11289
      
 
11290
      // Delete pointer to array of combinations of derivatives and transform
 
11291
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11292
      {
 
11293
        delete [] combinations[r];
 
11294
      }// end loop over 'r'
 
11295
      delete [] combinations;
 
11296
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11297
      {
 
11298
        delete [] transform[r];
 
11299
      }// end loop over 'r'
 
11300
      delete [] transform;
 
11301
        break;
 
11302
      }
 
11303
    case 15:
 
11304
      {
 
11305
        
 
11306
      // Array of basisvalues.
 
11307
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
11308
      
 
11309
      // Declare helper variables.
 
11310
      unsigned int rr = 0;
 
11311
      unsigned int ss = 0;
 
11312
      unsigned int tt = 0;
 
11313
      double tmp5 = 0.00000000;
 
11314
      double tmp6 = 0.00000000;
 
11315
      double tmp7 = 0.00000000;
 
11316
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
11317
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
11318
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
11319
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
11320
      double tmp4 = tmp3*tmp3;
 
11321
      
 
11322
      // Compute basisvalues.
 
11323
      basisvalues[0] = 1.00000000;
 
11324
      basisvalues[1] = tmp0;
 
11325
      for (unsigned int r = 1; r < 2; r++)
 
11326
      {
 
11327
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11328
        ss = r*(r + 1)*(r + 2)/6;
 
11329
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11330
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
11331
      }// end loop over 'r'
 
11332
      for (unsigned int r = 0; r < 2; r++)
 
11333
      {
 
11334
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11335
        ss = r*(r + 1)*(r + 2)/6;
 
11336
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
11337
      }// end loop over 'r'
 
11338
      for (unsigned int r = 0; r < 1; r++)
 
11339
      {
 
11340
        for (unsigned int s = 1; s < 2 - r; s++)
 
11341
        {
 
11342
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11343
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11344
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11345
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11346
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11347
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11348
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11349
        }// end loop over 's'
 
11350
      }// end loop over 'r'
 
11351
      for (unsigned int r = 0; r < 2; r++)
 
11352
      {
 
11353
        for (unsigned int s = 0; s < 2 - r; s++)
 
11354
        {
 
11355
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11356
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11357
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
11358
        }// end loop over 's'
 
11359
      }// end loop over 'r'
 
11360
      for (unsigned int r = 0; r < 1; r++)
 
11361
      {
 
11362
        for (unsigned int s = 0; s < 1 - r; s++)
 
11363
        {
 
11364
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11365
          {
 
11366
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
11367
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11368
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
11369
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11370
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11371
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11372
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11373
          }// end loop over 't'
 
11374
        }// end loop over 's'
 
11375
      }// end loop over 'r'
 
11376
      for (unsigned int r = 0; r < 3; r++)
 
11377
      {
 
11378
        for (unsigned int s = 0; s < 3 - r; s++)
 
11379
        {
 
11380
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11381
          {
 
11382
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11383
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
11384
          }// end loop over 't'
 
11385
        }// end loop over 's'
 
11386
      }// end loop over 'r'
 
11387
      
 
11388
      // Table(s) of coefficients.
 
11389
      static const double coefficients0[10] = \
 
11390
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
11391
      
 
11392
      // Tables of derivatives of the polynomial base (transpose).
 
11393
      static const double dmats0[10][10] = \
 
11394
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11395
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11396
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11397
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11398
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11399
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11400
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11401
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11402
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11403
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11404
      
 
11405
      static const double dmats1[10][10] = \
 
11406
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11407
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11408
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11409
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11410
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11411
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11412
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11413
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11414
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11415
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11416
      
 
11417
      static const double dmats2[10][10] = \
 
11418
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11419
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11420
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11421
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11422
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11423
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11424
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11425
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11426
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11427
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11428
      
 
11429
      // Compute reference derivatives.
 
11430
      // Declare pointer to array of derivatives on FIAT element.
 
11431
      double *derivatives = new double[num_derivatives];
 
11432
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11433
      {
 
11434
        derivatives[r] = 0.00000000;
 
11435
      }// end loop over 'r'
 
11436
      
 
11437
      // Declare derivative matrix (of polynomial basis).
 
11438
      double dmats[10][10] = \
 
11439
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11440
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11441
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11442
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11443
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11444
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11445
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11446
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11447
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11448
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11449
      
 
11450
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11451
      double dmats_old[10][10] = \
 
11452
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11453
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11454
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11455
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11456
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11457
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11458
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11459
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11460
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11461
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11462
      
 
11463
      // Loop possible derivatives.
 
11464
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11465
      {
 
11466
        // Resetting dmats values to compute next derivative.
 
11467
        for (unsigned int t = 0; t < 10; t++)
 
11468
        {
 
11469
          for (unsigned int u = 0; u < 10; u++)
 
11470
          {
 
11471
            dmats[t][u] = 0.00000000;
 
11472
            if (t == u)
 
11473
            {
 
11474
            dmats[t][u] = 1.00000000;
 
11475
            }
 
11476
            
 
11477
          }// end loop over 'u'
 
11478
        }// end loop over 't'
 
11479
        
 
11480
        // Looping derivative order to generate dmats.
 
11481
        for (unsigned int s = 0; s < n; s++)
 
11482
        {
 
11483
          // Updating dmats_old with new values and resetting dmats.
 
11484
          for (unsigned int t = 0; t < 10; t++)
 
11485
          {
 
11486
            for (unsigned int u = 0; u < 10; u++)
 
11487
            {
 
11488
              dmats_old[t][u] = dmats[t][u];
 
11489
              dmats[t][u] = 0.00000000;
 
11490
            }// end loop over 'u'
 
11491
          }// end loop over 't'
 
11492
          
 
11493
          // Update dmats using an inner product.
 
11494
          if (combinations[r][s] == 0)
 
11495
          {
 
11496
          for (unsigned int t = 0; t < 10; t++)
 
11497
          {
 
11498
            for (unsigned int u = 0; u < 10; u++)
 
11499
            {
 
11500
              for (unsigned int tu = 0; tu < 10; tu++)
 
11501
              {
 
11502
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11503
              }// end loop over 'tu'
 
11504
            }// end loop over 'u'
 
11505
          }// end loop over 't'
 
11506
          }
 
11507
          
 
11508
          if (combinations[r][s] == 1)
 
11509
          {
 
11510
          for (unsigned int t = 0; t < 10; t++)
 
11511
          {
 
11512
            for (unsigned int u = 0; u < 10; u++)
 
11513
            {
 
11514
              for (unsigned int tu = 0; tu < 10; tu++)
 
11515
              {
 
11516
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11517
              }// end loop over 'tu'
 
11518
            }// end loop over 'u'
 
11519
          }// end loop over 't'
 
11520
          }
 
11521
          
 
11522
          if (combinations[r][s] == 2)
 
11523
          {
 
11524
          for (unsigned int t = 0; t < 10; t++)
 
11525
          {
 
11526
            for (unsigned int u = 0; u < 10; u++)
 
11527
            {
 
11528
              for (unsigned int tu = 0; tu < 10; tu++)
 
11529
              {
 
11530
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11531
              }// end loop over 'tu'
 
11532
            }// end loop over 'u'
 
11533
          }// end loop over 't'
 
11534
          }
 
11535
          
 
11536
        }// end loop over 's'
 
11537
        for (unsigned int s = 0; s < 10; s++)
 
11538
        {
 
11539
          for (unsigned int t = 0; t < 10; t++)
 
11540
          {
 
11541
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11542
          }// end loop over 't'
 
11543
        }// end loop over 's'
 
11544
      }// end loop over 'r'
 
11545
      
 
11546
      // Transform derivatives back to physical element
 
11547
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11548
      {
 
11549
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11550
        {
 
11551
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11552
        }// end loop over 's'
 
11553
      }// end loop over 'r'
 
11554
      
 
11555
      // Delete pointer to array of derivatives on FIAT element
 
11556
      delete [] derivatives;
 
11557
      
 
11558
      // Delete pointer to array of combinations of derivatives and transform
 
11559
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11560
      {
 
11561
        delete [] combinations[r];
 
11562
      }// end loop over 'r'
 
11563
      delete [] combinations;
 
11564
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11565
      {
 
11566
        delete [] transform[r];
 
11567
      }// end loop over 'r'
 
11568
      delete [] transform;
 
11569
        break;
 
11570
      }
 
11571
    case 16:
 
11572
      {
 
11573
        
 
11574
      // Array of basisvalues.
 
11575
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
11576
      
 
11577
      // Declare helper variables.
 
11578
      unsigned int rr = 0;
 
11579
      unsigned int ss = 0;
 
11580
      unsigned int tt = 0;
 
11581
      double tmp5 = 0.00000000;
 
11582
      double tmp6 = 0.00000000;
 
11583
      double tmp7 = 0.00000000;
 
11584
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
11585
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
11586
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
11587
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
11588
      double tmp4 = tmp3*tmp3;
 
11589
      
 
11590
      // Compute basisvalues.
 
11591
      basisvalues[0] = 1.00000000;
 
11592
      basisvalues[1] = tmp0;
 
11593
      for (unsigned int r = 1; r < 2; r++)
 
11594
      {
 
11595
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11596
        ss = r*(r + 1)*(r + 2)/6;
 
11597
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11598
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
11599
      }// end loop over 'r'
 
11600
      for (unsigned int r = 0; r < 2; r++)
 
11601
      {
 
11602
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11603
        ss = r*(r + 1)*(r + 2)/6;
 
11604
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
11605
      }// end loop over 'r'
 
11606
      for (unsigned int r = 0; r < 1; r++)
 
11607
      {
 
11608
        for (unsigned int s = 1; s < 2 - r; s++)
 
11609
        {
 
11610
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11611
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11612
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11613
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11614
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11615
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11616
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11617
        }// end loop over 's'
 
11618
      }// end loop over 'r'
 
11619
      for (unsigned int r = 0; r < 2; r++)
 
11620
      {
 
11621
        for (unsigned int s = 0; s < 2 - r; s++)
 
11622
        {
 
11623
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11624
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11625
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
11626
        }// end loop over 's'
 
11627
      }// end loop over 'r'
 
11628
      for (unsigned int r = 0; r < 1; r++)
 
11629
      {
 
11630
        for (unsigned int s = 0; s < 1 - r; s++)
 
11631
        {
 
11632
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11633
          {
 
11634
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
11635
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11636
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
11637
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11638
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11639
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11640
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11641
          }// end loop over 't'
 
11642
        }// end loop over 's'
 
11643
      }// end loop over 'r'
 
11644
      for (unsigned int r = 0; r < 3; r++)
 
11645
      {
 
11646
        for (unsigned int s = 0; s < 3 - r; s++)
 
11647
        {
 
11648
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11649
          {
 
11650
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11651
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
11652
          }// end loop over 't'
 
11653
        }// end loop over 's'
 
11654
      }// end loop over 'r'
 
11655
      
 
11656
      // Table(s) of coefficients.
 
11657
      static const double coefficients0[10] = \
 
11658
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
11659
      
 
11660
      // Tables of derivatives of the polynomial base (transpose).
 
11661
      static const double dmats0[10][10] = \
 
11662
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11663
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11664
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11665
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11666
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11667
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11668
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11669
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11670
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11671
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11672
      
 
11673
      static const double dmats1[10][10] = \
 
11674
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11675
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11676
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11677
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11678
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11679
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11680
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11681
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11682
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11683
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11684
      
 
11685
      static const double dmats2[10][10] = \
 
11686
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11687
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11688
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11689
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11690
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11691
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11692
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11693
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11694
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11695
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11696
      
 
11697
      // Compute reference derivatives.
 
11698
      // Declare pointer to array of derivatives on FIAT element.
 
11699
      double *derivatives = new double[num_derivatives];
 
11700
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11701
      {
 
11702
        derivatives[r] = 0.00000000;
 
11703
      }// end loop over 'r'
 
11704
      
 
11705
      // Declare derivative matrix (of polynomial basis).
 
11706
      double dmats[10][10] = \
 
11707
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11708
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11709
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11710
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11711
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11712
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11713
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11714
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11715
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11716
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11717
      
 
11718
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11719
      double dmats_old[10][10] = \
 
11720
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11721
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11722
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11723
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11724
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11725
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11726
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11727
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11728
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11729
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11730
      
 
11731
      // Loop possible derivatives.
 
11732
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11733
      {
 
11734
        // Resetting dmats values to compute next derivative.
 
11735
        for (unsigned int t = 0; t < 10; t++)
 
11736
        {
 
11737
          for (unsigned int u = 0; u < 10; u++)
 
11738
          {
 
11739
            dmats[t][u] = 0.00000000;
 
11740
            if (t == u)
 
11741
            {
 
11742
            dmats[t][u] = 1.00000000;
 
11743
            }
 
11744
            
 
11745
          }// end loop over 'u'
 
11746
        }// end loop over 't'
 
11747
        
 
11748
        // Looping derivative order to generate dmats.
 
11749
        for (unsigned int s = 0; s < n; s++)
 
11750
        {
 
11751
          // Updating dmats_old with new values and resetting dmats.
 
11752
          for (unsigned int t = 0; t < 10; t++)
 
11753
          {
 
11754
            for (unsigned int u = 0; u < 10; u++)
 
11755
            {
 
11756
              dmats_old[t][u] = dmats[t][u];
 
11757
              dmats[t][u] = 0.00000000;
 
11758
            }// end loop over 'u'
 
11759
          }// end loop over 't'
 
11760
          
 
11761
          // Update dmats using an inner product.
 
11762
          if (combinations[r][s] == 0)
 
11763
          {
 
11764
          for (unsigned int t = 0; t < 10; t++)
 
11765
          {
 
11766
            for (unsigned int u = 0; u < 10; u++)
 
11767
            {
 
11768
              for (unsigned int tu = 0; tu < 10; tu++)
 
11769
              {
 
11770
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11771
              }// end loop over 'tu'
 
11772
            }// end loop over 'u'
 
11773
          }// end loop over 't'
 
11774
          }
 
11775
          
 
11776
          if (combinations[r][s] == 1)
 
11777
          {
 
11778
          for (unsigned int t = 0; t < 10; t++)
 
11779
          {
 
11780
            for (unsigned int u = 0; u < 10; u++)
 
11781
            {
 
11782
              for (unsigned int tu = 0; tu < 10; tu++)
 
11783
              {
 
11784
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11785
              }// end loop over 'tu'
 
11786
            }// end loop over 'u'
 
11787
          }// end loop over 't'
 
11788
          }
 
11789
          
 
11790
          if (combinations[r][s] == 2)
 
11791
          {
 
11792
          for (unsigned int t = 0; t < 10; t++)
 
11793
          {
 
11794
            for (unsigned int u = 0; u < 10; u++)
 
11795
            {
 
11796
              for (unsigned int tu = 0; tu < 10; tu++)
 
11797
              {
 
11798
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11799
              }// end loop over 'tu'
 
11800
            }// end loop over 'u'
 
11801
          }// end loop over 't'
 
11802
          }
 
11803
          
 
11804
        }// end loop over 's'
 
11805
        for (unsigned int s = 0; s < 10; s++)
 
11806
        {
 
11807
          for (unsigned int t = 0; t < 10; t++)
 
11808
          {
 
11809
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11810
          }// end loop over 't'
 
11811
        }// end loop over 's'
 
11812
      }// end loop over 'r'
 
11813
      
 
11814
      // Transform derivatives back to physical element
 
11815
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11816
      {
 
11817
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11818
        {
 
11819
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11820
        }// end loop over 's'
 
11821
      }// end loop over 'r'
 
11822
      
 
11823
      // Delete pointer to array of derivatives on FIAT element
 
11824
      delete [] derivatives;
 
11825
      
 
11826
      // Delete pointer to array of combinations of derivatives and transform
 
11827
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11828
      {
 
11829
        delete [] combinations[r];
 
11830
      }// end loop over 'r'
 
11831
      delete [] combinations;
 
11832
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11833
      {
 
11834
        delete [] transform[r];
 
11835
      }// end loop over 'r'
 
11836
      delete [] transform;
 
11837
        break;
 
11838
      }
 
11839
    case 17:
 
11840
      {
 
11841
        
 
11842
      // Array of basisvalues.
 
11843
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
11844
      
 
11845
      // Declare helper variables.
 
11846
      unsigned int rr = 0;
 
11847
      unsigned int ss = 0;
 
11848
      unsigned int tt = 0;
 
11849
      double tmp5 = 0.00000000;
 
11850
      double tmp6 = 0.00000000;
 
11851
      double tmp7 = 0.00000000;
 
11852
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
11853
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
11854
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
11855
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
11856
      double tmp4 = tmp3*tmp3;
 
11857
      
 
11858
      // Compute basisvalues.
 
11859
      basisvalues[0] = 1.00000000;
 
11860
      basisvalues[1] = tmp0;
 
11861
      for (unsigned int r = 1; r < 2; r++)
 
11862
      {
 
11863
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11864
        ss = r*(r + 1)*(r + 2)/6;
 
11865
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11866
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
11867
      }// end loop over 'r'
 
11868
      for (unsigned int r = 0; r < 2; r++)
 
11869
      {
 
11870
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11871
        ss = r*(r + 1)*(r + 2)/6;
 
11872
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
11873
      }// end loop over 'r'
 
11874
      for (unsigned int r = 0; r < 1; r++)
 
11875
      {
 
11876
        for (unsigned int s = 1; s < 2 - r; s++)
 
11877
        {
 
11878
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11879
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11880
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11881
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11882
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11883
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
11884
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11885
        }// end loop over 's'
 
11886
      }// end loop over 'r'
 
11887
      for (unsigned int r = 0; r < 2; r++)
 
11888
      {
 
11889
        for (unsigned int s = 0; s < 2 - r; s++)
 
11890
        {
 
11891
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11892
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11893
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
11894
        }// end loop over 's'
 
11895
      }// end loop over 'r'
 
11896
      for (unsigned int r = 0; r < 1; r++)
 
11897
      {
 
11898
        for (unsigned int s = 0; s < 1 - r; s++)
 
11899
        {
 
11900
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11901
          {
 
11902
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
11903
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11904
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
11905
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11906
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11907
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
11908
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11909
          }// end loop over 't'
 
11910
        }// end loop over 's'
 
11911
      }// end loop over 'r'
 
11912
      for (unsigned int r = 0; r < 3; r++)
 
11913
      {
 
11914
        for (unsigned int s = 0; s < 3 - r; s++)
 
11915
        {
 
11916
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11917
          {
 
11918
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11919
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
11920
          }// end loop over 't'
 
11921
        }// end loop over 's'
 
11922
      }// end loop over 'r'
 
11923
      
 
11924
      // Table(s) of coefficients.
 
11925
      static const double coefficients0[10] = \
 
11926
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
11927
      
 
11928
      // Tables of derivatives of the polynomial base (transpose).
 
11929
      static const double dmats0[10][10] = \
 
11930
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11931
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11932
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11933
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11934
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11935
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11936
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11937
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11938
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11939
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11940
      
 
11941
      static const double dmats1[10][10] = \
 
11942
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11943
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11944
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11945
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11946
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11947
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11948
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11949
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11950
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11951
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11952
      
 
11953
      static const double dmats2[10][10] = \
 
11954
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11955
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11956
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11957
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11958
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11959
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11960
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11961
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11962
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11963
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
11964
      
 
11965
      // Compute reference derivatives.
 
11966
      // Declare pointer to array of derivatives on FIAT element.
 
11967
      double *derivatives = new double[num_derivatives];
 
11968
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11969
      {
 
11970
        derivatives[r] = 0.00000000;
 
11971
      }// end loop over 'r'
 
11972
      
 
11973
      // Declare derivative matrix (of polynomial basis).
 
11974
      double dmats[10][10] = \
 
11975
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11976
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11977
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11978
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11979
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11980
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11981
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11982
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11983
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11984
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11985
      
 
11986
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11987
      double dmats_old[10][10] = \
 
11988
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11989
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11990
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11991
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11992
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11993
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11994
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
11995
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
11996
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
11997
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
11998
      
 
11999
      // Loop possible derivatives.
 
12000
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12001
      {
 
12002
        // Resetting dmats values to compute next derivative.
 
12003
        for (unsigned int t = 0; t < 10; t++)
 
12004
        {
 
12005
          for (unsigned int u = 0; u < 10; u++)
 
12006
          {
 
12007
            dmats[t][u] = 0.00000000;
 
12008
            if (t == u)
 
12009
            {
 
12010
            dmats[t][u] = 1.00000000;
 
12011
            }
 
12012
            
 
12013
          }// end loop over 'u'
 
12014
        }// end loop over 't'
 
12015
        
 
12016
        // Looping derivative order to generate dmats.
 
12017
        for (unsigned int s = 0; s < n; s++)
 
12018
        {
 
12019
          // Updating dmats_old with new values and resetting dmats.
 
12020
          for (unsigned int t = 0; t < 10; t++)
 
12021
          {
 
12022
            for (unsigned int u = 0; u < 10; u++)
 
12023
            {
 
12024
              dmats_old[t][u] = dmats[t][u];
 
12025
              dmats[t][u] = 0.00000000;
 
12026
            }// end loop over 'u'
 
12027
          }// end loop over 't'
 
12028
          
 
12029
          // Update dmats using an inner product.
 
12030
          if (combinations[r][s] == 0)
 
12031
          {
 
12032
          for (unsigned int t = 0; t < 10; t++)
 
12033
          {
 
12034
            for (unsigned int u = 0; u < 10; u++)
 
12035
            {
 
12036
              for (unsigned int tu = 0; tu < 10; tu++)
 
12037
              {
 
12038
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12039
              }// end loop over 'tu'
 
12040
            }// end loop over 'u'
 
12041
          }// end loop over 't'
 
12042
          }
 
12043
          
 
12044
          if (combinations[r][s] == 1)
 
12045
          {
 
12046
          for (unsigned int t = 0; t < 10; t++)
 
12047
          {
 
12048
            for (unsigned int u = 0; u < 10; u++)
 
12049
            {
 
12050
              for (unsigned int tu = 0; tu < 10; tu++)
 
12051
              {
 
12052
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12053
              }// end loop over 'tu'
 
12054
            }// end loop over 'u'
 
12055
          }// end loop over 't'
 
12056
          }
 
12057
          
 
12058
          if (combinations[r][s] == 2)
 
12059
          {
 
12060
          for (unsigned int t = 0; t < 10; t++)
 
12061
          {
 
12062
            for (unsigned int u = 0; u < 10; u++)
 
12063
            {
 
12064
              for (unsigned int tu = 0; tu < 10; tu++)
 
12065
              {
 
12066
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12067
              }// end loop over 'tu'
 
12068
            }// end loop over 'u'
 
12069
          }// end loop over 't'
 
12070
          }
 
12071
          
 
12072
        }// end loop over 's'
 
12073
        for (unsigned int s = 0; s < 10; s++)
 
12074
        {
 
12075
          for (unsigned int t = 0; t < 10; t++)
 
12076
          {
 
12077
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12078
          }// end loop over 't'
 
12079
        }// end loop over 's'
 
12080
      }// end loop over 'r'
 
12081
      
 
12082
      // Transform derivatives back to physical element
 
12083
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12084
      {
 
12085
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12086
        {
 
12087
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
12088
        }// end loop over 's'
 
12089
      }// end loop over 'r'
 
12090
      
 
12091
      // Delete pointer to array of derivatives on FIAT element
 
12092
      delete [] derivatives;
 
12093
      
 
12094
      // Delete pointer to array of combinations of derivatives and transform
 
12095
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12096
      {
 
12097
        delete [] combinations[r];
 
12098
      }// end loop over 'r'
 
12099
      delete [] combinations;
 
12100
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12101
      {
 
12102
        delete [] transform[r];
 
12103
      }// end loop over 'r'
 
12104
      delete [] transform;
 
12105
        break;
 
12106
      }
 
12107
    case 18:
 
12108
      {
 
12109
        
 
12110
      // Array of basisvalues.
 
12111
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
12112
      
 
12113
      // Declare helper variables.
 
12114
      unsigned int rr = 0;
 
12115
      unsigned int ss = 0;
 
12116
      unsigned int tt = 0;
 
12117
      double tmp5 = 0.00000000;
 
12118
      double tmp6 = 0.00000000;
 
12119
      double tmp7 = 0.00000000;
 
12120
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
12121
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
12122
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
12123
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
12124
      double tmp4 = tmp3*tmp3;
 
12125
      
 
12126
      // Compute basisvalues.
 
12127
      basisvalues[0] = 1.00000000;
 
12128
      basisvalues[1] = tmp0;
 
12129
      for (unsigned int r = 1; r < 2; r++)
 
12130
      {
 
12131
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12132
        ss = r*(r + 1)*(r + 2)/6;
 
12133
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12134
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
12135
      }// end loop over 'r'
 
12136
      for (unsigned int r = 0; r < 2; r++)
 
12137
      {
 
12138
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12139
        ss = r*(r + 1)*(r + 2)/6;
 
12140
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
12141
      }// end loop over 'r'
 
12142
      for (unsigned int r = 0; r < 1; r++)
 
12143
      {
 
12144
        for (unsigned int s = 1; s < 2 - r; s++)
 
12145
        {
 
12146
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12147
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12148
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12149
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12150
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12151
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12152
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12153
        }// end loop over 's'
 
12154
      }// end loop over 'r'
 
12155
      for (unsigned int r = 0; r < 2; r++)
 
12156
      {
 
12157
        for (unsigned int s = 0; s < 2 - r; s++)
 
12158
        {
 
12159
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12160
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12161
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
12162
        }// end loop over 's'
 
12163
      }// end loop over 'r'
 
12164
      for (unsigned int r = 0; r < 1; r++)
 
12165
      {
 
12166
        for (unsigned int s = 0; s < 1 - r; s++)
 
12167
        {
 
12168
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12169
          {
 
12170
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
12171
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12172
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
12173
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12174
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12175
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12176
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12177
          }// end loop over 't'
 
12178
        }// end loop over 's'
 
12179
      }// end loop over 'r'
 
12180
      for (unsigned int r = 0; r < 3; r++)
 
12181
      {
 
12182
        for (unsigned int s = 0; s < 3 - r; s++)
 
12183
        {
 
12184
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12185
          {
 
12186
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12187
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
12188
          }// end loop over 't'
 
12189
        }// end loop over 's'
 
12190
      }// end loop over 'r'
 
12191
      
 
12192
      // Table(s) of coefficients.
 
12193
      static const double coefficients0[10] = \
 
12194
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
12195
      
 
12196
      // Tables of derivatives of the polynomial base (transpose).
 
12197
      static const double dmats0[10][10] = \
 
12198
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12199
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12200
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12201
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12202
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12203
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12204
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12205
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12206
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12207
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12208
      
 
12209
      static const double dmats1[10][10] = \
 
12210
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12211
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12212
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12213
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12214
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12215
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12216
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12217
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12218
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12219
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12220
      
 
12221
      static const double dmats2[10][10] = \
 
12222
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12223
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12224
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12225
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12226
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12227
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12228
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12229
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12230
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12231
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12232
      
 
12233
      // Compute reference derivatives.
 
12234
      // Declare pointer to array of derivatives on FIAT element.
 
12235
      double *derivatives = new double[num_derivatives];
 
12236
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12237
      {
 
12238
        derivatives[r] = 0.00000000;
 
12239
      }// end loop over 'r'
 
12240
      
 
12241
      // Declare derivative matrix (of polynomial basis).
 
12242
      double dmats[10][10] = \
 
12243
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12244
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12245
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12246
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12247
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12248
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12249
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12250
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
12251
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
12252
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
12253
      
 
12254
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12255
      double dmats_old[10][10] = \
 
12256
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12257
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12258
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12259
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12260
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12261
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12262
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12263
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
12264
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
12265
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
12266
      
 
12267
      // Loop possible derivatives.
 
12268
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12269
      {
 
12270
        // Resetting dmats values to compute next derivative.
 
12271
        for (unsigned int t = 0; t < 10; t++)
 
12272
        {
 
12273
          for (unsigned int u = 0; u < 10; u++)
 
12274
          {
 
12275
            dmats[t][u] = 0.00000000;
 
12276
            if (t == u)
 
12277
            {
 
12278
            dmats[t][u] = 1.00000000;
 
12279
            }
 
12280
            
 
12281
          }// end loop over 'u'
 
12282
        }// end loop over 't'
 
12283
        
 
12284
        // Looping derivative order to generate dmats.
 
12285
        for (unsigned int s = 0; s < n; s++)
 
12286
        {
 
12287
          // Updating dmats_old with new values and resetting dmats.
 
12288
          for (unsigned int t = 0; t < 10; t++)
 
12289
          {
 
12290
            for (unsigned int u = 0; u < 10; u++)
 
12291
            {
 
12292
              dmats_old[t][u] = dmats[t][u];
 
12293
              dmats[t][u] = 0.00000000;
 
12294
            }// end loop over 'u'
 
12295
          }// end loop over 't'
 
12296
          
 
12297
          // Update dmats using an inner product.
 
12298
          if (combinations[r][s] == 0)
 
12299
          {
 
12300
          for (unsigned int t = 0; t < 10; t++)
 
12301
          {
 
12302
            for (unsigned int u = 0; u < 10; u++)
 
12303
            {
 
12304
              for (unsigned int tu = 0; tu < 10; tu++)
 
12305
              {
 
12306
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12307
              }// end loop over 'tu'
 
12308
            }// end loop over 'u'
 
12309
          }// end loop over 't'
 
12310
          }
 
12311
          
 
12312
          if (combinations[r][s] == 1)
 
12313
          {
 
12314
          for (unsigned int t = 0; t < 10; t++)
 
12315
          {
 
12316
            for (unsigned int u = 0; u < 10; u++)
 
12317
            {
 
12318
              for (unsigned int tu = 0; tu < 10; tu++)
 
12319
              {
 
12320
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12321
              }// end loop over 'tu'
 
12322
            }// end loop over 'u'
 
12323
          }// end loop over 't'
 
12324
          }
 
12325
          
 
12326
          if (combinations[r][s] == 2)
 
12327
          {
 
12328
          for (unsigned int t = 0; t < 10; t++)
 
12329
          {
 
12330
            for (unsigned int u = 0; u < 10; u++)
 
12331
            {
 
12332
              for (unsigned int tu = 0; tu < 10; tu++)
 
12333
              {
 
12334
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12335
              }// end loop over 'tu'
 
12336
            }// end loop over 'u'
 
12337
          }// end loop over 't'
 
12338
          }
 
12339
          
 
12340
        }// end loop over 's'
 
12341
        for (unsigned int s = 0; s < 10; s++)
 
12342
        {
 
12343
          for (unsigned int t = 0; t < 10; t++)
 
12344
          {
 
12345
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12346
          }// end loop over 't'
 
12347
        }// end loop over 's'
 
12348
      }// end loop over 'r'
 
12349
      
 
12350
      // Transform derivatives back to physical element
 
12351
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12352
      {
 
12353
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12354
        {
 
12355
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
12356
        }// end loop over 's'
 
12357
      }// end loop over 'r'
 
12358
      
 
12359
      // Delete pointer to array of derivatives on FIAT element
 
12360
      delete [] derivatives;
 
12361
      
 
12362
      // Delete pointer to array of combinations of derivatives and transform
 
12363
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12364
      {
 
12365
        delete [] combinations[r];
 
12366
      }// end loop over 'r'
 
12367
      delete [] combinations;
 
12368
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12369
      {
 
12370
        delete [] transform[r];
 
12371
      }// end loop over 'r'
 
12372
      delete [] transform;
 
12373
        break;
 
12374
      }
 
12375
    case 19:
 
12376
      {
 
12377
        
 
12378
      // Array of basisvalues.
 
12379
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
12380
      
 
12381
      // Declare helper variables.
 
12382
      unsigned int rr = 0;
 
12383
      unsigned int ss = 0;
 
12384
      unsigned int tt = 0;
 
12385
      double tmp5 = 0.00000000;
 
12386
      double tmp6 = 0.00000000;
 
12387
      double tmp7 = 0.00000000;
 
12388
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
12389
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
12390
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
12391
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
12392
      double tmp4 = tmp3*tmp3;
 
12393
      
 
12394
      // Compute basisvalues.
 
12395
      basisvalues[0] = 1.00000000;
 
12396
      basisvalues[1] = tmp0;
 
12397
      for (unsigned int r = 1; r < 2; r++)
 
12398
      {
 
12399
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12400
        ss = r*(r + 1)*(r + 2)/6;
 
12401
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12402
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
12403
      }// end loop over 'r'
 
12404
      for (unsigned int r = 0; r < 2; r++)
 
12405
      {
 
12406
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12407
        ss = r*(r + 1)*(r + 2)/6;
 
12408
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
12409
      }// end loop over 'r'
 
12410
      for (unsigned int r = 0; r < 1; r++)
 
12411
      {
 
12412
        for (unsigned int s = 1; s < 2 - r; s++)
 
12413
        {
 
12414
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12415
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12416
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12417
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12418
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12419
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12420
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12421
        }// end loop over 's'
 
12422
      }// end loop over 'r'
 
12423
      for (unsigned int r = 0; r < 2; r++)
 
12424
      {
 
12425
        for (unsigned int s = 0; s < 2 - r; s++)
 
12426
        {
 
12427
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12428
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12429
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
12430
        }// end loop over 's'
 
12431
      }// end loop over 'r'
 
12432
      for (unsigned int r = 0; r < 1; r++)
 
12433
      {
 
12434
        for (unsigned int s = 0; s < 1 - r; s++)
 
12435
        {
 
12436
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12437
          {
 
12438
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
12439
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12440
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
12441
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12442
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12443
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12444
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12445
          }// end loop over 't'
 
12446
        }// end loop over 's'
 
12447
      }// end loop over 'r'
 
12448
      for (unsigned int r = 0; r < 3; r++)
 
12449
      {
 
12450
        for (unsigned int s = 0; s < 3 - r; s++)
 
12451
        {
 
12452
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12453
          {
 
12454
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12455
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
12456
          }// end loop over 't'
 
12457
        }// end loop over 's'
 
12458
      }// end loop over 'r'
 
12459
      
 
12460
      // Table(s) of coefficients.
 
12461
      static const double coefficients0[10] = \
 
12462
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
12463
      
 
12464
      // Tables of derivatives of the polynomial base (transpose).
 
12465
      static const double dmats0[10][10] = \
 
12466
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12467
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12468
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12469
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12470
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12471
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12472
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12473
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12474
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12475
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12476
      
 
12477
      static const double dmats1[10][10] = \
 
12478
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12479
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12480
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12481
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12482
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12483
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12484
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12485
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12486
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12487
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12488
      
 
12489
      static const double dmats2[10][10] = \
 
12490
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12491
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12492
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12493
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12494
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12495
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12496
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12497
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12498
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12499
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12500
      
 
12501
      // Compute reference derivatives.
 
12502
      // Declare pointer to array of derivatives on FIAT element.
 
12503
      double *derivatives = new double[num_derivatives];
 
12504
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12505
      {
 
12506
        derivatives[r] = 0.00000000;
 
12507
      }// end loop over 'r'
 
12508
      
 
12509
      // Declare derivative matrix (of polynomial basis).
 
12510
      double dmats[10][10] = \
 
12511
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12512
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12513
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12514
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12515
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12516
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12517
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12518
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
12519
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
12520
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
12521
      
 
12522
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12523
      double dmats_old[10][10] = \
 
12524
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12525
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12526
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12527
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12528
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12529
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12530
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12531
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
12532
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
12533
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
12534
      
 
12535
      // Loop possible derivatives.
 
12536
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12537
      {
 
12538
        // Resetting dmats values to compute next derivative.
 
12539
        for (unsigned int t = 0; t < 10; t++)
 
12540
        {
 
12541
          for (unsigned int u = 0; u < 10; u++)
 
12542
          {
 
12543
            dmats[t][u] = 0.00000000;
 
12544
            if (t == u)
 
12545
            {
 
12546
            dmats[t][u] = 1.00000000;
 
12547
            }
 
12548
            
 
12549
          }// end loop over 'u'
 
12550
        }// end loop over 't'
 
12551
        
 
12552
        // Looping derivative order to generate dmats.
 
12553
        for (unsigned int s = 0; s < n; s++)
 
12554
        {
 
12555
          // Updating dmats_old with new values and resetting dmats.
 
12556
          for (unsigned int t = 0; t < 10; t++)
 
12557
          {
 
12558
            for (unsigned int u = 0; u < 10; u++)
 
12559
            {
 
12560
              dmats_old[t][u] = dmats[t][u];
 
12561
              dmats[t][u] = 0.00000000;
 
12562
            }// end loop over 'u'
 
12563
          }// end loop over 't'
 
12564
          
 
12565
          // Update dmats using an inner product.
 
12566
          if (combinations[r][s] == 0)
 
12567
          {
 
12568
          for (unsigned int t = 0; t < 10; t++)
 
12569
          {
 
12570
            for (unsigned int u = 0; u < 10; u++)
 
12571
            {
 
12572
              for (unsigned int tu = 0; tu < 10; tu++)
 
12573
              {
 
12574
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12575
              }// end loop over 'tu'
 
12576
            }// end loop over 'u'
 
12577
          }// end loop over 't'
 
12578
          }
 
12579
          
 
12580
          if (combinations[r][s] == 1)
 
12581
          {
 
12582
          for (unsigned int t = 0; t < 10; t++)
 
12583
          {
 
12584
            for (unsigned int u = 0; u < 10; u++)
 
12585
            {
 
12586
              for (unsigned int tu = 0; tu < 10; tu++)
 
12587
              {
 
12588
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12589
              }// end loop over 'tu'
 
12590
            }// end loop over 'u'
 
12591
          }// end loop over 't'
 
12592
          }
 
12593
          
 
12594
          if (combinations[r][s] == 2)
 
12595
          {
 
12596
          for (unsigned int t = 0; t < 10; t++)
 
12597
          {
 
12598
            for (unsigned int u = 0; u < 10; u++)
 
12599
            {
 
12600
              for (unsigned int tu = 0; tu < 10; tu++)
 
12601
              {
 
12602
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12603
              }// end loop over 'tu'
 
12604
            }// end loop over 'u'
 
12605
          }// end loop over 't'
 
12606
          }
 
12607
          
 
12608
        }// end loop over 's'
 
12609
        for (unsigned int s = 0; s < 10; s++)
 
12610
        {
 
12611
          for (unsigned int t = 0; t < 10; t++)
 
12612
          {
 
12613
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12614
          }// end loop over 't'
 
12615
        }// end loop over 's'
 
12616
      }// end loop over 'r'
 
12617
      
 
12618
      // Transform derivatives back to physical element
 
12619
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12620
      {
 
12621
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12622
        {
 
12623
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
12624
        }// end loop over 's'
 
12625
      }// end loop over 'r'
 
12626
      
 
12627
      // Delete pointer to array of derivatives on FIAT element
 
12628
      delete [] derivatives;
 
12629
      
 
12630
      // Delete pointer to array of combinations of derivatives and transform
 
12631
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12632
      {
 
12633
        delete [] combinations[r];
 
12634
      }// end loop over 'r'
 
12635
      delete [] combinations;
 
12636
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12637
      {
 
12638
        delete [] transform[r];
 
12639
      }// end loop over 'r'
 
12640
      delete [] transform;
 
12641
        break;
 
12642
      }
 
12643
    case 20:
 
12644
      {
 
12645
        
 
12646
      // Array of basisvalues.
 
12647
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
12648
      
 
12649
      // Declare helper variables.
 
12650
      unsigned int rr = 0;
 
12651
      unsigned int ss = 0;
 
12652
      unsigned int tt = 0;
 
12653
      double tmp5 = 0.00000000;
 
12654
      double tmp6 = 0.00000000;
 
12655
      double tmp7 = 0.00000000;
 
12656
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
12657
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
12658
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
12659
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
12660
      double tmp4 = tmp3*tmp3;
 
12661
      
 
12662
      // Compute basisvalues.
 
12663
      basisvalues[0] = 1.00000000;
 
12664
      basisvalues[1] = tmp0;
 
12665
      for (unsigned int r = 1; r < 2; r++)
 
12666
      {
 
12667
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12668
        ss = r*(r + 1)*(r + 2)/6;
 
12669
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12670
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
12671
      }// end loop over 'r'
 
12672
      for (unsigned int r = 0; r < 2; r++)
 
12673
      {
 
12674
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12675
        ss = r*(r + 1)*(r + 2)/6;
 
12676
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
12677
      }// end loop over 'r'
 
12678
      for (unsigned int r = 0; r < 1; r++)
 
12679
      {
 
12680
        for (unsigned int s = 1; s < 2 - r; s++)
 
12681
        {
 
12682
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12683
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12684
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12685
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12686
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12687
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12688
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12689
        }// end loop over 's'
 
12690
      }// end loop over 'r'
 
12691
      for (unsigned int r = 0; r < 2; r++)
 
12692
      {
 
12693
        for (unsigned int s = 0; s < 2 - r; s++)
 
12694
        {
 
12695
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12696
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12697
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
12698
        }// end loop over 's'
 
12699
      }// end loop over 'r'
 
12700
      for (unsigned int r = 0; r < 1; r++)
 
12701
      {
 
12702
        for (unsigned int s = 0; s < 1 - r; s++)
 
12703
        {
 
12704
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12705
          {
 
12706
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
12707
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12708
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
12709
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12710
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12711
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12712
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12713
          }// end loop over 't'
 
12714
        }// end loop over 's'
 
12715
      }// end loop over 'r'
 
12716
      for (unsigned int r = 0; r < 3; r++)
 
12717
      {
 
12718
        for (unsigned int s = 0; s < 3 - r; s++)
 
12719
        {
 
12720
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12721
          {
 
12722
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12723
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
12724
          }// end loop over 't'
 
12725
        }// end loop over 's'
 
12726
      }// end loop over 'r'
 
12727
      
 
12728
      // Table(s) of coefficients.
 
12729
      static const double coefficients0[10] = \
 
12730
      {-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
12731
      
 
12732
      // Tables of derivatives of the polynomial base (transpose).
 
12733
      static const double dmats0[10][10] = \
 
12734
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12735
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12736
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12737
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12738
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12739
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12740
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12741
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12742
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12743
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12744
      
 
12745
      static const double dmats1[10][10] = \
 
12746
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12747
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12748
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12749
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12750
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12751
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12752
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12753
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12754
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12755
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12756
      
 
12757
      static const double dmats2[10][10] = \
 
12758
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12759
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12760
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12761
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12762
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12763
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12764
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12765
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12766
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12767
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
12768
      
 
12769
      // Compute reference derivatives.
 
12770
      // Declare pointer to array of derivatives on FIAT element.
 
12771
      double *derivatives = new double[num_derivatives];
 
12772
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12773
      {
 
12774
        derivatives[r] = 0.00000000;
 
12775
      }// end loop over 'r'
 
12776
      
 
12777
      // Declare derivative matrix (of polynomial basis).
 
12778
      double dmats[10][10] = \
 
12779
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12780
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12781
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12782
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12783
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12784
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12785
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12786
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
12787
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
12788
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
12789
      
 
12790
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12791
      double dmats_old[10][10] = \
 
12792
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12793
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12794
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12795
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12796
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12797
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12798
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
12799
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
12800
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
12801
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
12802
      
 
12803
      // Loop possible derivatives.
 
12804
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12805
      {
 
12806
        // Resetting dmats values to compute next derivative.
 
12807
        for (unsigned int t = 0; t < 10; t++)
 
12808
        {
 
12809
          for (unsigned int u = 0; u < 10; u++)
 
12810
          {
 
12811
            dmats[t][u] = 0.00000000;
 
12812
            if (t == u)
 
12813
            {
 
12814
            dmats[t][u] = 1.00000000;
 
12815
            }
 
12816
            
 
12817
          }// end loop over 'u'
 
12818
        }// end loop over 't'
 
12819
        
 
12820
        // Looping derivative order to generate dmats.
 
12821
        for (unsigned int s = 0; s < n; s++)
 
12822
        {
 
12823
          // Updating dmats_old with new values and resetting dmats.
 
12824
          for (unsigned int t = 0; t < 10; t++)
 
12825
          {
 
12826
            for (unsigned int u = 0; u < 10; u++)
 
12827
            {
 
12828
              dmats_old[t][u] = dmats[t][u];
 
12829
              dmats[t][u] = 0.00000000;
 
12830
            }// end loop over 'u'
 
12831
          }// end loop over 't'
 
12832
          
 
12833
          // Update dmats using an inner product.
 
12834
          if (combinations[r][s] == 0)
 
12835
          {
 
12836
          for (unsigned int t = 0; t < 10; t++)
 
12837
          {
 
12838
            for (unsigned int u = 0; u < 10; u++)
 
12839
            {
 
12840
              for (unsigned int tu = 0; tu < 10; tu++)
 
12841
              {
 
12842
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12843
              }// end loop over 'tu'
 
12844
            }// end loop over 'u'
 
12845
          }// end loop over 't'
 
12846
          }
 
12847
          
 
12848
          if (combinations[r][s] == 1)
 
12849
          {
 
12850
          for (unsigned int t = 0; t < 10; t++)
 
12851
          {
 
12852
            for (unsigned int u = 0; u < 10; u++)
 
12853
            {
 
12854
              for (unsigned int tu = 0; tu < 10; tu++)
 
12855
              {
 
12856
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12857
              }// end loop over 'tu'
 
12858
            }// end loop over 'u'
 
12859
          }// end loop over 't'
 
12860
          }
 
12861
          
 
12862
          if (combinations[r][s] == 2)
 
12863
          {
 
12864
          for (unsigned int t = 0; t < 10; t++)
 
12865
          {
 
12866
            for (unsigned int u = 0; u < 10; u++)
 
12867
            {
 
12868
              for (unsigned int tu = 0; tu < 10; tu++)
 
12869
              {
 
12870
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12871
              }// end loop over 'tu'
 
12872
            }// end loop over 'u'
 
12873
          }// end loop over 't'
 
12874
          }
 
12875
          
 
12876
        }// end loop over 's'
 
12877
        for (unsigned int s = 0; s < 10; s++)
 
12878
        {
 
12879
          for (unsigned int t = 0; t < 10; t++)
 
12880
          {
 
12881
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12882
          }// end loop over 't'
 
12883
        }// end loop over 's'
 
12884
      }// end loop over 'r'
 
12885
      
 
12886
      // Transform derivatives back to physical element
 
12887
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12888
      {
 
12889
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12890
        {
 
12891
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
12892
        }// end loop over 's'
 
12893
      }// end loop over 'r'
 
12894
      
 
12895
      // Delete pointer to array of derivatives on FIAT element
 
12896
      delete [] derivatives;
 
12897
      
 
12898
      // Delete pointer to array of combinations of derivatives and transform
 
12899
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12900
      {
 
12901
        delete [] combinations[r];
 
12902
      }// end loop over 'r'
 
12903
      delete [] combinations;
 
12904
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12905
      {
 
12906
        delete [] transform[r];
 
12907
      }// end loop over 'r'
 
12908
      delete [] transform;
 
12909
        break;
 
12910
      }
 
12911
    case 21:
 
12912
      {
 
12913
        
 
12914
      // Array of basisvalues.
 
12915
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
12916
      
 
12917
      // Declare helper variables.
 
12918
      unsigned int rr = 0;
 
12919
      unsigned int ss = 0;
 
12920
      unsigned int tt = 0;
 
12921
      double tmp5 = 0.00000000;
 
12922
      double tmp6 = 0.00000000;
 
12923
      double tmp7 = 0.00000000;
 
12924
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
12925
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
12926
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
12927
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
12928
      double tmp4 = tmp3*tmp3;
 
12929
      
 
12930
      // Compute basisvalues.
 
12931
      basisvalues[0] = 1.00000000;
 
12932
      basisvalues[1] = tmp0;
 
12933
      for (unsigned int r = 1; r < 2; r++)
 
12934
      {
 
12935
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12936
        ss = r*(r + 1)*(r + 2)/6;
 
12937
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12938
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
12939
      }// end loop over 'r'
 
12940
      for (unsigned int r = 0; r < 2; r++)
 
12941
      {
 
12942
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12943
        ss = r*(r + 1)*(r + 2)/6;
 
12944
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
12945
      }// end loop over 'r'
 
12946
      for (unsigned int r = 0; r < 1; r++)
 
12947
      {
 
12948
        for (unsigned int s = 1; s < 2 - r; s++)
 
12949
        {
 
12950
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12951
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12952
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12953
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12954
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12955
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
12956
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12957
        }// end loop over 's'
 
12958
      }// end loop over 'r'
 
12959
      for (unsigned int r = 0; r < 2; r++)
 
12960
      {
 
12961
        for (unsigned int s = 0; s < 2 - r; s++)
 
12962
        {
 
12963
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12964
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12965
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
12966
        }// end loop over 's'
 
12967
      }// end loop over 'r'
 
12968
      for (unsigned int r = 0; r < 1; r++)
 
12969
      {
 
12970
        for (unsigned int s = 0; s < 1 - r; s++)
 
12971
        {
 
12972
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12973
          {
 
12974
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
12975
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12976
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
12977
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12978
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12979
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
12980
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12981
          }// end loop over 't'
 
12982
        }// end loop over 's'
 
12983
      }// end loop over 'r'
 
12984
      for (unsigned int r = 0; r < 3; r++)
 
12985
      {
 
12986
        for (unsigned int s = 0; s < 3 - r; s++)
 
12987
        {
 
12988
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12989
          {
 
12990
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12991
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
12992
          }// end loop over 't'
 
12993
        }// end loop over 's'
 
12994
      }// end loop over 'r'
 
12995
      
 
12996
      // Table(s) of coefficients.
 
12997
      static const double coefficients0[10] = \
 
12998
      {-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
 
12999
      
 
13000
      // Tables of derivatives of the polynomial base (transpose).
 
13001
      static const double dmats0[10][10] = \
 
13002
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13003
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13004
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13005
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13006
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13007
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13008
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13009
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13010
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13011
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13012
      
 
13013
      static const double dmats1[10][10] = \
 
13014
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13015
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13016
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13017
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13018
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13019
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13020
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13021
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13022
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13023
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13024
      
 
13025
      static const double dmats2[10][10] = \
 
13026
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13027
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13028
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13029
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13030
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13031
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13032
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13033
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13034
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13035
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13036
      
 
13037
      // Compute reference derivatives.
 
13038
      // Declare pointer to array of derivatives on FIAT element.
 
13039
      double *derivatives = new double[num_derivatives];
 
13040
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13041
      {
 
13042
        derivatives[r] = 0.00000000;
 
13043
      }// end loop over 'r'
 
13044
      
 
13045
      // Declare derivative matrix (of polynomial basis).
 
13046
      double dmats[10][10] = \
 
13047
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13048
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13049
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13050
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13051
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13052
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13053
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13054
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13055
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13056
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13057
      
 
13058
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13059
      double dmats_old[10][10] = \
 
13060
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13061
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13062
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13063
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13064
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13065
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13066
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13067
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13068
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13069
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13070
      
 
13071
      // Loop possible derivatives.
 
13072
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13073
      {
 
13074
        // Resetting dmats values to compute next derivative.
 
13075
        for (unsigned int t = 0; t < 10; t++)
 
13076
        {
 
13077
          for (unsigned int u = 0; u < 10; u++)
 
13078
          {
 
13079
            dmats[t][u] = 0.00000000;
 
13080
            if (t == u)
 
13081
            {
 
13082
            dmats[t][u] = 1.00000000;
 
13083
            }
 
13084
            
 
13085
          }// end loop over 'u'
 
13086
        }// end loop over 't'
 
13087
        
 
13088
        // Looping derivative order to generate dmats.
 
13089
        for (unsigned int s = 0; s < n; s++)
 
13090
        {
 
13091
          // Updating dmats_old with new values and resetting dmats.
 
13092
          for (unsigned int t = 0; t < 10; t++)
 
13093
          {
 
13094
            for (unsigned int u = 0; u < 10; u++)
 
13095
            {
 
13096
              dmats_old[t][u] = dmats[t][u];
 
13097
              dmats[t][u] = 0.00000000;
 
13098
            }// end loop over 'u'
 
13099
          }// end loop over 't'
 
13100
          
 
13101
          // Update dmats using an inner product.
 
13102
          if (combinations[r][s] == 0)
 
13103
          {
 
13104
          for (unsigned int t = 0; t < 10; t++)
 
13105
          {
 
13106
            for (unsigned int u = 0; u < 10; u++)
 
13107
            {
 
13108
              for (unsigned int tu = 0; tu < 10; tu++)
 
13109
              {
 
13110
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13111
              }// end loop over 'tu'
 
13112
            }// end loop over 'u'
 
13113
          }// end loop over 't'
 
13114
          }
 
13115
          
 
13116
          if (combinations[r][s] == 1)
 
13117
          {
 
13118
          for (unsigned int t = 0; t < 10; t++)
 
13119
          {
 
13120
            for (unsigned int u = 0; u < 10; u++)
 
13121
            {
 
13122
              for (unsigned int tu = 0; tu < 10; tu++)
 
13123
              {
 
13124
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13125
              }// end loop over 'tu'
 
13126
            }// end loop over 'u'
 
13127
          }// end loop over 't'
 
13128
          }
 
13129
          
 
13130
          if (combinations[r][s] == 2)
 
13131
          {
 
13132
          for (unsigned int t = 0; t < 10; t++)
 
13133
          {
 
13134
            for (unsigned int u = 0; u < 10; u++)
 
13135
            {
 
13136
              for (unsigned int tu = 0; tu < 10; tu++)
 
13137
              {
 
13138
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13139
              }// end loop over 'tu'
 
13140
            }// end loop over 'u'
 
13141
          }// end loop over 't'
 
13142
          }
 
13143
          
 
13144
        }// end loop over 's'
 
13145
        for (unsigned int s = 0; s < 10; s++)
 
13146
        {
 
13147
          for (unsigned int t = 0; t < 10; t++)
 
13148
          {
 
13149
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13150
          }// end loop over 't'
 
13151
        }// end loop over 's'
 
13152
      }// end loop over 'r'
 
13153
      
 
13154
      // Transform derivatives back to physical element
 
13155
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13156
      {
 
13157
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13158
        {
 
13159
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13160
        }// end loop over 's'
 
13161
      }// end loop over 'r'
 
13162
      
 
13163
      // Delete pointer to array of derivatives on FIAT element
 
13164
      delete [] derivatives;
 
13165
      
 
13166
      // Delete pointer to array of combinations of derivatives and transform
 
13167
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13168
      {
 
13169
        delete [] combinations[r];
 
13170
      }// end loop over 'r'
 
13171
      delete [] combinations;
 
13172
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13173
      {
 
13174
        delete [] transform[r];
 
13175
      }// end loop over 'r'
 
13176
      delete [] transform;
 
13177
        break;
 
13178
      }
 
13179
    case 22:
 
13180
      {
 
13181
        
 
13182
      // Array of basisvalues.
 
13183
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
13184
      
 
13185
      // Declare helper variables.
 
13186
      unsigned int rr = 0;
 
13187
      unsigned int ss = 0;
 
13188
      unsigned int tt = 0;
 
13189
      double tmp5 = 0.00000000;
 
13190
      double tmp6 = 0.00000000;
 
13191
      double tmp7 = 0.00000000;
 
13192
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
13193
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
13194
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
13195
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
13196
      double tmp4 = tmp3*tmp3;
 
13197
      
 
13198
      // Compute basisvalues.
 
13199
      basisvalues[0] = 1.00000000;
 
13200
      basisvalues[1] = tmp0;
 
13201
      for (unsigned int r = 1; r < 2; r++)
 
13202
      {
 
13203
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
13204
        ss = r*(r + 1)*(r + 2)/6;
 
13205
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
13206
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
13207
      }// end loop over 'r'
 
13208
      for (unsigned int r = 0; r < 2; r++)
 
13209
      {
 
13210
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
13211
        ss = r*(r + 1)*(r + 2)/6;
 
13212
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
13213
      }// end loop over 'r'
 
13214
      for (unsigned int r = 0; r < 1; r++)
 
13215
      {
 
13216
        for (unsigned int s = 1; s < 2 - r; s++)
 
13217
        {
 
13218
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13219
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13220
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13221
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13222
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13223
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13224
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13225
        }// end loop over 's'
 
13226
      }// end loop over 'r'
 
13227
      for (unsigned int r = 0; r < 2; r++)
 
13228
      {
 
13229
        for (unsigned int s = 0; s < 2 - r; s++)
 
13230
        {
 
13231
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13232
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13233
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
13234
        }// end loop over 's'
 
13235
      }// end loop over 'r'
 
13236
      for (unsigned int r = 0; r < 1; r++)
 
13237
      {
 
13238
        for (unsigned int s = 0; s < 1 - r; s++)
 
13239
        {
 
13240
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13241
          {
 
13242
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
13243
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13244
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
13245
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13246
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13247
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13248
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13249
          }// end loop over 't'
 
13250
        }// end loop over 's'
 
13251
      }// end loop over 'r'
 
13252
      for (unsigned int r = 0; r < 3; r++)
 
13253
      {
 
13254
        for (unsigned int s = 0; s < 3 - r; s++)
 
13255
        {
 
13256
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13257
          {
 
13258
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13259
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
13260
          }// end loop over 't'
 
13261
        }// end loop over 's'
 
13262
      }// end loop over 'r'
 
13263
      
 
13264
      // Table(s) of coefficients.
 
13265
      static const double coefficients0[10] = \
 
13266
      {-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
 
13267
      
 
13268
      // Tables of derivatives of the polynomial base (transpose).
 
13269
      static const double dmats0[10][10] = \
 
13270
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13271
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13272
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13273
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13274
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13275
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13276
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13277
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13278
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13279
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13280
      
 
13281
      static const double dmats1[10][10] = \
 
13282
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13283
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13284
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13285
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13286
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13287
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13288
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13289
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13290
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13291
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13292
      
 
13293
      static const double dmats2[10][10] = \
 
13294
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13295
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13296
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13297
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13298
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13299
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13300
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13301
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13302
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13303
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13304
      
 
13305
      // Compute reference derivatives.
 
13306
      // Declare pointer to array of derivatives on FIAT element.
 
13307
      double *derivatives = new double[num_derivatives];
 
13308
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13309
      {
 
13310
        derivatives[r] = 0.00000000;
 
13311
      }// end loop over 'r'
 
13312
      
 
13313
      // Declare derivative matrix (of polynomial basis).
 
13314
      double dmats[10][10] = \
 
13315
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13316
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13317
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13318
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13319
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13320
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13321
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13322
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13323
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13324
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13325
      
 
13326
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13327
      double dmats_old[10][10] = \
 
13328
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13329
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13330
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13331
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13332
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13333
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13334
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13335
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13336
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13337
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13338
      
 
13339
      // Loop possible derivatives.
 
13340
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13341
      {
 
13342
        // Resetting dmats values to compute next derivative.
 
13343
        for (unsigned int t = 0; t < 10; t++)
 
13344
        {
 
13345
          for (unsigned int u = 0; u < 10; u++)
 
13346
          {
 
13347
            dmats[t][u] = 0.00000000;
 
13348
            if (t == u)
 
13349
            {
 
13350
            dmats[t][u] = 1.00000000;
 
13351
            }
 
13352
            
 
13353
          }// end loop over 'u'
 
13354
        }// end loop over 't'
 
13355
        
 
13356
        // Looping derivative order to generate dmats.
 
13357
        for (unsigned int s = 0; s < n; s++)
 
13358
        {
 
13359
          // Updating dmats_old with new values and resetting dmats.
 
13360
          for (unsigned int t = 0; t < 10; t++)
 
13361
          {
 
13362
            for (unsigned int u = 0; u < 10; u++)
 
13363
            {
 
13364
              dmats_old[t][u] = dmats[t][u];
 
13365
              dmats[t][u] = 0.00000000;
 
13366
            }// end loop over 'u'
 
13367
          }// end loop over 't'
 
13368
          
 
13369
          // Update dmats using an inner product.
 
13370
          if (combinations[r][s] == 0)
 
13371
          {
 
13372
          for (unsigned int t = 0; t < 10; t++)
 
13373
          {
 
13374
            for (unsigned int u = 0; u < 10; u++)
 
13375
            {
 
13376
              for (unsigned int tu = 0; tu < 10; tu++)
 
13377
              {
 
13378
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13379
              }// end loop over 'tu'
 
13380
            }// end loop over 'u'
 
13381
          }// end loop over 't'
 
13382
          }
 
13383
          
 
13384
          if (combinations[r][s] == 1)
 
13385
          {
 
13386
          for (unsigned int t = 0; t < 10; t++)
 
13387
          {
 
13388
            for (unsigned int u = 0; u < 10; u++)
 
13389
            {
 
13390
              for (unsigned int tu = 0; tu < 10; tu++)
 
13391
              {
 
13392
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13393
              }// end loop over 'tu'
 
13394
            }// end loop over 'u'
 
13395
          }// end loop over 't'
 
13396
          }
 
13397
          
 
13398
          if (combinations[r][s] == 2)
 
13399
          {
 
13400
          for (unsigned int t = 0; t < 10; t++)
 
13401
          {
 
13402
            for (unsigned int u = 0; u < 10; u++)
 
13403
            {
 
13404
              for (unsigned int tu = 0; tu < 10; tu++)
 
13405
              {
 
13406
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13407
              }// end loop over 'tu'
 
13408
            }// end loop over 'u'
 
13409
          }// end loop over 't'
 
13410
          }
 
13411
          
 
13412
        }// end loop over 's'
 
13413
        for (unsigned int s = 0; s < 10; s++)
 
13414
        {
 
13415
          for (unsigned int t = 0; t < 10; t++)
 
13416
          {
 
13417
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13418
          }// end loop over 't'
 
13419
        }// end loop over 's'
 
13420
      }// end loop over 'r'
 
13421
      
 
13422
      // Transform derivatives back to physical element
 
13423
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13424
      {
 
13425
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13426
        {
 
13427
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13428
        }// end loop over 's'
 
13429
      }// end loop over 'r'
 
13430
      
 
13431
      // Delete pointer to array of derivatives on FIAT element
 
13432
      delete [] derivatives;
 
13433
      
 
13434
      // Delete pointer to array of combinations of derivatives and transform
 
13435
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13436
      {
 
13437
        delete [] combinations[r];
 
13438
      }// end loop over 'r'
 
13439
      delete [] combinations;
 
13440
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13441
      {
 
13442
        delete [] transform[r];
 
13443
      }// end loop over 'r'
 
13444
      delete [] transform;
 
13445
        break;
 
13446
      }
 
13447
    case 23:
 
13448
      {
 
13449
        
 
13450
      // Array of basisvalues.
 
13451
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
13452
      
 
13453
      // Declare helper variables.
 
13454
      unsigned int rr = 0;
 
13455
      unsigned int ss = 0;
 
13456
      unsigned int tt = 0;
 
13457
      double tmp5 = 0.00000000;
 
13458
      double tmp6 = 0.00000000;
 
13459
      double tmp7 = 0.00000000;
 
13460
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
13461
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
13462
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
13463
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
13464
      double tmp4 = tmp3*tmp3;
 
13465
      
 
13466
      // Compute basisvalues.
 
13467
      basisvalues[0] = 1.00000000;
 
13468
      basisvalues[1] = tmp0;
 
13469
      for (unsigned int r = 1; r < 2; r++)
 
13470
      {
 
13471
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
13472
        ss = r*(r + 1)*(r + 2)/6;
 
13473
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
13474
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
13475
      }// end loop over 'r'
 
13476
      for (unsigned int r = 0; r < 2; r++)
 
13477
      {
 
13478
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
13479
        ss = r*(r + 1)*(r + 2)/6;
 
13480
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
13481
      }// end loop over 'r'
 
13482
      for (unsigned int r = 0; r < 1; r++)
 
13483
      {
 
13484
        for (unsigned int s = 1; s < 2 - r; s++)
 
13485
        {
 
13486
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13487
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13488
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13489
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13490
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13491
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13492
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13493
        }// end loop over 's'
 
13494
      }// end loop over 'r'
 
13495
      for (unsigned int r = 0; r < 2; r++)
 
13496
      {
 
13497
        for (unsigned int s = 0; s < 2 - r; s++)
 
13498
        {
 
13499
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13500
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13501
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
13502
        }// end loop over 's'
 
13503
      }// end loop over 'r'
 
13504
      for (unsigned int r = 0; r < 1; r++)
 
13505
      {
 
13506
        for (unsigned int s = 0; s < 1 - r; s++)
 
13507
        {
 
13508
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13509
          {
 
13510
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
13511
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13512
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
13513
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13514
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13515
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13516
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13517
          }// end loop over 't'
 
13518
        }// end loop over 's'
 
13519
      }// end loop over 'r'
 
13520
      for (unsigned int r = 0; r < 3; r++)
 
13521
      {
 
13522
        for (unsigned int s = 0; s < 3 - r; s++)
 
13523
        {
 
13524
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13525
          {
 
13526
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13527
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
13528
          }// end loop over 't'
 
13529
        }// end loop over 's'
 
13530
      }// end loop over 'r'
 
13531
      
 
13532
      // Table(s) of coefficients.
 
13533
      static const double coefficients0[10] = \
 
13534
      {-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
 
13535
      
 
13536
      // Tables of derivatives of the polynomial base (transpose).
 
13537
      static const double dmats0[10][10] = \
 
13538
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13539
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13540
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13541
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13542
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13543
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13544
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13545
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13546
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13547
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13548
      
 
13549
      static const double dmats1[10][10] = \
 
13550
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13551
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13552
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13553
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13554
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13555
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13556
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13557
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13558
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13559
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13560
      
 
13561
      static const double dmats2[10][10] = \
 
13562
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13563
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13564
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13565
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13566
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13567
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13568
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13569
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13570
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13571
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13572
      
 
13573
      // Compute reference derivatives.
 
13574
      // Declare pointer to array of derivatives on FIAT element.
 
13575
      double *derivatives = new double[num_derivatives];
 
13576
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13577
      {
 
13578
        derivatives[r] = 0.00000000;
 
13579
      }// end loop over 'r'
 
13580
      
 
13581
      // Declare derivative matrix (of polynomial basis).
 
13582
      double dmats[10][10] = \
 
13583
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13584
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13585
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13586
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13587
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13588
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13589
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13590
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13591
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13592
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13593
      
 
13594
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13595
      double dmats_old[10][10] = \
 
13596
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13597
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13598
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13599
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13600
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13601
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13602
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13603
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13604
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13605
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13606
      
 
13607
      // Loop possible derivatives.
 
13608
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13609
      {
 
13610
        // Resetting dmats values to compute next derivative.
 
13611
        for (unsigned int t = 0; t < 10; t++)
 
13612
        {
 
13613
          for (unsigned int u = 0; u < 10; u++)
 
13614
          {
 
13615
            dmats[t][u] = 0.00000000;
 
13616
            if (t == u)
 
13617
            {
 
13618
            dmats[t][u] = 1.00000000;
 
13619
            }
 
13620
            
 
13621
          }// end loop over 'u'
 
13622
        }// end loop over 't'
 
13623
        
 
13624
        // Looping derivative order to generate dmats.
 
13625
        for (unsigned int s = 0; s < n; s++)
 
13626
        {
 
13627
          // Updating dmats_old with new values and resetting dmats.
 
13628
          for (unsigned int t = 0; t < 10; t++)
 
13629
          {
 
13630
            for (unsigned int u = 0; u < 10; u++)
 
13631
            {
 
13632
              dmats_old[t][u] = dmats[t][u];
 
13633
              dmats[t][u] = 0.00000000;
 
13634
            }// end loop over 'u'
 
13635
          }// end loop over 't'
 
13636
          
 
13637
          // Update dmats using an inner product.
 
13638
          if (combinations[r][s] == 0)
 
13639
          {
 
13640
          for (unsigned int t = 0; t < 10; t++)
 
13641
          {
 
13642
            for (unsigned int u = 0; u < 10; u++)
 
13643
            {
 
13644
              for (unsigned int tu = 0; tu < 10; tu++)
 
13645
              {
 
13646
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13647
              }// end loop over 'tu'
 
13648
            }// end loop over 'u'
 
13649
          }// end loop over 't'
 
13650
          }
 
13651
          
 
13652
          if (combinations[r][s] == 1)
 
13653
          {
 
13654
          for (unsigned int t = 0; t < 10; t++)
 
13655
          {
 
13656
            for (unsigned int u = 0; u < 10; u++)
 
13657
            {
 
13658
              for (unsigned int tu = 0; tu < 10; tu++)
 
13659
              {
 
13660
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13661
              }// end loop over 'tu'
 
13662
            }// end loop over 'u'
 
13663
          }// end loop over 't'
 
13664
          }
 
13665
          
 
13666
          if (combinations[r][s] == 2)
 
13667
          {
 
13668
          for (unsigned int t = 0; t < 10; t++)
 
13669
          {
 
13670
            for (unsigned int u = 0; u < 10; u++)
 
13671
            {
 
13672
              for (unsigned int tu = 0; tu < 10; tu++)
 
13673
              {
 
13674
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13675
              }// end loop over 'tu'
 
13676
            }// end loop over 'u'
 
13677
          }// end loop over 't'
 
13678
          }
 
13679
          
 
13680
        }// end loop over 's'
 
13681
        for (unsigned int s = 0; s < 10; s++)
 
13682
        {
 
13683
          for (unsigned int t = 0; t < 10; t++)
 
13684
          {
 
13685
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13686
          }// end loop over 't'
 
13687
        }// end loop over 's'
 
13688
      }// end loop over 'r'
 
13689
      
 
13690
      // Transform derivatives back to physical element
 
13691
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13692
      {
 
13693
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13694
        {
 
13695
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13696
        }// end loop over 's'
 
13697
      }// end loop over 'r'
 
13698
      
 
13699
      // Delete pointer to array of derivatives on FIAT element
 
13700
      delete [] derivatives;
 
13701
      
 
13702
      // Delete pointer to array of combinations of derivatives and transform
 
13703
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13704
      {
 
13705
        delete [] combinations[r];
 
13706
      }// end loop over 'r'
 
13707
      delete [] combinations;
 
13708
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13709
      {
 
13710
        delete [] transform[r];
 
13711
      }// end loop over 'r'
 
13712
      delete [] transform;
 
13713
        break;
 
13714
      }
 
13715
    case 24:
 
13716
      {
 
13717
        
 
13718
      // Array of basisvalues.
 
13719
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
13720
      
 
13721
      // Declare helper variables.
 
13722
      unsigned int rr = 0;
 
13723
      unsigned int ss = 0;
 
13724
      unsigned int tt = 0;
 
13725
      double tmp5 = 0.00000000;
 
13726
      double tmp6 = 0.00000000;
 
13727
      double tmp7 = 0.00000000;
 
13728
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
13729
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
13730
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
13731
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
13732
      double tmp4 = tmp3*tmp3;
 
13733
      
 
13734
      // Compute basisvalues.
 
13735
      basisvalues[0] = 1.00000000;
 
13736
      basisvalues[1] = tmp0;
 
13737
      for (unsigned int r = 1; r < 2; r++)
 
13738
      {
 
13739
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
13740
        ss = r*(r + 1)*(r + 2)/6;
 
13741
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
13742
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
13743
      }// end loop over 'r'
 
13744
      for (unsigned int r = 0; r < 2; r++)
 
13745
      {
 
13746
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
13747
        ss = r*(r + 1)*(r + 2)/6;
 
13748
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
13749
      }// end loop over 'r'
 
13750
      for (unsigned int r = 0; r < 1; r++)
 
13751
      {
 
13752
        for (unsigned int s = 1; s < 2 - r; s++)
 
13753
        {
 
13754
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13755
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13756
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13757
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13758
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13759
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
13760
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13761
        }// end loop over 's'
 
13762
      }// end loop over 'r'
 
13763
      for (unsigned int r = 0; r < 2; r++)
 
13764
      {
 
13765
        for (unsigned int s = 0; s < 2 - r; s++)
 
13766
        {
 
13767
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13768
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13769
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
13770
        }// end loop over 's'
 
13771
      }// end loop over 'r'
 
13772
      for (unsigned int r = 0; r < 1; r++)
 
13773
      {
 
13774
        for (unsigned int s = 0; s < 1 - r; s++)
 
13775
        {
 
13776
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13777
          {
 
13778
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
13779
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13780
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
13781
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13782
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13783
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
13784
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13785
          }// end loop over 't'
 
13786
        }// end loop over 's'
 
13787
      }// end loop over 'r'
 
13788
      for (unsigned int r = 0; r < 3; r++)
 
13789
      {
 
13790
        for (unsigned int s = 0; s < 3 - r; s++)
 
13791
        {
 
13792
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13793
          {
 
13794
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13795
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
13796
          }// end loop over 't'
 
13797
        }// end loop over 's'
 
13798
      }// end loop over 'r'
 
13799
      
 
13800
      // Table(s) of coefficients.
 
13801
      static const double coefficients0[10] = \
 
13802
      {0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
 
13803
      
 
13804
      // Tables of derivatives of the polynomial base (transpose).
 
13805
      static const double dmats0[10][10] = \
 
13806
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13807
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13808
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13809
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13810
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13811
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13812
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13813
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13814
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13815
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13816
      
 
13817
      static const double dmats1[10][10] = \
 
13818
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13819
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13820
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13821
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13822
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13823
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13824
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13825
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13826
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13827
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13828
      
 
13829
      static const double dmats2[10][10] = \
 
13830
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13831
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13832
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13833
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13834
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13835
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13836
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13837
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13838
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13839
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
13840
      
 
13841
      // Compute reference derivatives.
 
13842
      // Declare pointer to array of derivatives on FIAT element.
 
13843
      double *derivatives = new double[num_derivatives];
 
13844
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13845
      {
 
13846
        derivatives[r] = 0.00000000;
 
13847
      }// end loop over 'r'
 
13848
      
 
13849
      // Declare derivative matrix (of polynomial basis).
 
13850
      double dmats[10][10] = \
 
13851
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13852
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13853
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13854
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13855
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13856
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13857
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13858
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13859
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13860
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13861
      
 
13862
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13863
      double dmats_old[10][10] = \
 
13864
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13865
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13866
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13867
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13868
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13869
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13870
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
13871
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
13872
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
13873
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
13874
      
 
13875
      // Loop possible derivatives.
 
13876
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13877
      {
 
13878
        // Resetting dmats values to compute next derivative.
 
13879
        for (unsigned int t = 0; t < 10; t++)
 
13880
        {
 
13881
          for (unsigned int u = 0; u < 10; u++)
 
13882
          {
 
13883
            dmats[t][u] = 0.00000000;
 
13884
            if (t == u)
 
13885
            {
 
13886
            dmats[t][u] = 1.00000000;
 
13887
            }
 
13888
            
 
13889
          }// end loop over 'u'
 
13890
        }// end loop over 't'
 
13891
        
 
13892
        // Looping derivative order to generate dmats.
 
13893
        for (unsigned int s = 0; s < n; s++)
 
13894
        {
 
13895
          // Updating dmats_old with new values and resetting dmats.
 
13896
          for (unsigned int t = 0; t < 10; t++)
 
13897
          {
 
13898
            for (unsigned int u = 0; u < 10; u++)
 
13899
            {
 
13900
              dmats_old[t][u] = dmats[t][u];
 
13901
              dmats[t][u] = 0.00000000;
 
13902
            }// end loop over 'u'
 
13903
          }// end loop over 't'
 
13904
          
 
13905
          // Update dmats using an inner product.
 
13906
          if (combinations[r][s] == 0)
 
13907
          {
 
13908
          for (unsigned int t = 0; t < 10; t++)
 
13909
          {
 
13910
            for (unsigned int u = 0; u < 10; u++)
 
13911
            {
 
13912
              for (unsigned int tu = 0; tu < 10; tu++)
 
13913
              {
 
13914
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13915
              }// end loop over 'tu'
 
13916
            }// end loop over 'u'
 
13917
          }// end loop over 't'
 
13918
          }
 
13919
          
 
13920
          if (combinations[r][s] == 1)
 
13921
          {
 
13922
          for (unsigned int t = 0; t < 10; t++)
 
13923
          {
 
13924
            for (unsigned int u = 0; u < 10; u++)
 
13925
            {
 
13926
              for (unsigned int tu = 0; tu < 10; tu++)
 
13927
              {
 
13928
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13929
              }// end loop over 'tu'
 
13930
            }// end loop over 'u'
 
13931
          }// end loop over 't'
 
13932
          }
 
13933
          
 
13934
          if (combinations[r][s] == 2)
 
13935
          {
 
13936
          for (unsigned int t = 0; t < 10; t++)
 
13937
          {
 
13938
            for (unsigned int u = 0; u < 10; u++)
 
13939
            {
 
13940
              for (unsigned int tu = 0; tu < 10; tu++)
 
13941
              {
 
13942
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13943
              }// end loop over 'tu'
 
13944
            }// end loop over 'u'
 
13945
          }// end loop over 't'
 
13946
          }
 
13947
          
 
13948
        }// end loop over 's'
 
13949
        for (unsigned int s = 0; s < 10; s++)
 
13950
        {
 
13951
          for (unsigned int t = 0; t < 10; t++)
 
13952
          {
 
13953
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13954
          }// end loop over 't'
 
13955
        }// end loop over 's'
 
13956
      }// end loop over 'r'
 
13957
      
 
13958
      // Transform derivatives back to physical element
 
13959
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13960
      {
 
13961
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13962
        {
 
13963
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13964
        }// end loop over 's'
 
13965
      }// end loop over 'r'
 
13966
      
 
13967
      // Delete pointer to array of derivatives on FIAT element
 
13968
      delete [] derivatives;
 
13969
      
 
13970
      // Delete pointer to array of combinations of derivatives and transform
 
13971
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13972
      {
 
13973
        delete [] combinations[r];
 
13974
      }// end loop over 'r'
 
13975
      delete [] combinations;
 
13976
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13977
      {
 
13978
        delete [] transform[r];
 
13979
      }// end loop over 'r'
 
13980
      delete [] transform;
 
13981
        break;
 
13982
      }
 
13983
    case 25:
 
13984
      {
 
13985
        
 
13986
      // Array of basisvalues.
 
13987
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
13988
      
 
13989
      // Declare helper variables.
 
13990
      unsigned int rr = 0;
 
13991
      unsigned int ss = 0;
 
13992
      unsigned int tt = 0;
 
13993
      double tmp5 = 0.00000000;
 
13994
      double tmp6 = 0.00000000;
 
13995
      double tmp7 = 0.00000000;
 
13996
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
13997
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
13998
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
13999
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
14000
      double tmp4 = tmp3*tmp3;
 
14001
      
 
14002
      // Compute basisvalues.
 
14003
      basisvalues[0] = 1.00000000;
 
14004
      basisvalues[1] = tmp0;
 
14005
      for (unsigned int r = 1; r < 2; r++)
 
14006
      {
 
14007
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14008
        ss = r*(r + 1)*(r + 2)/6;
 
14009
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14010
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
14011
      }// end loop over 'r'
 
14012
      for (unsigned int r = 0; r < 2; r++)
 
14013
      {
 
14014
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14015
        ss = r*(r + 1)*(r + 2)/6;
 
14016
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
14017
      }// end loop over 'r'
 
14018
      for (unsigned int r = 0; r < 1; r++)
 
14019
      {
 
14020
        for (unsigned int s = 1; s < 2 - r; s++)
 
14021
        {
 
14022
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14023
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14024
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14025
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14026
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14027
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14028
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14029
        }// end loop over 's'
 
14030
      }// end loop over 'r'
 
14031
      for (unsigned int r = 0; r < 2; r++)
 
14032
      {
 
14033
        for (unsigned int s = 0; s < 2 - r; s++)
 
14034
        {
 
14035
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14036
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14037
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
14038
        }// end loop over 's'
 
14039
      }// end loop over 'r'
 
14040
      for (unsigned int r = 0; r < 1; r++)
 
14041
      {
 
14042
        for (unsigned int s = 0; s < 1 - r; s++)
 
14043
        {
 
14044
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14045
          {
 
14046
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
14047
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14048
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
14049
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14050
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14051
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14052
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14053
          }// end loop over 't'
 
14054
        }// end loop over 's'
 
14055
      }// end loop over 'r'
 
14056
      for (unsigned int r = 0; r < 3; r++)
 
14057
      {
 
14058
        for (unsigned int s = 0; s < 3 - r; s++)
 
14059
        {
 
14060
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14061
          {
 
14062
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14063
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
14064
          }// end loop over 't'
 
14065
        }// end loop over 's'
 
14066
      }// end loop over 'r'
 
14067
      
 
14068
      // Table(s) of coefficients.
 
14069
      static const double coefficients0[10] = \
 
14070
      {0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
14071
      
 
14072
      // Tables of derivatives of the polynomial base (transpose).
 
14073
      static const double dmats0[10][10] = \
 
14074
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14075
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14076
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14077
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14078
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14079
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14080
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14081
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14082
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14083
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14084
      
 
14085
      static const double dmats1[10][10] = \
 
14086
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14087
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14088
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14089
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14090
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14091
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14092
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14093
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14094
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14095
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14096
      
 
14097
      static const double dmats2[10][10] = \
 
14098
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14099
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14100
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14101
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14102
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14103
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14104
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14105
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14106
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14107
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14108
      
 
14109
      // Compute reference derivatives.
 
14110
      // Declare pointer to array of derivatives on FIAT element.
 
14111
      double *derivatives = new double[num_derivatives];
 
14112
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14113
      {
 
14114
        derivatives[r] = 0.00000000;
 
14115
      }// end loop over 'r'
 
14116
      
 
14117
      // Declare derivative matrix (of polynomial basis).
 
14118
      double dmats[10][10] = \
 
14119
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14120
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14121
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14122
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14123
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14124
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14125
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14126
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14127
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14128
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14129
      
 
14130
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14131
      double dmats_old[10][10] = \
 
14132
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14133
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14134
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14135
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14136
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14137
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14138
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14139
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14140
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14141
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14142
      
 
14143
      // Loop possible derivatives.
 
14144
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14145
      {
 
14146
        // Resetting dmats values to compute next derivative.
 
14147
        for (unsigned int t = 0; t < 10; t++)
 
14148
        {
 
14149
          for (unsigned int u = 0; u < 10; u++)
 
14150
          {
 
14151
            dmats[t][u] = 0.00000000;
 
14152
            if (t == u)
 
14153
            {
 
14154
            dmats[t][u] = 1.00000000;
 
14155
            }
 
14156
            
 
14157
          }// end loop over 'u'
 
14158
        }// end loop over 't'
 
14159
        
 
14160
        // Looping derivative order to generate dmats.
 
14161
        for (unsigned int s = 0; s < n; s++)
 
14162
        {
 
14163
          // Updating dmats_old with new values and resetting dmats.
 
14164
          for (unsigned int t = 0; t < 10; t++)
 
14165
          {
 
14166
            for (unsigned int u = 0; u < 10; u++)
 
14167
            {
 
14168
              dmats_old[t][u] = dmats[t][u];
 
14169
              dmats[t][u] = 0.00000000;
 
14170
            }// end loop over 'u'
 
14171
          }// end loop over 't'
 
14172
          
 
14173
          // Update dmats using an inner product.
 
14174
          if (combinations[r][s] == 0)
 
14175
          {
 
14176
          for (unsigned int t = 0; t < 10; t++)
 
14177
          {
 
14178
            for (unsigned int u = 0; u < 10; u++)
 
14179
            {
 
14180
              for (unsigned int tu = 0; tu < 10; tu++)
 
14181
              {
 
14182
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14183
              }// end loop over 'tu'
 
14184
            }// end loop over 'u'
 
14185
          }// end loop over 't'
 
14186
          }
 
14187
          
 
14188
          if (combinations[r][s] == 1)
 
14189
          {
 
14190
          for (unsigned int t = 0; t < 10; t++)
 
14191
          {
 
14192
            for (unsigned int u = 0; u < 10; u++)
 
14193
            {
 
14194
              for (unsigned int tu = 0; tu < 10; tu++)
 
14195
              {
 
14196
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
14197
              }// end loop over 'tu'
 
14198
            }// end loop over 'u'
 
14199
          }// end loop over 't'
 
14200
          }
 
14201
          
 
14202
          if (combinations[r][s] == 2)
 
14203
          {
 
14204
          for (unsigned int t = 0; t < 10; t++)
 
14205
          {
 
14206
            for (unsigned int u = 0; u < 10; u++)
 
14207
            {
 
14208
              for (unsigned int tu = 0; tu < 10; tu++)
 
14209
              {
 
14210
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
14211
              }// end loop over 'tu'
 
14212
            }// end loop over 'u'
 
14213
          }// end loop over 't'
 
14214
          }
 
14215
          
 
14216
        }// end loop over 's'
 
14217
        for (unsigned int s = 0; s < 10; s++)
 
14218
        {
 
14219
          for (unsigned int t = 0; t < 10; t++)
 
14220
          {
 
14221
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14222
          }// end loop over 't'
 
14223
        }// end loop over 's'
 
14224
      }// end loop over 'r'
 
14225
      
 
14226
      // Transform derivatives back to physical element
 
14227
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14228
      {
 
14229
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14230
        {
 
14231
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14232
        }// end loop over 's'
 
14233
      }// end loop over 'r'
 
14234
      
 
14235
      // Delete pointer to array of derivatives on FIAT element
 
14236
      delete [] derivatives;
 
14237
      
 
14238
      // Delete pointer to array of combinations of derivatives and transform
 
14239
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14240
      {
 
14241
        delete [] combinations[r];
 
14242
      }// end loop over 'r'
 
14243
      delete [] combinations;
 
14244
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14245
      {
 
14246
        delete [] transform[r];
 
14247
      }// end loop over 'r'
 
14248
      delete [] transform;
 
14249
        break;
 
14250
      }
 
14251
    case 26:
 
14252
      {
 
14253
        
 
14254
      // Array of basisvalues.
 
14255
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
14256
      
 
14257
      // Declare helper variables.
 
14258
      unsigned int rr = 0;
 
14259
      unsigned int ss = 0;
 
14260
      unsigned int tt = 0;
 
14261
      double tmp5 = 0.00000000;
 
14262
      double tmp6 = 0.00000000;
 
14263
      double tmp7 = 0.00000000;
 
14264
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
14265
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
14266
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
14267
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
14268
      double tmp4 = tmp3*tmp3;
 
14269
      
 
14270
      // Compute basisvalues.
 
14271
      basisvalues[0] = 1.00000000;
 
14272
      basisvalues[1] = tmp0;
 
14273
      for (unsigned int r = 1; r < 2; r++)
 
14274
      {
 
14275
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14276
        ss = r*(r + 1)*(r + 2)/6;
 
14277
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14278
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
14279
      }// end loop over 'r'
 
14280
      for (unsigned int r = 0; r < 2; r++)
 
14281
      {
 
14282
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14283
        ss = r*(r + 1)*(r + 2)/6;
 
14284
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
14285
      }// end loop over 'r'
 
14286
      for (unsigned int r = 0; r < 1; r++)
 
14287
      {
 
14288
        for (unsigned int s = 1; s < 2 - r; s++)
 
14289
        {
 
14290
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14291
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14292
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14293
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14294
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14295
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14296
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14297
        }// end loop over 's'
 
14298
      }// end loop over 'r'
 
14299
      for (unsigned int r = 0; r < 2; r++)
 
14300
      {
 
14301
        for (unsigned int s = 0; s < 2 - r; s++)
 
14302
        {
 
14303
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14304
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14305
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
14306
        }// end loop over 's'
 
14307
      }// end loop over 'r'
 
14308
      for (unsigned int r = 0; r < 1; r++)
 
14309
      {
 
14310
        for (unsigned int s = 0; s < 1 - r; s++)
 
14311
        {
 
14312
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14313
          {
 
14314
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
14315
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14316
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
14317
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14318
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14319
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14320
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14321
          }// end loop over 't'
 
14322
        }// end loop over 's'
 
14323
      }// end loop over 'r'
 
14324
      for (unsigned int r = 0; r < 3; r++)
 
14325
      {
 
14326
        for (unsigned int s = 0; s < 3 - r; s++)
 
14327
        {
 
14328
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14329
          {
 
14330
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14331
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
14332
          }// end loop over 't'
 
14333
        }// end loop over 's'
 
14334
      }// end loop over 'r'
 
14335
      
 
14336
      // Table(s) of coefficients.
 
14337
      static const double coefficients0[10] = \
 
14338
      {0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
14339
      
 
14340
      // Tables of derivatives of the polynomial base (transpose).
 
14341
      static const double dmats0[10][10] = \
 
14342
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14343
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14344
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14345
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14346
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14347
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14348
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14349
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14350
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14351
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14352
      
 
14353
      static const double dmats1[10][10] = \
 
14354
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14355
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14356
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14357
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14358
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14359
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14360
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14361
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14362
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14363
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14364
      
 
14365
      static const double dmats2[10][10] = \
 
14366
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14367
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14368
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14369
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14370
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14371
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14372
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14373
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14374
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14375
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14376
      
 
14377
      // Compute reference derivatives.
 
14378
      // Declare pointer to array of derivatives on FIAT element.
 
14379
      double *derivatives = new double[num_derivatives];
 
14380
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14381
      {
 
14382
        derivatives[r] = 0.00000000;
 
14383
      }// end loop over 'r'
 
14384
      
 
14385
      // Declare derivative matrix (of polynomial basis).
 
14386
      double dmats[10][10] = \
 
14387
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14388
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14389
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14390
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14391
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14392
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14393
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14394
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14395
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14396
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14397
      
 
14398
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14399
      double dmats_old[10][10] = \
 
14400
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14401
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14402
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14403
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14404
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14405
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14406
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14407
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14408
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14409
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14410
      
 
14411
      // Loop possible derivatives.
 
14412
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14413
      {
 
14414
        // Resetting dmats values to compute next derivative.
 
14415
        for (unsigned int t = 0; t < 10; t++)
 
14416
        {
 
14417
          for (unsigned int u = 0; u < 10; u++)
 
14418
          {
 
14419
            dmats[t][u] = 0.00000000;
 
14420
            if (t == u)
 
14421
            {
 
14422
            dmats[t][u] = 1.00000000;
 
14423
            }
 
14424
            
 
14425
          }// end loop over 'u'
 
14426
        }// end loop over 't'
 
14427
        
 
14428
        // Looping derivative order to generate dmats.
 
14429
        for (unsigned int s = 0; s < n; s++)
 
14430
        {
 
14431
          // Updating dmats_old with new values and resetting dmats.
 
14432
          for (unsigned int t = 0; t < 10; t++)
 
14433
          {
 
14434
            for (unsigned int u = 0; u < 10; u++)
 
14435
            {
 
14436
              dmats_old[t][u] = dmats[t][u];
 
14437
              dmats[t][u] = 0.00000000;
 
14438
            }// end loop over 'u'
 
14439
          }// end loop over 't'
 
14440
          
 
14441
          // Update dmats using an inner product.
 
14442
          if (combinations[r][s] == 0)
 
14443
          {
 
14444
          for (unsigned int t = 0; t < 10; t++)
 
14445
          {
 
14446
            for (unsigned int u = 0; u < 10; u++)
 
14447
            {
 
14448
              for (unsigned int tu = 0; tu < 10; tu++)
 
14449
              {
 
14450
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14451
              }// end loop over 'tu'
 
14452
            }// end loop over 'u'
 
14453
          }// end loop over 't'
 
14454
          }
 
14455
          
 
14456
          if (combinations[r][s] == 1)
 
14457
          {
 
14458
          for (unsigned int t = 0; t < 10; t++)
 
14459
          {
 
14460
            for (unsigned int u = 0; u < 10; u++)
 
14461
            {
 
14462
              for (unsigned int tu = 0; tu < 10; tu++)
 
14463
              {
 
14464
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
14465
              }// end loop over 'tu'
 
14466
            }// end loop over 'u'
 
14467
          }// end loop over 't'
 
14468
          }
 
14469
          
 
14470
          if (combinations[r][s] == 2)
 
14471
          {
 
14472
          for (unsigned int t = 0; t < 10; t++)
 
14473
          {
 
14474
            for (unsigned int u = 0; u < 10; u++)
 
14475
            {
 
14476
              for (unsigned int tu = 0; tu < 10; tu++)
 
14477
              {
 
14478
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
14479
              }// end loop over 'tu'
 
14480
            }// end loop over 'u'
 
14481
          }// end loop over 't'
 
14482
          }
 
14483
          
 
14484
        }// end loop over 's'
 
14485
        for (unsigned int s = 0; s < 10; s++)
 
14486
        {
 
14487
          for (unsigned int t = 0; t < 10; t++)
 
14488
          {
 
14489
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14490
          }// end loop over 't'
 
14491
        }// end loop over 's'
 
14492
      }// end loop over 'r'
 
14493
      
 
14494
      // Transform derivatives back to physical element
 
14495
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14496
      {
 
14497
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14498
        {
 
14499
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14500
        }// end loop over 's'
 
14501
      }// end loop over 'r'
 
14502
      
 
14503
      // Delete pointer to array of derivatives on FIAT element
 
14504
      delete [] derivatives;
 
14505
      
 
14506
      // Delete pointer to array of combinations of derivatives and transform
 
14507
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14508
      {
 
14509
        delete [] combinations[r];
 
14510
      }// end loop over 'r'
 
14511
      delete [] combinations;
 
14512
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14513
      {
 
14514
        delete [] transform[r];
 
14515
      }// end loop over 'r'
 
14516
      delete [] transform;
 
14517
        break;
 
14518
      }
 
14519
    case 27:
 
14520
      {
 
14521
        
 
14522
      // Array of basisvalues.
 
14523
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
14524
      
 
14525
      // Declare helper variables.
 
14526
      unsigned int rr = 0;
 
14527
      unsigned int ss = 0;
 
14528
      unsigned int tt = 0;
 
14529
      double tmp5 = 0.00000000;
 
14530
      double tmp6 = 0.00000000;
 
14531
      double tmp7 = 0.00000000;
 
14532
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
14533
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
14534
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
14535
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
14536
      double tmp4 = tmp3*tmp3;
 
14537
      
 
14538
      // Compute basisvalues.
 
14539
      basisvalues[0] = 1.00000000;
 
14540
      basisvalues[1] = tmp0;
 
14541
      for (unsigned int r = 1; r < 2; r++)
 
14542
      {
 
14543
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14544
        ss = r*(r + 1)*(r + 2)/6;
 
14545
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14546
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
14547
      }// end loop over 'r'
 
14548
      for (unsigned int r = 0; r < 2; r++)
 
14549
      {
 
14550
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14551
        ss = r*(r + 1)*(r + 2)/6;
 
14552
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
14553
      }// end loop over 'r'
 
14554
      for (unsigned int r = 0; r < 1; r++)
 
14555
      {
 
14556
        for (unsigned int s = 1; s < 2 - r; s++)
 
14557
        {
 
14558
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14559
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14560
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14561
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14562
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14563
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14564
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14565
        }// end loop over 's'
 
14566
      }// end loop over 'r'
 
14567
      for (unsigned int r = 0; r < 2; r++)
 
14568
      {
 
14569
        for (unsigned int s = 0; s < 2 - r; s++)
 
14570
        {
 
14571
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14572
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14573
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
14574
        }// end loop over 's'
 
14575
      }// end loop over 'r'
 
14576
      for (unsigned int r = 0; r < 1; r++)
 
14577
      {
 
14578
        for (unsigned int s = 0; s < 1 - r; s++)
 
14579
        {
 
14580
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14581
          {
 
14582
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
14583
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14584
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
14585
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14586
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14587
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14588
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14589
          }// end loop over 't'
 
14590
        }// end loop over 's'
 
14591
      }// end loop over 'r'
 
14592
      for (unsigned int r = 0; r < 3; r++)
 
14593
      {
 
14594
        for (unsigned int s = 0; s < 3 - r; s++)
 
14595
        {
 
14596
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14597
          {
 
14598
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14599
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
14600
          }// end loop over 't'
 
14601
        }// end loop over 's'
 
14602
      }// end loop over 'r'
 
14603
      
 
14604
      // Table(s) of coefficients.
 
14605
      static const double coefficients0[10] = \
 
14606
      {0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
 
14607
      
 
14608
      // Tables of derivatives of the polynomial base (transpose).
 
14609
      static const double dmats0[10][10] = \
 
14610
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14611
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14612
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14613
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14614
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14615
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14616
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14617
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14618
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14619
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14620
      
 
14621
      static const double dmats1[10][10] = \
 
14622
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14623
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14624
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14625
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14626
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14627
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14628
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14629
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14630
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14631
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14632
      
 
14633
      static const double dmats2[10][10] = \
 
14634
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14635
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14636
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14637
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14638
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14639
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14640
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14641
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14642
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14643
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14644
      
 
14645
      // Compute reference derivatives.
 
14646
      // Declare pointer to array of derivatives on FIAT element.
 
14647
      double *derivatives = new double[num_derivatives];
 
14648
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14649
      {
 
14650
        derivatives[r] = 0.00000000;
 
14651
      }// end loop over 'r'
 
14652
      
 
14653
      // Declare derivative matrix (of polynomial basis).
 
14654
      double dmats[10][10] = \
 
14655
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14656
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14657
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14658
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14659
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14660
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14661
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14662
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14663
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14664
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14665
      
 
14666
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14667
      double dmats_old[10][10] = \
 
14668
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14669
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14670
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14671
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14672
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14673
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14674
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14675
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14676
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14677
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14678
      
 
14679
      // Loop possible derivatives.
 
14680
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14681
      {
 
14682
        // Resetting dmats values to compute next derivative.
 
14683
        for (unsigned int t = 0; t < 10; t++)
 
14684
        {
 
14685
          for (unsigned int u = 0; u < 10; u++)
 
14686
          {
 
14687
            dmats[t][u] = 0.00000000;
 
14688
            if (t == u)
 
14689
            {
 
14690
            dmats[t][u] = 1.00000000;
 
14691
            }
 
14692
            
 
14693
          }// end loop over 'u'
 
14694
        }// end loop over 't'
 
14695
        
 
14696
        // Looping derivative order to generate dmats.
 
14697
        for (unsigned int s = 0; s < n; s++)
 
14698
        {
 
14699
          // Updating dmats_old with new values and resetting dmats.
 
14700
          for (unsigned int t = 0; t < 10; t++)
 
14701
          {
 
14702
            for (unsigned int u = 0; u < 10; u++)
 
14703
            {
 
14704
              dmats_old[t][u] = dmats[t][u];
 
14705
              dmats[t][u] = 0.00000000;
 
14706
            }// end loop over 'u'
 
14707
          }// end loop over 't'
 
14708
          
 
14709
          // Update dmats using an inner product.
 
14710
          if (combinations[r][s] == 0)
 
14711
          {
 
14712
          for (unsigned int t = 0; t < 10; t++)
 
14713
          {
 
14714
            for (unsigned int u = 0; u < 10; u++)
 
14715
            {
 
14716
              for (unsigned int tu = 0; tu < 10; tu++)
 
14717
              {
 
14718
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14719
              }// end loop over 'tu'
 
14720
            }// end loop over 'u'
 
14721
          }// end loop over 't'
 
14722
          }
 
14723
          
 
14724
          if (combinations[r][s] == 1)
 
14725
          {
 
14726
          for (unsigned int t = 0; t < 10; t++)
 
14727
          {
 
14728
            for (unsigned int u = 0; u < 10; u++)
 
14729
            {
 
14730
              for (unsigned int tu = 0; tu < 10; tu++)
 
14731
              {
 
14732
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
14733
              }// end loop over 'tu'
 
14734
            }// end loop over 'u'
 
14735
          }// end loop over 't'
 
14736
          }
 
14737
          
 
14738
          if (combinations[r][s] == 2)
 
14739
          {
 
14740
          for (unsigned int t = 0; t < 10; t++)
 
14741
          {
 
14742
            for (unsigned int u = 0; u < 10; u++)
 
14743
            {
 
14744
              for (unsigned int tu = 0; tu < 10; tu++)
 
14745
              {
 
14746
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
14747
              }// end loop over 'tu'
 
14748
            }// end loop over 'u'
 
14749
          }// end loop over 't'
 
14750
          }
 
14751
          
 
14752
        }// end loop over 's'
 
14753
        for (unsigned int s = 0; s < 10; s++)
 
14754
        {
 
14755
          for (unsigned int t = 0; t < 10; t++)
 
14756
          {
 
14757
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14758
          }// end loop over 't'
 
14759
        }// end loop over 's'
 
14760
      }// end loop over 'r'
 
14761
      
 
14762
      // Transform derivatives back to physical element
 
14763
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14764
      {
 
14765
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14766
        {
 
14767
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14768
        }// end loop over 's'
 
14769
      }// end loop over 'r'
 
14770
      
 
14771
      // Delete pointer to array of derivatives on FIAT element
 
14772
      delete [] derivatives;
 
14773
      
 
14774
      // Delete pointer to array of combinations of derivatives and transform
 
14775
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14776
      {
 
14777
        delete [] combinations[r];
 
14778
      }// end loop over 'r'
 
14779
      delete [] combinations;
 
14780
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14781
      {
 
14782
        delete [] transform[r];
 
14783
      }// end loop over 'r'
 
14784
      delete [] transform;
 
14785
        break;
 
14786
      }
 
14787
    case 28:
 
14788
      {
 
14789
        
 
14790
      // Array of basisvalues.
 
14791
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
14792
      
 
14793
      // Declare helper variables.
 
14794
      unsigned int rr = 0;
 
14795
      unsigned int ss = 0;
 
14796
      unsigned int tt = 0;
 
14797
      double tmp5 = 0.00000000;
 
14798
      double tmp6 = 0.00000000;
 
14799
      double tmp7 = 0.00000000;
 
14800
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
14801
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
14802
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
14803
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
14804
      double tmp4 = tmp3*tmp3;
 
14805
      
 
14806
      // Compute basisvalues.
 
14807
      basisvalues[0] = 1.00000000;
 
14808
      basisvalues[1] = tmp0;
 
14809
      for (unsigned int r = 1; r < 2; r++)
 
14810
      {
 
14811
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14812
        ss = r*(r + 1)*(r + 2)/6;
 
14813
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14814
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
14815
      }// end loop over 'r'
 
14816
      for (unsigned int r = 0; r < 2; r++)
 
14817
      {
 
14818
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14819
        ss = r*(r + 1)*(r + 2)/6;
 
14820
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
14821
      }// end loop over 'r'
 
14822
      for (unsigned int r = 0; r < 1; r++)
 
14823
      {
 
14824
        for (unsigned int s = 1; s < 2 - r; s++)
 
14825
        {
 
14826
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14827
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14828
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14829
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14830
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14831
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
14832
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14833
        }// end loop over 's'
 
14834
      }// end loop over 'r'
 
14835
      for (unsigned int r = 0; r < 2; r++)
 
14836
      {
 
14837
        for (unsigned int s = 0; s < 2 - r; s++)
 
14838
        {
 
14839
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14840
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14841
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
14842
        }// end loop over 's'
 
14843
      }// end loop over 'r'
 
14844
      for (unsigned int r = 0; r < 1; r++)
 
14845
      {
 
14846
        for (unsigned int s = 0; s < 1 - r; s++)
 
14847
        {
 
14848
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14849
          {
 
14850
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
14851
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14852
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
14853
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14854
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14855
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
14856
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14857
          }// end loop over 't'
 
14858
        }// end loop over 's'
 
14859
      }// end loop over 'r'
 
14860
      for (unsigned int r = 0; r < 3; r++)
 
14861
      {
 
14862
        for (unsigned int s = 0; s < 3 - r; s++)
 
14863
        {
 
14864
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14865
          {
 
14866
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14867
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
14868
          }// end loop over 't'
 
14869
        }// end loop over 's'
 
14870
      }// end loop over 'r'
 
14871
      
 
14872
      // Table(s) of coefficients.
 
14873
      static const double coefficients0[10] = \
 
14874
      {0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
 
14875
      
 
14876
      // Tables of derivatives of the polynomial base (transpose).
 
14877
      static const double dmats0[10][10] = \
 
14878
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14879
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14880
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14881
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14882
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14883
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14884
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14885
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14886
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14887
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14888
      
 
14889
      static const double dmats1[10][10] = \
 
14890
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14891
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14892
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14893
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14894
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14895
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14896
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14897
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14898
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14899
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14900
      
 
14901
      static const double dmats2[10][10] = \
 
14902
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14903
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14904
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14905
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14906
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14907
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14908
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14909
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14910
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14911
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
14912
      
 
14913
      // Compute reference derivatives.
 
14914
      // Declare pointer to array of derivatives on FIAT element.
 
14915
      double *derivatives = new double[num_derivatives];
 
14916
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14917
      {
 
14918
        derivatives[r] = 0.00000000;
 
14919
      }// end loop over 'r'
 
14920
      
 
14921
      // Declare derivative matrix (of polynomial basis).
 
14922
      double dmats[10][10] = \
 
14923
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14924
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14925
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14926
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14927
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14928
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14929
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14930
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14931
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14932
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14933
      
 
14934
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14935
      double dmats_old[10][10] = \
 
14936
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14937
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14938
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14939
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14940
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14941
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14942
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
14943
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
14944
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
14945
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
14946
      
 
14947
      // Loop possible derivatives.
 
14948
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14949
      {
 
14950
        // Resetting dmats values to compute next derivative.
 
14951
        for (unsigned int t = 0; t < 10; t++)
 
14952
        {
 
14953
          for (unsigned int u = 0; u < 10; u++)
 
14954
          {
 
14955
            dmats[t][u] = 0.00000000;
 
14956
            if (t == u)
 
14957
            {
 
14958
            dmats[t][u] = 1.00000000;
 
14959
            }
 
14960
            
 
14961
          }// end loop over 'u'
 
14962
        }// end loop over 't'
 
14963
        
 
14964
        // Looping derivative order to generate dmats.
 
14965
        for (unsigned int s = 0; s < n; s++)
 
14966
        {
 
14967
          // Updating dmats_old with new values and resetting dmats.
 
14968
          for (unsigned int t = 0; t < 10; t++)
 
14969
          {
 
14970
            for (unsigned int u = 0; u < 10; u++)
 
14971
            {
 
14972
              dmats_old[t][u] = dmats[t][u];
 
14973
              dmats[t][u] = 0.00000000;
 
14974
            }// end loop over 'u'
 
14975
          }// end loop over 't'
 
14976
          
 
14977
          // Update dmats using an inner product.
 
14978
          if (combinations[r][s] == 0)
 
14979
          {
 
14980
          for (unsigned int t = 0; t < 10; t++)
 
14981
          {
 
14982
            for (unsigned int u = 0; u < 10; u++)
 
14983
            {
 
14984
              for (unsigned int tu = 0; tu < 10; tu++)
 
14985
              {
 
14986
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14987
              }// end loop over 'tu'
 
14988
            }// end loop over 'u'
 
14989
          }// end loop over 't'
 
14990
          }
 
14991
          
 
14992
          if (combinations[r][s] == 1)
 
14993
          {
 
14994
          for (unsigned int t = 0; t < 10; t++)
 
14995
          {
 
14996
            for (unsigned int u = 0; u < 10; u++)
 
14997
            {
 
14998
              for (unsigned int tu = 0; tu < 10; tu++)
 
14999
              {
 
15000
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
15001
              }// end loop over 'tu'
 
15002
            }// end loop over 'u'
 
15003
          }// end loop over 't'
 
15004
          }
 
15005
          
 
15006
          if (combinations[r][s] == 2)
 
15007
          {
 
15008
          for (unsigned int t = 0; t < 10; t++)
 
15009
          {
 
15010
            for (unsigned int u = 0; u < 10; u++)
 
15011
            {
 
15012
              for (unsigned int tu = 0; tu < 10; tu++)
 
15013
              {
 
15014
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
15015
              }// end loop over 'tu'
 
15016
            }// end loop over 'u'
 
15017
          }// end loop over 't'
 
15018
          }
 
15019
          
 
15020
        }// end loop over 's'
 
15021
        for (unsigned int s = 0; s < 10; s++)
 
15022
        {
 
15023
          for (unsigned int t = 0; t < 10; t++)
 
15024
          {
 
15025
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
15026
          }// end loop over 't'
 
15027
        }// end loop over 's'
 
15028
      }// end loop over 'r'
 
15029
      
 
15030
      // Transform derivatives back to physical element
 
15031
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15032
      {
 
15033
        for (unsigned int s = 0; s < num_derivatives; s++)
 
15034
        {
 
15035
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
15036
        }// end loop over 's'
 
15037
      }// end loop over 'r'
 
15038
      
 
15039
      // Delete pointer to array of derivatives on FIAT element
 
15040
      delete [] derivatives;
 
15041
      
 
15042
      // Delete pointer to array of combinations of derivatives and transform
 
15043
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15044
      {
 
15045
        delete [] combinations[r];
 
15046
      }// end loop over 'r'
 
15047
      delete [] combinations;
 
15048
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15049
      {
 
15050
        delete [] transform[r];
 
15051
      }// end loop over 'r'
 
15052
      delete [] transform;
 
15053
        break;
 
15054
      }
 
15055
    case 29:
 
15056
      {
 
15057
        
 
15058
      // Array of basisvalues.
 
15059
      double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
15060
      
 
15061
      // Declare helper variables.
 
15062
      unsigned int rr = 0;
 
15063
      unsigned int ss = 0;
 
15064
      unsigned int tt = 0;
 
15065
      double tmp5 = 0.00000000;
 
15066
      double tmp6 = 0.00000000;
 
15067
      double tmp7 = 0.00000000;
 
15068
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
15069
      double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
 
15070
      double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
 
15071
      double tmp3 = 0.50000000*(1.00000000 - Z);
 
15072
      double tmp4 = tmp3*tmp3;
 
15073
      
 
15074
      // Compute basisvalues.
 
15075
      basisvalues[0] = 1.00000000;
 
15076
      basisvalues[1] = tmp0;
 
15077
      for (unsigned int r = 1; r < 2; r++)
 
15078
      {
 
15079
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
15080
        ss = r*(r + 1)*(r + 2)/6;
 
15081
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
15082
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
 
15083
      }// end loop over 'r'
 
15084
      for (unsigned int r = 0; r < 2; r++)
 
15085
      {
 
15086
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
15087
        ss = r*(r + 1)*(r + 2)/6;
 
15088
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
15089
      }// end loop over 'r'
 
15090
      for (unsigned int r = 0; r < 1; r++)
 
15091
      {
 
15092
        for (unsigned int s = 1; s < 2 - r; s++)
 
15093
        {
 
15094
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
15095
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
15096
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
15097
          tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
15098
          tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
15099
          tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
 
15100
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
15101
        }// end loop over 's'
 
15102
      }// end loop over 'r'
 
15103
      for (unsigned int r = 0; r < 2; r++)
 
15104
      {
 
15105
        for (unsigned int s = 0; s < 2 - r; s++)
 
15106
        {
 
15107
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
15108
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
15109
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
15110
        }// end loop over 's'
 
15111
      }// end loop over 'r'
 
15112
      for (unsigned int r = 0; r < 1; r++)
 
15113
      {
 
15114
        for (unsigned int s = 0; s < 1 - r; s++)
 
15115
        {
 
15116
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
15117
          {
 
15118
            rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
 
15119
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
15120
            tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
 
15121
            tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
15122
            tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
15123
            tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
 
15124
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
15125
          }// end loop over 't'
 
15126
        }// end loop over 's'
 
15127
      }// end loop over 'r'
 
15128
      for (unsigned int r = 0; r < 3; r++)
 
15129
      {
 
15130
        for (unsigned int s = 0; s < 3 - r; s++)
 
15131
        {
 
15132
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
15133
          {
 
15134
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
15135
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
15136
          }// end loop over 't'
 
15137
        }// end loop over 's'
 
15138
      }// end loop over 'r'
 
15139
      
 
15140
      // Table(s) of coefficients.
 
15141
      static const double coefficients0[10] = \
 
15142
      {0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
 
15143
      
 
15144
      // Tables of derivatives of the polynomial base (transpose).
 
15145
      static const double dmats0[10][10] = \
 
15146
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15147
      {6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15148
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15149
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15150
      {0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15151
      {4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15152
      {3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15153
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15154
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15155
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
15156
      
 
15157
      static const double dmats1[10][10] = \
 
15158
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15159
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15160
      {5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15161
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15162
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15163
      {2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15164
      {1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15165
      {-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15166
      {3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15167
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
15168
      
 
15169
      static const double dmats2[10][10] = \
 
15170
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15171
      {3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15172
      {1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15173
      {5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15174
      {2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15175
      {2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15176
      {1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15177
      {1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15178
      {1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15179
      {-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
15180
      
 
15181
      // Compute reference derivatives.
 
15182
      // Declare pointer to array of derivatives on FIAT element.
 
15183
      double *derivatives = new double[num_derivatives];
 
15184
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15185
      {
 
15186
        derivatives[r] = 0.00000000;
 
15187
      }// end loop over 'r'
 
15188
      
 
15189
      // Declare derivative matrix (of polynomial basis).
 
15190
      double dmats[10][10] = \
 
15191
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15192
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15193
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15194
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15195
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15196
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15197
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15198
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
15199
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
15200
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
15201
      
 
15202
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
15203
      double dmats_old[10][10] = \
 
15204
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15205
      {0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15206
      {0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15207
      {0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15208
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15209
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15210
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
15211
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
15212
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
15213
      {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
15214
      
 
15215
      // Loop possible derivatives.
 
15216
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15217
      {
 
15218
        // Resetting dmats values to compute next derivative.
 
15219
        for (unsigned int t = 0; t < 10; t++)
 
15220
        {
 
15221
          for (unsigned int u = 0; u < 10; u++)
 
15222
          {
 
15223
            dmats[t][u] = 0.00000000;
 
15224
            if (t == u)
 
15225
            {
 
15226
            dmats[t][u] = 1.00000000;
 
15227
            }
 
15228
            
 
15229
          }// end loop over 'u'
 
15230
        }// end loop over 't'
 
15231
        
 
15232
        // Looping derivative order to generate dmats.
 
15233
        for (unsigned int s = 0; s < n; s++)
 
15234
        {
 
15235
          // Updating dmats_old with new values and resetting dmats.
 
15236
          for (unsigned int t = 0; t < 10; t++)
 
15237
          {
 
15238
            for (unsigned int u = 0; u < 10; u++)
 
15239
            {
 
15240
              dmats_old[t][u] = dmats[t][u];
 
15241
              dmats[t][u] = 0.00000000;
 
15242
            }// end loop over 'u'
 
15243
          }// end loop over 't'
 
15244
          
 
15245
          // Update dmats using an inner product.
 
15246
          if (combinations[r][s] == 0)
 
15247
          {
 
15248
          for (unsigned int t = 0; t < 10; t++)
 
15249
          {
 
15250
            for (unsigned int u = 0; u < 10; u++)
 
15251
            {
 
15252
              for (unsigned int tu = 0; tu < 10; tu++)
 
15253
              {
 
15254
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
15255
              }// end loop over 'tu'
 
15256
            }// end loop over 'u'
 
15257
          }// end loop over 't'
 
15258
          }
 
15259
          
 
15260
          if (combinations[r][s] == 1)
 
15261
          {
 
15262
          for (unsigned int t = 0; t < 10; t++)
 
15263
          {
 
15264
            for (unsigned int u = 0; u < 10; u++)
 
15265
            {
 
15266
              for (unsigned int tu = 0; tu < 10; tu++)
 
15267
              {
 
15268
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
15269
              }// end loop over 'tu'
 
15270
            }// end loop over 'u'
 
15271
          }// end loop over 't'
 
15272
          }
 
15273
          
 
15274
          if (combinations[r][s] == 2)
 
15275
          {
 
15276
          for (unsigned int t = 0; t < 10; t++)
 
15277
          {
 
15278
            for (unsigned int u = 0; u < 10; u++)
 
15279
            {
 
15280
              for (unsigned int tu = 0; tu < 10; tu++)
 
15281
              {
 
15282
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
15283
              }// end loop over 'tu'
 
15284
            }// end loop over 'u'
 
15285
          }// end loop over 't'
 
15286
          }
 
15287
          
 
15288
        }// end loop over 's'
 
15289
        for (unsigned int s = 0; s < 10; s++)
 
15290
        {
 
15291
          for (unsigned int t = 0; t < 10; t++)
 
15292
          {
 
15293
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
15294
          }// end loop over 't'
 
15295
        }// end loop over 's'
 
15296
      }// end loop over 'r'
 
15297
      
 
15298
      // Transform derivatives back to physical element
 
15299
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15300
      {
 
15301
        for (unsigned int s = 0; s < num_derivatives; s++)
 
15302
        {
 
15303
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
15304
        }// end loop over 's'
 
15305
      }// end loop over 'r'
 
15306
      
 
15307
      // Delete pointer to array of derivatives on FIAT element
 
15308
      delete [] derivatives;
 
15309
      
 
15310
      // Delete pointer to array of combinations of derivatives and transform
 
15311
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15312
      {
 
15313
        delete [] combinations[r];
 
15314
      }// end loop over 'r'
 
15315
      delete [] combinations;
 
15316
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15317
      {
 
15318
        delete [] transform[r];
 
15319
      }// end loop over 'r'
 
15320
      delete [] transform;
 
15321
        break;
 
15322
      }
2284
15323
    }
2285
15324
    
2286
15325
  }
2922
15961
    
2923
15962
    // Reset values.
2924
15963
    *values = 0.00000000;
2925
 
    
2926
 
    // Map degree of freedom to element degree of freedom
2927
 
    const unsigned int dof = i;
2928
 
    
2929
 
    // Array of basisvalues.
2930
 
    double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
2931
 
    
2932
 
    // Declare helper variables.
2933
 
    unsigned int rr = 0;
2934
 
    unsigned int ss = 0;
2935
 
    double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2936
 
    
2937
 
    // Compute basisvalues.
2938
 
    basisvalues[0] = 1.00000000;
2939
 
    basisvalues[1] = tmp0;
2940
 
    for (unsigned int r = 0; r < 1; r++)
2941
 
    {
2942
 
      rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2943
 
      ss = r*(r + 1)*(r + 2)/6;
2944
 
      basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2945
 
    }// end loop over 'r'
2946
 
    for (unsigned int r = 0; r < 1; r++)
2947
 
    {
2948
 
      for (unsigned int s = 0; s < 1 - r; s++)
2949
 
      {
2950
 
        rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2951
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2952
 
        basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2953
 
      }// end loop over 's'
2954
 
    }// end loop over 'r'
2955
 
    for (unsigned int r = 0; r < 2; r++)
2956
 
    {
2957
 
      for (unsigned int s = 0; s < 2 - r; s++)
2958
 
      {
2959
 
        for (unsigned int t = 0; t < 2 - r - s; t++)
2960
 
        {
2961
 
          rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2962
 
          basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2963
 
        }// end loop over 't'
2964
 
      }// end loop over 's'
2965
 
    }// end loop over 'r'
2966
 
    
2967
 
    // Table(s) of coefficients.
2968
 
    static const double coefficients0[4][4] = \
2969
 
    {{0.28867513, -0.18257419, -0.10540926, -0.07453560},
2970
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560},
2971
 
    {0.28867513, 0.00000000, 0.21081851, -0.07453560},
2972
 
    {0.28867513, 0.00000000, 0.00000000, 0.22360680}};
2973
 
    
2974
 
    // Compute value(s).
2975
 
    for (unsigned int r = 0; r < 4; r++)
2976
 
    {
2977
 
      *values += coefficients0[dof][r]*basisvalues[r];
2978
 
    }// end loop over 'r'
 
15964
    switch (i)
 
15965
    {
 
15966
    case 0:
 
15967
      {
 
15968
        
 
15969
      // Array of basisvalues.
 
15970
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
15971
      
 
15972
      // Declare helper variables.
 
15973
      unsigned int rr = 0;
 
15974
      unsigned int ss = 0;
 
15975
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
15976
      
 
15977
      // Compute basisvalues.
 
15978
      basisvalues[0] = 1.00000000;
 
15979
      basisvalues[1] = tmp0;
 
15980
      for (unsigned int r = 0; r < 1; r++)
 
15981
      {
 
15982
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
15983
        ss = r*(r + 1)*(r + 2)/6;
 
15984
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
15985
      }// end loop over 'r'
 
15986
      for (unsigned int r = 0; r < 1; r++)
 
15987
      {
 
15988
        for (unsigned int s = 0; s < 1 - r; s++)
 
15989
        {
 
15990
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
15991
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
15992
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
15993
        }// end loop over 's'
 
15994
      }// end loop over 'r'
 
15995
      for (unsigned int r = 0; r < 2; r++)
 
15996
      {
 
15997
        for (unsigned int s = 0; s < 2 - r; s++)
 
15998
        {
 
15999
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16000
          {
 
16001
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16002
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16003
          }// end loop over 't'
 
16004
        }// end loop over 's'
 
16005
      }// end loop over 'r'
 
16006
      
 
16007
      // Table(s) of coefficients.
 
16008
      static const double coefficients0[4] = \
 
16009
      {0.28867513, -0.18257419, -0.10540926, -0.07453560};
 
16010
      
 
16011
      // Compute value(s).
 
16012
      for (unsigned int r = 0; r < 4; r++)
 
16013
      {
 
16014
        *values += coefficients0[r]*basisvalues[r];
 
16015
      }// end loop over 'r'
 
16016
        break;
 
16017
      }
 
16018
    case 1:
 
16019
      {
 
16020
        
 
16021
      // Array of basisvalues.
 
16022
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16023
      
 
16024
      // Declare helper variables.
 
16025
      unsigned int rr = 0;
 
16026
      unsigned int ss = 0;
 
16027
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16028
      
 
16029
      // Compute basisvalues.
 
16030
      basisvalues[0] = 1.00000000;
 
16031
      basisvalues[1] = tmp0;
 
16032
      for (unsigned int r = 0; r < 1; r++)
 
16033
      {
 
16034
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16035
        ss = r*(r + 1)*(r + 2)/6;
 
16036
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16037
      }// end loop over 'r'
 
16038
      for (unsigned int r = 0; r < 1; r++)
 
16039
      {
 
16040
        for (unsigned int s = 0; s < 1 - r; s++)
 
16041
        {
 
16042
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16043
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16044
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16045
        }// end loop over 's'
 
16046
      }// end loop over 'r'
 
16047
      for (unsigned int r = 0; r < 2; r++)
 
16048
      {
 
16049
        for (unsigned int s = 0; s < 2 - r; s++)
 
16050
        {
 
16051
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16052
          {
 
16053
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16054
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16055
          }// end loop over 't'
 
16056
        }// end loop over 's'
 
16057
      }// end loop over 'r'
 
16058
      
 
16059
      // Table(s) of coefficients.
 
16060
      static const double coefficients0[4] = \
 
16061
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
16062
      
 
16063
      // Compute value(s).
 
16064
      for (unsigned int r = 0; r < 4; r++)
 
16065
      {
 
16066
        *values += coefficients0[r]*basisvalues[r];
 
16067
      }// end loop over 'r'
 
16068
        break;
 
16069
      }
 
16070
    case 2:
 
16071
      {
 
16072
        
 
16073
      // Array of basisvalues.
 
16074
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16075
      
 
16076
      // Declare helper variables.
 
16077
      unsigned int rr = 0;
 
16078
      unsigned int ss = 0;
 
16079
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16080
      
 
16081
      // Compute basisvalues.
 
16082
      basisvalues[0] = 1.00000000;
 
16083
      basisvalues[1] = tmp0;
 
16084
      for (unsigned int r = 0; r < 1; r++)
 
16085
      {
 
16086
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16087
        ss = r*(r + 1)*(r + 2)/6;
 
16088
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16089
      }// end loop over 'r'
 
16090
      for (unsigned int r = 0; r < 1; r++)
 
16091
      {
 
16092
        for (unsigned int s = 0; s < 1 - r; s++)
 
16093
        {
 
16094
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16095
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16096
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16097
        }// end loop over 's'
 
16098
      }// end loop over 'r'
 
16099
      for (unsigned int r = 0; r < 2; r++)
 
16100
      {
 
16101
        for (unsigned int s = 0; s < 2 - r; s++)
 
16102
        {
 
16103
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16104
          {
 
16105
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16106
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16107
          }// end loop over 't'
 
16108
        }// end loop over 's'
 
16109
      }// end loop over 'r'
 
16110
      
 
16111
      // Table(s) of coefficients.
 
16112
      static const double coefficients0[4] = \
 
16113
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
16114
      
 
16115
      // Compute value(s).
 
16116
      for (unsigned int r = 0; r < 4; r++)
 
16117
      {
 
16118
        *values += coefficients0[r]*basisvalues[r];
 
16119
      }// end loop over 'r'
 
16120
        break;
 
16121
      }
 
16122
    case 3:
 
16123
      {
 
16124
        
 
16125
      // Array of basisvalues.
 
16126
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16127
      
 
16128
      // Declare helper variables.
 
16129
      unsigned int rr = 0;
 
16130
      unsigned int ss = 0;
 
16131
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16132
      
 
16133
      // Compute basisvalues.
 
16134
      basisvalues[0] = 1.00000000;
 
16135
      basisvalues[1] = tmp0;
 
16136
      for (unsigned int r = 0; r < 1; r++)
 
16137
      {
 
16138
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16139
        ss = r*(r + 1)*(r + 2)/6;
 
16140
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16141
      }// end loop over 'r'
 
16142
      for (unsigned int r = 0; r < 1; r++)
 
16143
      {
 
16144
        for (unsigned int s = 0; s < 1 - r; s++)
 
16145
        {
 
16146
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16147
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16148
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16149
        }// end loop over 's'
 
16150
      }// end loop over 'r'
 
16151
      for (unsigned int r = 0; r < 2; r++)
 
16152
      {
 
16153
        for (unsigned int s = 0; s < 2 - r; s++)
 
16154
        {
 
16155
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16156
          {
 
16157
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16158
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16159
          }// end loop over 't'
 
16160
        }// end loop over 's'
 
16161
      }// end loop over 'r'
 
16162
      
 
16163
      // Table(s) of coefficients.
 
16164
      static const double coefficients0[4] = \
 
16165
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
16166
      
 
16167
      // Compute value(s).
 
16168
      for (unsigned int r = 0; r < 4; r++)
 
16169
      {
 
16170
        *values += coefficients0[r]*basisvalues[r];
 
16171
      }// end loop over 'r'
 
16172
        break;
 
16173
      }
 
16174
    }
 
16175
    
2979
16176
  }
2980
16177
 
2981
16178
  /// Evaluate all basis functions at given point in cell
3115
16312
      values[r] = 0.00000000;
3116
16313
    }// end loop over 'r'
3117
16314
    
3118
 
    // Map degree of freedom to element degree of freedom
3119
 
    const unsigned int dof = i;
3120
 
    
3121
 
    // Array of basisvalues.
3122
 
    double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3123
 
    
3124
 
    // Declare helper variables.
3125
 
    unsigned int rr = 0;
3126
 
    unsigned int ss = 0;
3127
 
    double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3128
 
    
3129
 
    // Compute basisvalues.
3130
 
    basisvalues[0] = 1.00000000;
3131
 
    basisvalues[1] = tmp0;
3132
 
    for (unsigned int r = 0; r < 1; r++)
3133
 
    {
3134
 
      rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3135
 
      ss = r*(r + 1)*(r + 2)/6;
3136
 
      basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3137
 
    }// end loop over 'r'
3138
 
    for (unsigned int r = 0; r < 1; r++)
3139
 
    {
3140
 
      for (unsigned int s = 0; s < 1 - r; s++)
3141
 
      {
3142
 
        rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3143
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3144
 
        basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3145
 
      }// end loop over 's'
3146
 
    }// end loop over 'r'
3147
 
    for (unsigned int r = 0; r < 2; r++)
3148
 
    {
3149
 
      for (unsigned int s = 0; s < 2 - r; s++)
3150
 
      {
3151
 
        for (unsigned int t = 0; t < 2 - r - s; t++)
3152
 
        {
3153
 
          rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3154
 
          basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3155
 
        }// end loop over 't'
3156
 
      }// end loop over 's'
3157
 
    }// end loop over 'r'
3158
 
    
3159
 
    // Table(s) of coefficients.
3160
 
    static const double coefficients0[4][4] = \
3161
 
    {{0.28867513, -0.18257419, -0.10540926, -0.07453560},
3162
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560},
3163
 
    {0.28867513, 0.00000000, 0.21081851, -0.07453560},
3164
 
    {0.28867513, 0.00000000, 0.00000000, 0.22360680}};
3165
 
    
3166
 
    // Tables of derivatives of the polynomial base (transpose).
3167
 
    static const double dmats0[4][4] = \
3168
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3169
 
    {6.32455532, 0.00000000, 0.00000000, 0.00000000},
3170
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000},
3171
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3172
 
    
3173
 
    static const double dmats1[4][4] = \
3174
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3175
 
    {3.16227766, 0.00000000, 0.00000000, 0.00000000},
3176
 
    {5.47722558, 0.00000000, 0.00000000, 0.00000000},
3177
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3178
 
    
3179
 
    static const double dmats2[4][4] = \
3180
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3181
 
    {3.16227766, 0.00000000, 0.00000000, 0.00000000},
3182
 
    {1.82574186, 0.00000000, 0.00000000, 0.00000000},
3183
 
    {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3184
 
    
3185
 
    // Compute reference derivatives.
3186
 
    // Declare pointer to array of derivatives on FIAT element.
3187
 
    double *derivatives = new double[num_derivatives];
3188
 
    for (unsigned int r = 0; r < num_derivatives; r++)
3189
 
    {
3190
 
      derivatives[r] = 0.00000000;
3191
 
    }// end loop over 'r'
3192
 
    
3193
 
    // Declare derivative matrix (of polynomial basis).
3194
 
    double dmats[4][4] = \
3195
 
    {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3196
 
    {0.00000000, 1.00000000, 0.00000000, 0.00000000},
3197
 
    {0.00000000, 0.00000000, 1.00000000, 0.00000000},
3198
 
    {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3199
 
    
3200
 
    // Declare (auxiliary) derivative matrix (of polynomial basis).
3201
 
    double dmats_old[4][4] = \
3202
 
    {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3203
 
    {0.00000000, 1.00000000, 0.00000000, 0.00000000},
3204
 
    {0.00000000, 0.00000000, 1.00000000, 0.00000000},
3205
 
    {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3206
 
    
3207
 
    // Loop possible derivatives.
3208
 
    for (unsigned int r = 0; r < num_derivatives; r++)
3209
 
    {
3210
 
      // Resetting dmats values to compute next derivative.
3211
 
      for (unsigned int t = 0; t < 4; t++)
3212
 
      {
3213
 
        for (unsigned int u = 0; u < 4; u++)
3214
 
        {
3215
 
          dmats[t][u] = 0.00000000;
3216
 
          if (t == u)
3217
 
          {
3218
 
          dmats[t][u] = 1.00000000;
3219
 
          }
3220
 
          
3221
 
        }// end loop over 'u'
3222
 
      }// end loop over 't'
3223
 
      
3224
 
      // Looping derivative order to generate dmats.
3225
 
      for (unsigned int s = 0; s < n; s++)
3226
 
      {
3227
 
        // Updating dmats_old with new values and resetting dmats.
3228
 
        for (unsigned int t = 0; t < 4; t++)
3229
 
        {
3230
 
          for (unsigned int u = 0; u < 4; u++)
3231
 
          {
3232
 
            dmats_old[t][u] = dmats[t][u];
3233
 
            dmats[t][u] = 0.00000000;
3234
 
          }// end loop over 'u'
3235
 
        }// end loop over 't'
3236
 
        
3237
 
        // Update dmats using an inner product.
3238
 
        if (combinations[r][s] == 0)
3239
 
        {
3240
 
        for (unsigned int t = 0; t < 4; t++)
3241
 
        {
3242
 
          for (unsigned int u = 0; u < 4; u++)
3243
 
          {
3244
 
            for (unsigned int tu = 0; tu < 4; tu++)
3245
 
            {
3246
 
              dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3247
 
            }// end loop over 'tu'
3248
 
          }// end loop over 'u'
3249
 
        }// end loop over 't'
3250
 
        }
3251
 
        
3252
 
        if (combinations[r][s] == 1)
3253
 
        {
3254
 
        for (unsigned int t = 0; t < 4; t++)
3255
 
        {
3256
 
          for (unsigned int u = 0; u < 4; u++)
3257
 
          {
3258
 
            for (unsigned int tu = 0; tu < 4; tu++)
3259
 
            {
3260
 
              dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3261
 
            }// end loop over 'tu'
3262
 
          }// end loop over 'u'
3263
 
        }// end loop over 't'
3264
 
        }
3265
 
        
3266
 
        if (combinations[r][s] == 2)
3267
 
        {
3268
 
        for (unsigned int t = 0; t < 4; t++)
3269
 
        {
3270
 
          for (unsigned int u = 0; u < 4; u++)
3271
 
          {
3272
 
            for (unsigned int tu = 0; tu < 4; tu++)
3273
 
            {
3274
 
              dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3275
 
            }// end loop over 'tu'
3276
 
          }// end loop over 'u'
3277
 
        }// end loop over 't'
3278
 
        }
3279
 
        
3280
 
      }// end loop over 's'
3281
 
      for (unsigned int s = 0; s < 4; s++)
3282
 
      {
3283
 
        for (unsigned int t = 0; t < 4; t++)
3284
 
        {
3285
 
          derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
3286
 
        }// end loop over 't'
3287
 
      }// end loop over 's'
3288
 
    }// end loop over 'r'
3289
 
    
3290
 
    // Transform derivatives back to physical element
3291
 
    for (unsigned int r = 0; r < num_derivatives; r++)
3292
 
    {
3293
 
      for (unsigned int s = 0; s < num_derivatives; s++)
3294
 
      {
3295
 
        values[r] += transform[r][s]*derivatives[s];
3296
 
      }// end loop over 's'
3297
 
    }// end loop over 'r'
3298
 
    
3299
 
    // Delete pointer to array of derivatives on FIAT element
3300
 
    delete [] derivatives;
3301
 
    
3302
 
    // Delete pointer to array of combinations of derivatives and transform
3303
 
    for (unsigned int r = 0; r < num_derivatives; r++)
3304
 
    {
3305
 
      delete [] combinations[r];
3306
 
    }// end loop over 'r'
3307
 
    delete [] combinations;
3308
 
    for (unsigned int r = 0; r < num_derivatives; r++)
3309
 
    {
3310
 
      delete [] transform[r];
3311
 
    }// end loop over 'r'
3312
 
    delete [] transform;
 
16315
    switch (i)
 
16316
    {
 
16317
    case 0:
 
16318
      {
 
16319
        
 
16320
      // Array of basisvalues.
 
16321
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16322
      
 
16323
      // Declare helper variables.
 
16324
      unsigned int rr = 0;
 
16325
      unsigned int ss = 0;
 
16326
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16327
      
 
16328
      // Compute basisvalues.
 
16329
      basisvalues[0] = 1.00000000;
 
16330
      basisvalues[1] = tmp0;
 
16331
      for (unsigned int r = 0; r < 1; r++)
 
16332
      {
 
16333
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16334
        ss = r*(r + 1)*(r + 2)/6;
 
16335
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16336
      }// end loop over 'r'
 
16337
      for (unsigned int r = 0; r < 1; r++)
 
16338
      {
 
16339
        for (unsigned int s = 0; s < 1 - r; s++)
 
16340
        {
 
16341
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16342
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16343
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16344
        }// end loop over 's'
 
16345
      }// end loop over 'r'
 
16346
      for (unsigned int r = 0; r < 2; r++)
 
16347
      {
 
16348
        for (unsigned int s = 0; s < 2 - r; s++)
 
16349
        {
 
16350
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16351
          {
 
16352
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16353
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16354
          }// end loop over 't'
 
16355
        }// end loop over 's'
 
16356
      }// end loop over 'r'
 
16357
      
 
16358
      // Table(s) of coefficients.
 
16359
      static const double coefficients0[4] = \
 
16360
      {0.28867513, -0.18257419, -0.10540926, -0.07453560};
 
16361
      
 
16362
      // Tables of derivatives of the polynomial base (transpose).
 
16363
      static const double dmats0[4][4] = \
 
16364
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16365
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
16366
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16367
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16368
      
 
16369
      static const double dmats1[4][4] = \
 
16370
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16371
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16372
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
16373
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16374
      
 
16375
      static const double dmats2[4][4] = \
 
16376
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16377
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16378
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
16379
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
16380
      
 
16381
      // Compute reference derivatives.
 
16382
      // Declare pointer to array of derivatives on FIAT element.
 
16383
      double *derivatives = new double[num_derivatives];
 
16384
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16385
      {
 
16386
        derivatives[r] = 0.00000000;
 
16387
      }// end loop over 'r'
 
16388
      
 
16389
      // Declare derivative matrix (of polynomial basis).
 
16390
      double dmats[4][4] = \
 
16391
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16392
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16393
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16394
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16395
      
 
16396
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16397
      double dmats_old[4][4] = \
 
16398
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16399
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16400
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16401
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16402
      
 
16403
      // Loop possible derivatives.
 
16404
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16405
      {
 
16406
        // Resetting dmats values to compute next derivative.
 
16407
        for (unsigned int t = 0; t < 4; t++)
 
16408
        {
 
16409
          for (unsigned int u = 0; u < 4; u++)
 
16410
          {
 
16411
            dmats[t][u] = 0.00000000;
 
16412
            if (t == u)
 
16413
            {
 
16414
            dmats[t][u] = 1.00000000;
 
16415
            }
 
16416
            
 
16417
          }// end loop over 'u'
 
16418
        }// end loop over 't'
 
16419
        
 
16420
        // Looping derivative order to generate dmats.
 
16421
        for (unsigned int s = 0; s < n; s++)
 
16422
        {
 
16423
          // Updating dmats_old with new values and resetting dmats.
 
16424
          for (unsigned int t = 0; t < 4; t++)
 
16425
          {
 
16426
            for (unsigned int u = 0; u < 4; u++)
 
16427
            {
 
16428
              dmats_old[t][u] = dmats[t][u];
 
16429
              dmats[t][u] = 0.00000000;
 
16430
            }// end loop over 'u'
 
16431
          }// end loop over 't'
 
16432
          
 
16433
          // Update dmats using an inner product.
 
16434
          if (combinations[r][s] == 0)
 
16435
          {
 
16436
          for (unsigned int t = 0; t < 4; t++)
 
16437
          {
 
16438
            for (unsigned int u = 0; u < 4; u++)
 
16439
            {
 
16440
              for (unsigned int tu = 0; tu < 4; tu++)
 
16441
              {
 
16442
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
16443
              }// end loop over 'tu'
 
16444
            }// end loop over 'u'
 
16445
          }// end loop over 't'
 
16446
          }
 
16447
          
 
16448
          if (combinations[r][s] == 1)
 
16449
          {
 
16450
          for (unsigned int t = 0; t < 4; t++)
 
16451
          {
 
16452
            for (unsigned int u = 0; u < 4; u++)
 
16453
            {
 
16454
              for (unsigned int tu = 0; tu < 4; tu++)
 
16455
              {
 
16456
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
16457
              }// end loop over 'tu'
 
16458
            }// end loop over 'u'
 
16459
          }// end loop over 't'
 
16460
          }
 
16461
          
 
16462
          if (combinations[r][s] == 2)
 
16463
          {
 
16464
          for (unsigned int t = 0; t < 4; t++)
 
16465
          {
 
16466
            for (unsigned int u = 0; u < 4; u++)
 
16467
            {
 
16468
              for (unsigned int tu = 0; tu < 4; tu++)
 
16469
              {
 
16470
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
16471
              }// end loop over 'tu'
 
16472
            }// end loop over 'u'
 
16473
          }// end loop over 't'
 
16474
          }
 
16475
          
 
16476
        }// end loop over 's'
 
16477
        for (unsigned int s = 0; s < 4; s++)
 
16478
        {
 
16479
          for (unsigned int t = 0; t < 4; t++)
 
16480
          {
 
16481
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
16482
          }// end loop over 't'
 
16483
        }// end loop over 's'
 
16484
      }// end loop over 'r'
 
16485
      
 
16486
      // Transform derivatives back to physical element
 
16487
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16488
      {
 
16489
        for (unsigned int s = 0; s < num_derivatives; s++)
 
16490
        {
 
16491
          values[r] += transform[r][s]*derivatives[s];
 
16492
        }// end loop over 's'
 
16493
      }// end loop over 'r'
 
16494
      
 
16495
      // Delete pointer to array of derivatives on FIAT element
 
16496
      delete [] derivatives;
 
16497
      
 
16498
      // Delete pointer to array of combinations of derivatives and transform
 
16499
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16500
      {
 
16501
        delete [] combinations[r];
 
16502
      }// end loop over 'r'
 
16503
      delete [] combinations;
 
16504
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16505
      {
 
16506
        delete [] transform[r];
 
16507
      }// end loop over 'r'
 
16508
      delete [] transform;
 
16509
        break;
 
16510
      }
 
16511
    case 1:
 
16512
      {
 
16513
        
 
16514
      // Array of basisvalues.
 
16515
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16516
      
 
16517
      // Declare helper variables.
 
16518
      unsigned int rr = 0;
 
16519
      unsigned int ss = 0;
 
16520
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16521
      
 
16522
      // Compute basisvalues.
 
16523
      basisvalues[0] = 1.00000000;
 
16524
      basisvalues[1] = tmp0;
 
16525
      for (unsigned int r = 0; r < 1; r++)
 
16526
      {
 
16527
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16528
        ss = r*(r + 1)*(r + 2)/6;
 
16529
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16530
      }// end loop over 'r'
 
16531
      for (unsigned int r = 0; r < 1; r++)
 
16532
      {
 
16533
        for (unsigned int s = 0; s < 1 - r; s++)
 
16534
        {
 
16535
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16536
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16537
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16538
        }// end loop over 's'
 
16539
      }// end loop over 'r'
 
16540
      for (unsigned int r = 0; r < 2; r++)
 
16541
      {
 
16542
        for (unsigned int s = 0; s < 2 - r; s++)
 
16543
        {
 
16544
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16545
          {
 
16546
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16547
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16548
          }// end loop over 't'
 
16549
        }// end loop over 's'
 
16550
      }// end loop over 'r'
 
16551
      
 
16552
      // Table(s) of coefficients.
 
16553
      static const double coefficients0[4] = \
 
16554
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
16555
      
 
16556
      // Tables of derivatives of the polynomial base (transpose).
 
16557
      static const double dmats0[4][4] = \
 
16558
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16559
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
16560
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16561
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16562
      
 
16563
      static const double dmats1[4][4] = \
 
16564
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16565
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16566
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
16567
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16568
      
 
16569
      static const double dmats2[4][4] = \
 
16570
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16571
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16572
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
16573
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
16574
      
 
16575
      // Compute reference derivatives.
 
16576
      // Declare pointer to array of derivatives on FIAT element.
 
16577
      double *derivatives = new double[num_derivatives];
 
16578
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16579
      {
 
16580
        derivatives[r] = 0.00000000;
 
16581
      }// end loop over 'r'
 
16582
      
 
16583
      // Declare derivative matrix (of polynomial basis).
 
16584
      double dmats[4][4] = \
 
16585
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16586
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16587
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16588
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16589
      
 
16590
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16591
      double dmats_old[4][4] = \
 
16592
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16593
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16594
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16595
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16596
      
 
16597
      // Loop possible derivatives.
 
16598
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16599
      {
 
16600
        // Resetting dmats values to compute next derivative.
 
16601
        for (unsigned int t = 0; t < 4; t++)
 
16602
        {
 
16603
          for (unsigned int u = 0; u < 4; u++)
 
16604
          {
 
16605
            dmats[t][u] = 0.00000000;
 
16606
            if (t == u)
 
16607
            {
 
16608
            dmats[t][u] = 1.00000000;
 
16609
            }
 
16610
            
 
16611
          }// end loop over 'u'
 
16612
        }// end loop over 't'
 
16613
        
 
16614
        // Looping derivative order to generate dmats.
 
16615
        for (unsigned int s = 0; s < n; s++)
 
16616
        {
 
16617
          // Updating dmats_old with new values and resetting dmats.
 
16618
          for (unsigned int t = 0; t < 4; t++)
 
16619
          {
 
16620
            for (unsigned int u = 0; u < 4; u++)
 
16621
            {
 
16622
              dmats_old[t][u] = dmats[t][u];
 
16623
              dmats[t][u] = 0.00000000;
 
16624
            }// end loop over 'u'
 
16625
          }// end loop over 't'
 
16626
          
 
16627
          // Update dmats using an inner product.
 
16628
          if (combinations[r][s] == 0)
 
16629
          {
 
16630
          for (unsigned int t = 0; t < 4; t++)
 
16631
          {
 
16632
            for (unsigned int u = 0; u < 4; u++)
 
16633
            {
 
16634
              for (unsigned int tu = 0; tu < 4; tu++)
 
16635
              {
 
16636
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
16637
              }// end loop over 'tu'
 
16638
            }// end loop over 'u'
 
16639
          }// end loop over 't'
 
16640
          }
 
16641
          
 
16642
          if (combinations[r][s] == 1)
 
16643
          {
 
16644
          for (unsigned int t = 0; t < 4; t++)
 
16645
          {
 
16646
            for (unsigned int u = 0; u < 4; u++)
 
16647
            {
 
16648
              for (unsigned int tu = 0; tu < 4; tu++)
 
16649
              {
 
16650
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
16651
              }// end loop over 'tu'
 
16652
            }// end loop over 'u'
 
16653
          }// end loop over 't'
 
16654
          }
 
16655
          
 
16656
          if (combinations[r][s] == 2)
 
16657
          {
 
16658
          for (unsigned int t = 0; t < 4; t++)
 
16659
          {
 
16660
            for (unsigned int u = 0; u < 4; u++)
 
16661
            {
 
16662
              for (unsigned int tu = 0; tu < 4; tu++)
 
16663
              {
 
16664
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
16665
              }// end loop over 'tu'
 
16666
            }// end loop over 'u'
 
16667
          }// end loop over 't'
 
16668
          }
 
16669
          
 
16670
        }// end loop over 's'
 
16671
        for (unsigned int s = 0; s < 4; s++)
 
16672
        {
 
16673
          for (unsigned int t = 0; t < 4; t++)
 
16674
          {
 
16675
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
16676
          }// end loop over 't'
 
16677
        }// end loop over 's'
 
16678
      }// end loop over 'r'
 
16679
      
 
16680
      // Transform derivatives back to physical element
 
16681
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16682
      {
 
16683
        for (unsigned int s = 0; s < num_derivatives; s++)
 
16684
        {
 
16685
          values[r] += transform[r][s]*derivatives[s];
 
16686
        }// end loop over 's'
 
16687
      }// end loop over 'r'
 
16688
      
 
16689
      // Delete pointer to array of derivatives on FIAT element
 
16690
      delete [] derivatives;
 
16691
      
 
16692
      // Delete pointer to array of combinations of derivatives and transform
 
16693
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16694
      {
 
16695
        delete [] combinations[r];
 
16696
      }// end loop over 'r'
 
16697
      delete [] combinations;
 
16698
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16699
      {
 
16700
        delete [] transform[r];
 
16701
      }// end loop over 'r'
 
16702
      delete [] transform;
 
16703
        break;
 
16704
      }
 
16705
    case 2:
 
16706
      {
 
16707
        
 
16708
      // Array of basisvalues.
 
16709
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16710
      
 
16711
      // Declare helper variables.
 
16712
      unsigned int rr = 0;
 
16713
      unsigned int ss = 0;
 
16714
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16715
      
 
16716
      // Compute basisvalues.
 
16717
      basisvalues[0] = 1.00000000;
 
16718
      basisvalues[1] = tmp0;
 
16719
      for (unsigned int r = 0; r < 1; r++)
 
16720
      {
 
16721
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16722
        ss = r*(r + 1)*(r + 2)/6;
 
16723
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16724
      }// end loop over 'r'
 
16725
      for (unsigned int r = 0; r < 1; r++)
 
16726
      {
 
16727
        for (unsigned int s = 0; s < 1 - r; s++)
 
16728
        {
 
16729
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16730
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16731
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16732
        }// end loop over 's'
 
16733
      }// end loop over 'r'
 
16734
      for (unsigned int r = 0; r < 2; r++)
 
16735
      {
 
16736
        for (unsigned int s = 0; s < 2 - r; s++)
 
16737
        {
 
16738
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16739
          {
 
16740
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16741
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16742
          }// end loop over 't'
 
16743
        }// end loop over 's'
 
16744
      }// end loop over 'r'
 
16745
      
 
16746
      // Table(s) of coefficients.
 
16747
      static const double coefficients0[4] = \
 
16748
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
16749
      
 
16750
      // Tables of derivatives of the polynomial base (transpose).
 
16751
      static const double dmats0[4][4] = \
 
16752
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16753
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
16754
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16755
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16756
      
 
16757
      static const double dmats1[4][4] = \
 
16758
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16759
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16760
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
16761
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16762
      
 
16763
      static const double dmats2[4][4] = \
 
16764
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16765
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16766
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
16767
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
16768
      
 
16769
      // Compute reference derivatives.
 
16770
      // Declare pointer to array of derivatives on FIAT element.
 
16771
      double *derivatives = new double[num_derivatives];
 
16772
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16773
      {
 
16774
        derivatives[r] = 0.00000000;
 
16775
      }// end loop over 'r'
 
16776
      
 
16777
      // Declare derivative matrix (of polynomial basis).
 
16778
      double dmats[4][4] = \
 
16779
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16780
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16781
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16782
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16783
      
 
16784
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16785
      double dmats_old[4][4] = \
 
16786
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16787
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16788
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16789
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16790
      
 
16791
      // Loop possible derivatives.
 
16792
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16793
      {
 
16794
        // Resetting dmats values to compute next derivative.
 
16795
        for (unsigned int t = 0; t < 4; t++)
 
16796
        {
 
16797
          for (unsigned int u = 0; u < 4; u++)
 
16798
          {
 
16799
            dmats[t][u] = 0.00000000;
 
16800
            if (t == u)
 
16801
            {
 
16802
            dmats[t][u] = 1.00000000;
 
16803
            }
 
16804
            
 
16805
          }// end loop over 'u'
 
16806
        }// end loop over 't'
 
16807
        
 
16808
        // Looping derivative order to generate dmats.
 
16809
        for (unsigned int s = 0; s < n; s++)
 
16810
        {
 
16811
          // Updating dmats_old with new values and resetting dmats.
 
16812
          for (unsigned int t = 0; t < 4; t++)
 
16813
          {
 
16814
            for (unsigned int u = 0; u < 4; u++)
 
16815
            {
 
16816
              dmats_old[t][u] = dmats[t][u];
 
16817
              dmats[t][u] = 0.00000000;
 
16818
            }// end loop over 'u'
 
16819
          }// end loop over 't'
 
16820
          
 
16821
          // Update dmats using an inner product.
 
16822
          if (combinations[r][s] == 0)
 
16823
          {
 
16824
          for (unsigned int t = 0; t < 4; t++)
 
16825
          {
 
16826
            for (unsigned int u = 0; u < 4; u++)
 
16827
            {
 
16828
              for (unsigned int tu = 0; tu < 4; tu++)
 
16829
              {
 
16830
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
16831
              }// end loop over 'tu'
 
16832
            }// end loop over 'u'
 
16833
          }// end loop over 't'
 
16834
          }
 
16835
          
 
16836
          if (combinations[r][s] == 1)
 
16837
          {
 
16838
          for (unsigned int t = 0; t < 4; t++)
 
16839
          {
 
16840
            for (unsigned int u = 0; u < 4; u++)
 
16841
            {
 
16842
              for (unsigned int tu = 0; tu < 4; tu++)
 
16843
              {
 
16844
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
16845
              }// end loop over 'tu'
 
16846
            }// end loop over 'u'
 
16847
          }// end loop over 't'
 
16848
          }
 
16849
          
 
16850
          if (combinations[r][s] == 2)
 
16851
          {
 
16852
          for (unsigned int t = 0; t < 4; t++)
 
16853
          {
 
16854
            for (unsigned int u = 0; u < 4; u++)
 
16855
            {
 
16856
              for (unsigned int tu = 0; tu < 4; tu++)
 
16857
              {
 
16858
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
16859
              }// end loop over 'tu'
 
16860
            }// end loop over 'u'
 
16861
          }// end loop over 't'
 
16862
          }
 
16863
          
 
16864
        }// end loop over 's'
 
16865
        for (unsigned int s = 0; s < 4; s++)
 
16866
        {
 
16867
          for (unsigned int t = 0; t < 4; t++)
 
16868
          {
 
16869
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
16870
          }// end loop over 't'
 
16871
        }// end loop over 's'
 
16872
      }// end loop over 'r'
 
16873
      
 
16874
      // Transform derivatives back to physical element
 
16875
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16876
      {
 
16877
        for (unsigned int s = 0; s < num_derivatives; s++)
 
16878
        {
 
16879
          values[r] += transform[r][s]*derivatives[s];
 
16880
        }// end loop over 's'
 
16881
      }// end loop over 'r'
 
16882
      
 
16883
      // Delete pointer to array of derivatives on FIAT element
 
16884
      delete [] derivatives;
 
16885
      
 
16886
      // Delete pointer to array of combinations of derivatives and transform
 
16887
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16888
      {
 
16889
        delete [] combinations[r];
 
16890
      }// end loop over 'r'
 
16891
      delete [] combinations;
 
16892
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16893
      {
 
16894
        delete [] transform[r];
 
16895
      }// end loop over 'r'
 
16896
      delete [] transform;
 
16897
        break;
 
16898
      }
 
16899
    case 3:
 
16900
      {
 
16901
        
 
16902
      // Array of basisvalues.
 
16903
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
16904
      
 
16905
      // Declare helper variables.
 
16906
      unsigned int rr = 0;
 
16907
      unsigned int ss = 0;
 
16908
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
16909
      
 
16910
      // Compute basisvalues.
 
16911
      basisvalues[0] = 1.00000000;
 
16912
      basisvalues[1] = tmp0;
 
16913
      for (unsigned int r = 0; r < 1; r++)
 
16914
      {
 
16915
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16916
        ss = r*(r + 1)*(r + 2)/6;
 
16917
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
16918
      }// end loop over 'r'
 
16919
      for (unsigned int r = 0; r < 1; r++)
 
16920
      {
 
16921
        for (unsigned int s = 0; s < 1 - r; s++)
 
16922
        {
 
16923
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16924
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16925
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
16926
        }// end loop over 's'
 
16927
      }// end loop over 'r'
 
16928
      for (unsigned int r = 0; r < 2; r++)
 
16929
      {
 
16930
        for (unsigned int s = 0; s < 2 - r; s++)
 
16931
        {
 
16932
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16933
          {
 
16934
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16935
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
16936
          }// end loop over 't'
 
16937
        }// end loop over 's'
 
16938
      }// end loop over 'r'
 
16939
      
 
16940
      // Table(s) of coefficients.
 
16941
      static const double coefficients0[4] = \
 
16942
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
16943
      
 
16944
      // Tables of derivatives of the polynomial base (transpose).
 
16945
      static const double dmats0[4][4] = \
 
16946
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16947
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
16948
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16949
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16950
      
 
16951
      static const double dmats1[4][4] = \
 
16952
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16953
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16954
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
16955
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
16956
      
 
16957
      static const double dmats2[4][4] = \
 
16958
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16959
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
16960
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
16961
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
16962
      
 
16963
      // Compute reference derivatives.
 
16964
      // Declare pointer to array of derivatives on FIAT element.
 
16965
      double *derivatives = new double[num_derivatives];
 
16966
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16967
      {
 
16968
        derivatives[r] = 0.00000000;
 
16969
      }// end loop over 'r'
 
16970
      
 
16971
      // Declare derivative matrix (of polynomial basis).
 
16972
      double dmats[4][4] = \
 
16973
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16974
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16975
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16976
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16977
      
 
16978
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16979
      double dmats_old[4][4] = \
 
16980
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
16981
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
16982
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
16983
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
16984
      
 
16985
      // Loop possible derivatives.
 
16986
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16987
      {
 
16988
        // Resetting dmats values to compute next derivative.
 
16989
        for (unsigned int t = 0; t < 4; t++)
 
16990
        {
 
16991
          for (unsigned int u = 0; u < 4; u++)
 
16992
          {
 
16993
            dmats[t][u] = 0.00000000;
 
16994
            if (t == u)
 
16995
            {
 
16996
            dmats[t][u] = 1.00000000;
 
16997
            }
 
16998
            
 
16999
          }// end loop over 'u'
 
17000
        }// end loop over 't'
 
17001
        
 
17002
        // Looping derivative order to generate dmats.
 
17003
        for (unsigned int s = 0; s < n; s++)
 
17004
        {
 
17005
          // Updating dmats_old with new values and resetting dmats.
 
17006
          for (unsigned int t = 0; t < 4; t++)
 
17007
          {
 
17008
            for (unsigned int u = 0; u < 4; u++)
 
17009
            {
 
17010
              dmats_old[t][u] = dmats[t][u];
 
17011
              dmats[t][u] = 0.00000000;
 
17012
            }// end loop over 'u'
 
17013
          }// end loop over 't'
 
17014
          
 
17015
          // Update dmats using an inner product.
 
17016
          if (combinations[r][s] == 0)
 
17017
          {
 
17018
          for (unsigned int t = 0; t < 4; t++)
 
17019
          {
 
17020
            for (unsigned int u = 0; u < 4; u++)
 
17021
            {
 
17022
              for (unsigned int tu = 0; tu < 4; tu++)
 
17023
              {
 
17024
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
17025
              }// end loop over 'tu'
 
17026
            }// end loop over 'u'
 
17027
          }// end loop over 't'
 
17028
          }
 
17029
          
 
17030
          if (combinations[r][s] == 1)
 
17031
          {
 
17032
          for (unsigned int t = 0; t < 4; t++)
 
17033
          {
 
17034
            for (unsigned int u = 0; u < 4; u++)
 
17035
            {
 
17036
              for (unsigned int tu = 0; tu < 4; tu++)
 
17037
              {
 
17038
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
17039
              }// end loop over 'tu'
 
17040
            }// end loop over 'u'
 
17041
          }// end loop over 't'
 
17042
          }
 
17043
          
 
17044
          if (combinations[r][s] == 2)
 
17045
          {
 
17046
          for (unsigned int t = 0; t < 4; t++)
 
17047
          {
 
17048
            for (unsigned int u = 0; u < 4; u++)
 
17049
            {
 
17050
              for (unsigned int tu = 0; tu < 4; tu++)
 
17051
              {
 
17052
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
17053
              }// end loop over 'tu'
 
17054
            }// end loop over 'u'
 
17055
          }// end loop over 't'
 
17056
          }
 
17057
          
 
17058
        }// end loop over 's'
 
17059
        for (unsigned int s = 0; s < 4; s++)
 
17060
        {
 
17061
          for (unsigned int t = 0; t < 4; t++)
 
17062
          {
 
17063
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
17064
          }// end loop over 't'
 
17065
        }// end loop over 's'
 
17066
      }// end loop over 'r'
 
17067
      
 
17068
      // Transform derivatives back to physical element
 
17069
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17070
      {
 
17071
        for (unsigned int s = 0; s < num_derivatives; s++)
 
17072
        {
 
17073
          values[r] += transform[r][s]*derivatives[s];
 
17074
        }// end loop over 's'
 
17075
      }// end loop over 'r'
 
17076
      
 
17077
      // Delete pointer to array of derivatives on FIAT element
 
17078
      delete [] derivatives;
 
17079
      
 
17080
      // Delete pointer to array of combinations of derivatives and transform
 
17081
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17082
      {
 
17083
        delete [] combinations[r];
 
17084
      }// end loop over 'r'
 
17085
      delete [] combinations;
 
17086
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17087
      {
 
17088
        delete [] transform[r];
 
17089
      }// end loop over 'r'
 
17090
      delete [] transform;
 
17091
        break;
 
17092
      }
 
17093
    }
 
17094
    
3313
17095
  }
3314
17096
 
3315
17097
  /// Evaluate order n derivatives of all basis functions at given point in cell
3576
17358
    values[0] = 0.00000000;
3577
17359
    values[1] = 0.00000000;
3578
17360
    values[2] = 0.00000000;
3579
 
    
3580
 
    // Map degree of freedom to element degree of freedom
3581
 
    const unsigned int dof = i;
3582
 
    
3583
 
    // Array of basisvalues.
3584
 
    double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3585
 
    
3586
 
    // Declare helper variables.
3587
 
    unsigned int rr = 0;
3588
 
    unsigned int ss = 0;
3589
 
    double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3590
 
    
3591
 
    // Compute basisvalues.
3592
 
    basisvalues[0] = 1.00000000;
3593
 
    basisvalues[1] = tmp0;
3594
 
    for (unsigned int r = 0; r < 1; r++)
3595
 
    {
3596
 
      rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3597
 
      ss = r*(r + 1)*(r + 2)/6;
3598
 
      basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3599
 
    }// end loop over 'r'
3600
 
    for (unsigned int r = 0; r < 1; r++)
3601
 
    {
3602
 
      for (unsigned int s = 0; s < 1 - r; s++)
3603
 
      {
3604
 
        rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3605
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3606
 
        basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3607
 
      }// end loop over 's'
3608
 
    }// end loop over 'r'
3609
 
    for (unsigned int r = 0; r < 2; r++)
3610
 
    {
3611
 
      for (unsigned int s = 0; s < 2 - r; s++)
3612
 
      {
3613
 
        for (unsigned int t = 0; t < 2 - r - s; t++)
3614
 
        {
3615
 
          rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3616
 
          basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3617
 
        }// end loop over 't'
3618
 
      }// end loop over 's'
3619
 
    }// end loop over 'r'
3620
 
    
3621
 
    // Table(s) of coefficients.
3622
 
    static const double coefficients0[6][4] = \
3623
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3624
 
    {-0.28867513, 0.00000000, 0.00000000, -0.22360680},
3625
 
    {-0.28867513, 0.00000000, -0.21081851, 0.07453560},
3626
 
    {0.28867513, 0.00000000, 0.00000000, 0.22360680},
3627
 
    {0.28867513, 0.00000000, 0.21081851, -0.07453560},
3628
 
    {0.57735027, 0.00000000, -0.21081851, -0.14907120}};
3629
 
    
3630
 
    static const double coefficients1[6][4] = \
3631
 
    {{-0.28867513, 0.00000000, 0.00000000, -0.22360680},
3632
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000},
3633
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560},
3634
 
    {0.28867513, 0.00000000, 0.00000000, 0.22360680},
3635
 
    {0.57735027, -0.18257419, 0.10540926, -0.14907120},
3636
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
3637
 
    
3638
 
    static const double coefficients2[6][4] = \
3639
 
    {{0.28867513, 0.00000000, 0.21081851, -0.07453560},
3640
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560},
3641
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000},
3642
 
    {0.57735027, -0.18257419, -0.10540926, 0.14907120},
3643
 
    {0.28867513, 0.00000000, 0.21081851, -0.07453560},
3644
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
3645
 
    
3646
 
    // Compute value(s).
3647
 
    for (unsigned int r = 0; r < 4; r++)
3648
 
    {
3649
 
      values[0] += coefficients0[dof][r]*basisvalues[r];
3650
 
      values[1] += coefficients1[dof][r]*basisvalues[r];
3651
 
      values[2] += coefficients2[dof][r]*basisvalues[r];
3652
 
    }// end loop over 'r'
3653
 
    
3654
 
    // Using covariant Piola transform to map values back to the physical element.
3655
 
    const double tmp_ref0 = values[0];
3656
 
    const double tmp_ref1 = values[1];
3657
 
    const double tmp_ref2 = values[2];
3658
 
    values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
3659
 
    values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
3660
 
    values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17361
    switch (i)
 
17362
    {
 
17363
    case 0:
 
17364
      {
 
17365
        
 
17366
      // Array of basisvalues.
 
17367
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17368
      
 
17369
      // Declare helper variables.
 
17370
      unsigned int rr = 0;
 
17371
      unsigned int ss = 0;
 
17372
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17373
      
 
17374
      // Compute basisvalues.
 
17375
      basisvalues[0] = 1.00000000;
 
17376
      basisvalues[1] = tmp0;
 
17377
      for (unsigned int r = 0; r < 1; r++)
 
17378
      {
 
17379
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17380
        ss = r*(r + 1)*(r + 2)/6;
 
17381
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17382
      }// end loop over 'r'
 
17383
      for (unsigned int r = 0; r < 1; r++)
 
17384
      {
 
17385
        for (unsigned int s = 0; s < 1 - r; s++)
 
17386
        {
 
17387
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17388
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17389
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17390
        }// end loop over 's'
 
17391
      }// end loop over 'r'
 
17392
      for (unsigned int r = 0; r < 2; r++)
 
17393
      {
 
17394
        for (unsigned int s = 0; s < 2 - r; s++)
 
17395
        {
 
17396
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17397
          {
 
17398
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17399
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17400
          }// end loop over 't'
 
17401
        }// end loop over 's'
 
17402
      }// end loop over 'r'
 
17403
      
 
17404
      // Table(s) of coefficients.
 
17405
      static const double coefficients0[4] = \
 
17406
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17407
      
 
17408
      static const double coefficients1[4] = \
 
17409
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
17410
      
 
17411
      static const double coefficients2[4] = \
 
17412
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
17413
      
 
17414
      // Compute value(s).
 
17415
      for (unsigned int r = 0; r < 4; r++)
 
17416
      {
 
17417
        values[0] += coefficients0[r]*basisvalues[r];
 
17418
        values[1] += coefficients1[r]*basisvalues[r];
 
17419
        values[2] += coefficients2[r]*basisvalues[r];
 
17420
      }// end loop over 'r'
 
17421
      
 
17422
      // Using covariant Piola transform to map values back to the physical element.
 
17423
      const double tmp_ref0 = values[0];
 
17424
      const double tmp_ref1 = values[1];
 
17425
      const double tmp_ref2 = values[2];
 
17426
      values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
17427
      values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
17428
      values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17429
        break;
 
17430
      }
 
17431
    case 1:
 
17432
      {
 
17433
        
 
17434
      // Array of basisvalues.
 
17435
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17436
      
 
17437
      // Declare helper variables.
 
17438
      unsigned int rr = 0;
 
17439
      unsigned int ss = 0;
 
17440
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17441
      
 
17442
      // Compute basisvalues.
 
17443
      basisvalues[0] = 1.00000000;
 
17444
      basisvalues[1] = tmp0;
 
17445
      for (unsigned int r = 0; r < 1; r++)
 
17446
      {
 
17447
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17448
        ss = r*(r + 1)*(r + 2)/6;
 
17449
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17450
      }// end loop over 'r'
 
17451
      for (unsigned int r = 0; r < 1; r++)
 
17452
      {
 
17453
        for (unsigned int s = 0; s < 1 - r; s++)
 
17454
        {
 
17455
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17456
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17457
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17458
        }// end loop over 's'
 
17459
      }// end loop over 'r'
 
17460
      for (unsigned int r = 0; r < 2; r++)
 
17461
      {
 
17462
        for (unsigned int s = 0; s < 2 - r; s++)
 
17463
        {
 
17464
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17465
          {
 
17466
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17467
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17468
          }// end loop over 't'
 
17469
        }// end loop over 's'
 
17470
      }// end loop over 'r'
 
17471
      
 
17472
      // Table(s) of coefficients.
 
17473
      static const double coefficients0[4] = \
 
17474
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
17475
      
 
17476
      static const double coefficients1[4] = \
 
17477
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17478
      
 
17479
      static const double coefficients2[4] = \
 
17480
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
17481
      
 
17482
      // Compute value(s).
 
17483
      for (unsigned int r = 0; r < 4; r++)
 
17484
      {
 
17485
        values[0] += coefficients0[r]*basisvalues[r];
 
17486
        values[1] += coefficients1[r]*basisvalues[r];
 
17487
        values[2] += coefficients2[r]*basisvalues[r];
 
17488
      }// end loop over 'r'
 
17489
      
 
17490
      // Using covariant Piola transform to map values back to the physical element.
 
17491
      const double tmp_ref0 = values[0];
 
17492
      const double tmp_ref1 = values[1];
 
17493
      const double tmp_ref2 = values[2];
 
17494
      values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
17495
      values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
17496
      values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17497
        break;
 
17498
      }
 
17499
    case 2:
 
17500
      {
 
17501
        
 
17502
      // Array of basisvalues.
 
17503
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17504
      
 
17505
      // Declare helper variables.
 
17506
      unsigned int rr = 0;
 
17507
      unsigned int ss = 0;
 
17508
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17509
      
 
17510
      // Compute basisvalues.
 
17511
      basisvalues[0] = 1.00000000;
 
17512
      basisvalues[1] = tmp0;
 
17513
      for (unsigned int r = 0; r < 1; r++)
 
17514
      {
 
17515
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17516
        ss = r*(r + 1)*(r + 2)/6;
 
17517
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17518
      }// end loop over 'r'
 
17519
      for (unsigned int r = 0; r < 1; r++)
 
17520
      {
 
17521
        for (unsigned int s = 0; s < 1 - r; s++)
 
17522
        {
 
17523
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17524
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17525
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17526
        }// end loop over 's'
 
17527
      }// end loop over 'r'
 
17528
      for (unsigned int r = 0; r < 2; r++)
 
17529
      {
 
17530
        for (unsigned int s = 0; s < 2 - r; s++)
 
17531
        {
 
17532
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17533
          {
 
17534
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17535
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17536
          }// end loop over 't'
 
17537
        }// end loop over 's'
 
17538
      }// end loop over 'r'
 
17539
      
 
17540
      // Table(s) of coefficients.
 
17541
      static const double coefficients0[4] = \
 
17542
      {-0.28867513, 0.00000000, -0.21081851, 0.07453560};
 
17543
      
 
17544
      static const double coefficients1[4] = \
 
17545
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
17546
      
 
17547
      static const double coefficients2[4] = \
 
17548
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17549
      
 
17550
      // Compute value(s).
 
17551
      for (unsigned int r = 0; r < 4; r++)
 
17552
      {
 
17553
        values[0] += coefficients0[r]*basisvalues[r];
 
17554
        values[1] += coefficients1[r]*basisvalues[r];
 
17555
        values[2] += coefficients2[r]*basisvalues[r];
 
17556
      }// end loop over 'r'
 
17557
      
 
17558
      // Using covariant Piola transform to map values back to the physical element.
 
17559
      const double tmp_ref0 = values[0];
 
17560
      const double tmp_ref1 = values[1];
 
17561
      const double tmp_ref2 = values[2];
 
17562
      values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
17563
      values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
17564
      values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17565
        break;
 
17566
      }
 
17567
    case 3:
 
17568
      {
 
17569
        
 
17570
      // Array of basisvalues.
 
17571
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17572
      
 
17573
      // Declare helper variables.
 
17574
      unsigned int rr = 0;
 
17575
      unsigned int ss = 0;
 
17576
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17577
      
 
17578
      // Compute basisvalues.
 
17579
      basisvalues[0] = 1.00000000;
 
17580
      basisvalues[1] = tmp0;
 
17581
      for (unsigned int r = 0; r < 1; r++)
 
17582
      {
 
17583
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17584
        ss = r*(r + 1)*(r + 2)/6;
 
17585
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17586
      }// end loop over 'r'
 
17587
      for (unsigned int r = 0; r < 1; r++)
 
17588
      {
 
17589
        for (unsigned int s = 0; s < 1 - r; s++)
 
17590
        {
 
17591
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17592
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17593
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17594
        }// end loop over 's'
 
17595
      }// end loop over 'r'
 
17596
      for (unsigned int r = 0; r < 2; r++)
 
17597
      {
 
17598
        for (unsigned int s = 0; s < 2 - r; s++)
 
17599
        {
 
17600
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17601
          {
 
17602
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17603
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17604
          }// end loop over 't'
 
17605
        }// end loop over 's'
 
17606
      }// end loop over 'r'
 
17607
      
 
17608
      // Table(s) of coefficients.
 
17609
      static const double coefficients0[4] = \
 
17610
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
17611
      
 
17612
      static const double coefficients1[4] = \
 
17613
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
17614
      
 
17615
      static const double coefficients2[4] = \
 
17616
      {0.57735027, -0.18257419, -0.10540926, 0.14907120};
 
17617
      
 
17618
      // Compute value(s).
 
17619
      for (unsigned int r = 0; r < 4; r++)
 
17620
      {
 
17621
        values[0] += coefficients0[r]*basisvalues[r];
 
17622
        values[1] += coefficients1[r]*basisvalues[r];
 
17623
        values[2] += coefficients2[r]*basisvalues[r];
 
17624
      }// end loop over 'r'
 
17625
      
 
17626
      // Using covariant Piola transform to map values back to the physical element.
 
17627
      const double tmp_ref0 = values[0];
 
17628
      const double tmp_ref1 = values[1];
 
17629
      const double tmp_ref2 = values[2];
 
17630
      values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
17631
      values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
17632
      values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17633
        break;
 
17634
      }
 
17635
    case 4:
 
17636
      {
 
17637
        
 
17638
      // Array of basisvalues.
 
17639
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17640
      
 
17641
      // Declare helper variables.
 
17642
      unsigned int rr = 0;
 
17643
      unsigned int ss = 0;
 
17644
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17645
      
 
17646
      // Compute basisvalues.
 
17647
      basisvalues[0] = 1.00000000;
 
17648
      basisvalues[1] = tmp0;
 
17649
      for (unsigned int r = 0; r < 1; r++)
 
17650
      {
 
17651
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17652
        ss = r*(r + 1)*(r + 2)/6;
 
17653
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17654
      }// end loop over 'r'
 
17655
      for (unsigned int r = 0; r < 1; r++)
 
17656
      {
 
17657
        for (unsigned int s = 0; s < 1 - r; s++)
 
17658
        {
 
17659
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17660
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17661
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17662
        }// end loop over 's'
 
17663
      }// end loop over 'r'
 
17664
      for (unsigned int r = 0; r < 2; r++)
 
17665
      {
 
17666
        for (unsigned int s = 0; s < 2 - r; s++)
 
17667
        {
 
17668
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17669
          {
 
17670
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17671
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17672
          }// end loop over 't'
 
17673
        }// end loop over 's'
 
17674
      }// end loop over 'r'
 
17675
      
 
17676
      // Table(s) of coefficients.
 
17677
      static const double coefficients0[4] = \
 
17678
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
17679
      
 
17680
      static const double coefficients1[4] = \
 
17681
      {0.57735027, -0.18257419, 0.10540926, -0.14907120};
 
17682
      
 
17683
      static const double coefficients2[4] = \
 
17684
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
17685
      
 
17686
      // Compute value(s).
 
17687
      for (unsigned int r = 0; r < 4; r++)
 
17688
      {
 
17689
        values[0] += coefficients0[r]*basisvalues[r];
 
17690
        values[1] += coefficients1[r]*basisvalues[r];
 
17691
        values[2] += coefficients2[r]*basisvalues[r];
 
17692
      }// end loop over 'r'
 
17693
      
 
17694
      // Using covariant Piola transform to map values back to the physical element.
 
17695
      const double tmp_ref0 = values[0];
 
17696
      const double tmp_ref1 = values[1];
 
17697
      const double tmp_ref2 = values[2];
 
17698
      values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
17699
      values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
17700
      values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17701
        break;
 
17702
      }
 
17703
    case 5:
 
17704
      {
 
17705
        
 
17706
      // Array of basisvalues.
 
17707
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17708
      
 
17709
      // Declare helper variables.
 
17710
      unsigned int rr = 0;
 
17711
      unsigned int ss = 0;
 
17712
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17713
      
 
17714
      // Compute basisvalues.
 
17715
      basisvalues[0] = 1.00000000;
 
17716
      basisvalues[1] = tmp0;
 
17717
      for (unsigned int r = 0; r < 1; r++)
 
17718
      {
 
17719
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17720
        ss = r*(r + 1)*(r + 2)/6;
 
17721
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17722
      }// end loop over 'r'
 
17723
      for (unsigned int r = 0; r < 1; r++)
 
17724
      {
 
17725
        for (unsigned int s = 0; s < 1 - r; s++)
 
17726
        {
 
17727
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17728
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17729
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17730
        }// end loop over 's'
 
17731
      }// end loop over 'r'
 
17732
      for (unsigned int r = 0; r < 2; r++)
 
17733
      {
 
17734
        for (unsigned int s = 0; s < 2 - r; s++)
 
17735
        {
 
17736
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17737
          {
 
17738
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17739
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17740
          }// end loop over 't'
 
17741
        }// end loop over 's'
 
17742
      }// end loop over 'r'
 
17743
      
 
17744
      // Table(s) of coefficients.
 
17745
      static const double coefficients0[4] = \
 
17746
      {0.57735027, 0.00000000, -0.21081851, -0.14907120};
 
17747
      
 
17748
      static const double coefficients1[4] = \
 
17749
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
17750
      
 
17751
      static const double coefficients2[4] = \
 
17752
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
17753
      
 
17754
      // Compute value(s).
 
17755
      for (unsigned int r = 0; r < 4; r++)
 
17756
      {
 
17757
        values[0] += coefficients0[r]*basisvalues[r];
 
17758
        values[1] += coefficients1[r]*basisvalues[r];
 
17759
        values[2] += coefficients2[r]*basisvalues[r];
 
17760
      }// end loop over 'r'
 
17761
      
 
17762
      // Using covariant Piola transform to map values back to the physical element.
 
17763
      const double tmp_ref0 = values[0];
 
17764
      const double tmp_ref1 = values[1];
 
17765
      const double tmp_ref2 = values[2];
 
17766
      values[0] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
17767
      values[1] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
17768
      values[2] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
17769
        break;
 
17770
      }
 
17771
    }
 
17772
    
3661
17773
  }
3662
17774
 
3663
17775
  /// Evaluate all basis functions at given point in cell
3800
17912
      values[r] = 0.00000000;
3801
17913
    }// end loop over 'r'
3802
17914
    
3803
 
    // Map degree of freedom to element degree of freedom
3804
 
    const unsigned int dof = i;
3805
 
    
3806
 
    // Array of basisvalues.
3807
 
    double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
3808
 
    
3809
 
    // Declare helper variables.
3810
 
    unsigned int rr = 0;
3811
 
    unsigned int ss = 0;
3812
 
    double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3813
 
    
3814
 
    // Compute basisvalues.
3815
 
    basisvalues[0] = 1.00000000;
3816
 
    basisvalues[1] = tmp0;
3817
 
    for (unsigned int r = 0; r < 1; r++)
3818
 
    {
3819
 
      rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3820
 
      ss = r*(r + 1)*(r + 2)/6;
3821
 
      basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3822
 
    }// end loop over 'r'
3823
 
    for (unsigned int r = 0; r < 1; r++)
3824
 
    {
3825
 
      for (unsigned int s = 0; s < 1 - r; s++)
3826
 
      {
3827
 
        rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3828
 
        ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3829
 
        basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3830
 
      }// end loop over 's'
3831
 
    }// end loop over 'r'
3832
 
    for (unsigned int r = 0; r < 2; r++)
3833
 
    {
3834
 
      for (unsigned int s = 0; s < 2 - r; s++)
3835
 
      {
3836
 
        for (unsigned int t = 0; t < 2 - r - s; t++)
3837
 
        {
3838
 
          rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3839
 
          basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3840
 
        }// end loop over 't'
3841
 
      }// end loop over 's'
3842
 
    }// end loop over 'r'
3843
 
    
3844
 
    // Table(s) of coefficients.
3845
 
    static const double coefficients0[6][4] = \
3846
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3847
 
    {-0.28867513, 0.00000000, 0.00000000, -0.22360680},
3848
 
    {-0.28867513, 0.00000000, -0.21081851, 0.07453560},
3849
 
    {0.28867513, 0.00000000, 0.00000000, 0.22360680},
3850
 
    {0.28867513, 0.00000000, 0.21081851, -0.07453560},
3851
 
    {0.57735027, 0.00000000, -0.21081851, -0.14907120}};
3852
 
    
3853
 
    static const double coefficients1[6][4] = \
3854
 
    {{-0.28867513, 0.00000000, 0.00000000, -0.22360680},
3855
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000},
3856
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560},
3857
 
    {0.28867513, 0.00000000, 0.00000000, 0.22360680},
3858
 
    {0.57735027, -0.18257419, 0.10540926, -0.14907120},
3859
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
3860
 
    
3861
 
    static const double coefficients2[6][4] = \
3862
 
    {{0.28867513, 0.00000000, 0.21081851, -0.07453560},
3863
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560},
3864
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000},
3865
 
    {0.57735027, -0.18257419, -0.10540926, 0.14907120},
3866
 
    {0.28867513, 0.00000000, 0.21081851, -0.07453560},
3867
 
    {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
3868
 
    
3869
 
    // Tables of derivatives of the polynomial base (transpose).
3870
 
    static const double dmats0[4][4] = \
3871
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3872
 
    {6.32455532, 0.00000000, 0.00000000, 0.00000000},
3873
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000},
3874
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3875
 
    
3876
 
    static const double dmats1[4][4] = \
3877
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3878
 
    {3.16227766, 0.00000000, 0.00000000, 0.00000000},
3879
 
    {5.47722558, 0.00000000, 0.00000000, 0.00000000},
3880
 
    {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3881
 
    
3882
 
    static const double dmats2[4][4] = \
3883
 
    {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
3884
 
    {3.16227766, 0.00000000, 0.00000000, 0.00000000},
3885
 
    {1.82574186, 0.00000000, 0.00000000, 0.00000000},
3886
 
    {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
3887
 
    
3888
 
    // Compute reference derivatives.
3889
 
    // Declare pointer to array of derivatives on FIAT element.
3890
 
    double *derivatives = new double[3*num_derivatives];
3891
 
    for (unsigned int r = 0; r < 3*num_derivatives; r++)
3892
 
    {
3893
 
      derivatives[r] = 0.00000000;
3894
 
    }// end loop over 'r'
3895
 
    
3896
 
    // Declare derivative matrix (of polynomial basis).
3897
 
    double dmats[4][4] = \
3898
 
    {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3899
 
    {0.00000000, 1.00000000, 0.00000000, 0.00000000},
3900
 
    {0.00000000, 0.00000000, 1.00000000, 0.00000000},
3901
 
    {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3902
 
    
3903
 
    // Declare (auxiliary) derivative matrix (of polynomial basis).
3904
 
    double dmats_old[4][4] = \
3905
 
    {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
3906
 
    {0.00000000, 1.00000000, 0.00000000, 0.00000000},
3907
 
    {0.00000000, 0.00000000, 1.00000000, 0.00000000},
3908
 
    {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3909
 
    
3910
 
    // Loop possible derivatives.
3911
 
    for (unsigned int r = 0; r < num_derivatives; r++)
3912
 
    {
3913
 
      // Resetting dmats values to compute next derivative.
3914
 
      for (unsigned int t = 0; t < 4; t++)
3915
 
      {
3916
 
        for (unsigned int u = 0; u < 4; u++)
3917
 
        {
3918
 
          dmats[t][u] = 0.00000000;
3919
 
          if (t == u)
3920
 
          {
3921
 
          dmats[t][u] = 1.00000000;
3922
 
          }
3923
 
          
3924
 
        }// end loop over 'u'
3925
 
      }// end loop over 't'
3926
 
      
3927
 
      // Looping derivative order to generate dmats.
3928
 
      for (unsigned int s = 0; s < n; s++)
3929
 
      {
3930
 
        // Updating dmats_old with new values and resetting dmats.
3931
 
        for (unsigned int t = 0; t < 4; t++)
3932
 
        {
3933
 
          for (unsigned int u = 0; u < 4; u++)
3934
 
          {
3935
 
            dmats_old[t][u] = dmats[t][u];
3936
 
            dmats[t][u] = 0.00000000;
3937
 
          }// end loop over 'u'
3938
 
        }// end loop over 't'
3939
 
        
3940
 
        // Update dmats using an inner product.
3941
 
        if (combinations[r][s] == 0)
3942
 
        {
3943
 
        for (unsigned int t = 0; t < 4; t++)
3944
 
        {
3945
 
          for (unsigned int u = 0; u < 4; u++)
3946
 
          {
3947
 
            for (unsigned int tu = 0; tu < 4; tu++)
3948
 
            {
3949
 
              dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3950
 
            }// end loop over 'tu'
3951
 
          }// end loop over 'u'
3952
 
        }// end loop over 't'
3953
 
        }
3954
 
        
3955
 
        if (combinations[r][s] == 1)
3956
 
        {
3957
 
        for (unsigned int t = 0; t < 4; t++)
3958
 
        {
3959
 
          for (unsigned int u = 0; u < 4; u++)
3960
 
          {
3961
 
            for (unsigned int tu = 0; tu < 4; tu++)
3962
 
            {
3963
 
              dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3964
 
            }// end loop over 'tu'
3965
 
          }// end loop over 'u'
3966
 
        }// end loop over 't'
3967
 
        }
3968
 
        
3969
 
        if (combinations[r][s] == 2)
3970
 
        {
3971
 
        for (unsigned int t = 0; t < 4; t++)
3972
 
        {
3973
 
          for (unsigned int u = 0; u < 4; u++)
3974
 
          {
3975
 
            for (unsigned int tu = 0; tu < 4; tu++)
3976
 
            {
3977
 
              dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3978
 
            }// end loop over 'tu'
3979
 
          }// end loop over 'u'
3980
 
        }// end loop over 't'
3981
 
        }
3982
 
        
3983
 
      }// end loop over 's'
3984
 
      for (unsigned int s = 0; s < 4; s++)
3985
 
      {
3986
 
        for (unsigned int t = 0; t < 4; t++)
3987
 
        {
3988
 
          derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
3989
 
          derivatives[num_derivatives + r] += coefficients1[dof][s]*dmats[s][t]*basisvalues[t];
3990
 
          derivatives[2*num_derivatives + r] += coefficients2[dof][s]*dmats[s][t]*basisvalues[t];
3991
 
        }// end loop over 't'
3992
 
      }// end loop over 's'
3993
 
      
3994
 
      // Using covariant Piola transform to map values back to the physical element
3995
 
      const double tmp_ref0 = derivatives[r];
3996
 
      const double tmp_ref1 = derivatives[num_derivatives + r];
3997
 
      const double tmp_ref2 = derivatives[2*num_derivatives + r];
3998
 
      derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
3999
 
      derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
4000
 
      derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
4001
 
    }// end loop over 'r'
4002
 
    
4003
 
    // Transform derivatives back to physical element
4004
 
    for (unsigned int r = 0; r < num_derivatives; r++)
4005
 
    {
4006
 
      for (unsigned int s = 0; s < num_derivatives; s++)
4007
 
      {
4008
 
        values[r] += transform[r][s]*derivatives[s];
4009
 
        values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
4010
 
        values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
4011
 
      }// end loop over 's'
4012
 
    }// end loop over 'r'
4013
 
    
4014
 
    // Delete pointer to array of derivatives on FIAT element
4015
 
    delete [] derivatives;
4016
 
    
4017
 
    // Delete pointer to array of combinations of derivatives and transform
4018
 
    for (unsigned int r = 0; r < num_derivatives; r++)
4019
 
    {
4020
 
      delete [] combinations[r];
4021
 
    }// end loop over 'r'
4022
 
    delete [] combinations;
4023
 
    for (unsigned int r = 0; r < num_derivatives; r++)
4024
 
    {
4025
 
      delete [] transform[r];
4026
 
    }// end loop over 'r'
4027
 
    delete [] transform;
 
17915
    switch (i)
 
17916
    {
 
17917
    case 0:
 
17918
      {
 
17919
        
 
17920
      // Array of basisvalues.
 
17921
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17922
      
 
17923
      // Declare helper variables.
 
17924
      unsigned int rr = 0;
 
17925
      unsigned int ss = 0;
 
17926
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
17927
      
 
17928
      // Compute basisvalues.
 
17929
      basisvalues[0] = 1.00000000;
 
17930
      basisvalues[1] = tmp0;
 
17931
      for (unsigned int r = 0; r < 1; r++)
 
17932
      {
 
17933
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17934
        ss = r*(r + 1)*(r + 2)/6;
 
17935
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
17936
      }// end loop over 'r'
 
17937
      for (unsigned int r = 0; r < 1; r++)
 
17938
      {
 
17939
        for (unsigned int s = 0; s < 1 - r; s++)
 
17940
        {
 
17941
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17942
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17943
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
17944
        }// end loop over 's'
 
17945
      }// end loop over 'r'
 
17946
      for (unsigned int r = 0; r < 2; r++)
 
17947
      {
 
17948
        for (unsigned int s = 0; s < 2 - r; s++)
 
17949
        {
 
17950
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17951
          {
 
17952
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17953
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
17954
          }// end loop over 't'
 
17955
        }// end loop over 's'
 
17956
      }// end loop over 'r'
 
17957
      
 
17958
      // Table(s) of coefficients.
 
17959
      static const double coefficients0[4] = \
 
17960
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
17961
      
 
17962
      static const double coefficients1[4] = \
 
17963
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
17964
      
 
17965
      static const double coefficients2[4] = \
 
17966
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
17967
      
 
17968
      // Tables of derivatives of the polynomial base (transpose).
 
17969
      static const double dmats0[4][4] = \
 
17970
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
17971
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
17972
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
17973
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
17974
      
 
17975
      static const double dmats1[4][4] = \
 
17976
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
17977
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
17978
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
17979
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
17980
      
 
17981
      static const double dmats2[4][4] = \
 
17982
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
17983
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
17984
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
17985
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
17986
      
 
17987
      // Compute reference derivatives.
 
17988
      // Declare pointer to array of derivatives on FIAT element.
 
17989
      double *derivatives = new double[3*num_derivatives];
 
17990
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
17991
      {
 
17992
        derivatives[r] = 0.00000000;
 
17993
      }// end loop over 'r'
 
17994
      
 
17995
      // Declare derivative matrix (of polynomial basis).
 
17996
      double dmats[4][4] = \
 
17997
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
17998
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
17999
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18000
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18001
      
 
18002
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
18003
      double dmats_old[4][4] = \
 
18004
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18005
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18006
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18007
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18008
      
 
18009
      // Loop possible derivatives.
 
18010
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18011
      {
 
18012
        // Resetting dmats values to compute next derivative.
 
18013
        for (unsigned int t = 0; t < 4; t++)
 
18014
        {
 
18015
          for (unsigned int u = 0; u < 4; u++)
 
18016
          {
 
18017
            dmats[t][u] = 0.00000000;
 
18018
            if (t == u)
 
18019
            {
 
18020
            dmats[t][u] = 1.00000000;
 
18021
            }
 
18022
            
 
18023
          }// end loop over 'u'
 
18024
        }// end loop over 't'
 
18025
        
 
18026
        // Looping derivative order to generate dmats.
 
18027
        for (unsigned int s = 0; s < n; s++)
 
18028
        {
 
18029
          // Updating dmats_old with new values and resetting dmats.
 
18030
          for (unsigned int t = 0; t < 4; t++)
 
18031
          {
 
18032
            for (unsigned int u = 0; u < 4; u++)
 
18033
            {
 
18034
              dmats_old[t][u] = dmats[t][u];
 
18035
              dmats[t][u] = 0.00000000;
 
18036
            }// end loop over 'u'
 
18037
          }// end loop over 't'
 
18038
          
 
18039
          // Update dmats using an inner product.
 
18040
          if (combinations[r][s] == 0)
 
18041
          {
 
18042
          for (unsigned int t = 0; t < 4; t++)
 
18043
          {
 
18044
            for (unsigned int u = 0; u < 4; u++)
 
18045
            {
 
18046
              for (unsigned int tu = 0; tu < 4; tu++)
 
18047
              {
 
18048
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
18049
              }// end loop over 'tu'
 
18050
            }// end loop over 'u'
 
18051
          }// end loop over 't'
 
18052
          }
 
18053
          
 
18054
          if (combinations[r][s] == 1)
 
18055
          {
 
18056
          for (unsigned int t = 0; t < 4; t++)
 
18057
          {
 
18058
            for (unsigned int u = 0; u < 4; u++)
 
18059
            {
 
18060
              for (unsigned int tu = 0; tu < 4; tu++)
 
18061
              {
 
18062
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
18063
              }// end loop over 'tu'
 
18064
            }// end loop over 'u'
 
18065
          }// end loop over 't'
 
18066
          }
 
18067
          
 
18068
          if (combinations[r][s] == 2)
 
18069
          {
 
18070
          for (unsigned int t = 0; t < 4; t++)
 
18071
          {
 
18072
            for (unsigned int u = 0; u < 4; u++)
 
18073
            {
 
18074
              for (unsigned int tu = 0; tu < 4; tu++)
 
18075
              {
 
18076
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
18077
              }// end loop over 'tu'
 
18078
            }// end loop over 'u'
 
18079
          }// end loop over 't'
 
18080
          }
 
18081
          
 
18082
        }// end loop over 's'
 
18083
        for (unsigned int s = 0; s < 4; s++)
 
18084
        {
 
18085
          for (unsigned int t = 0; t < 4; t++)
 
18086
          {
 
18087
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
18088
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
18089
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
18090
          }// end loop over 't'
 
18091
        }// end loop over 's'
 
18092
        
 
18093
        // Using covariant Piola transform to map values back to the physical element
 
18094
        const double tmp_ref0 = derivatives[r];
 
18095
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
18096
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
18097
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
18098
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
18099
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
18100
      }// end loop over 'r'
 
18101
      
 
18102
      // Transform derivatives back to physical element
 
18103
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18104
      {
 
18105
        for (unsigned int s = 0; s < num_derivatives; s++)
 
18106
        {
 
18107
          values[r] += transform[r][s]*derivatives[s];
 
18108
          values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
18109
          values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
18110
        }// end loop over 's'
 
18111
      }// end loop over 'r'
 
18112
      
 
18113
      // Delete pointer to array of derivatives on FIAT element
 
18114
      delete [] derivatives;
 
18115
      
 
18116
      // Delete pointer to array of combinations of derivatives and transform
 
18117
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18118
      {
 
18119
        delete [] combinations[r];
 
18120
      }// end loop over 'r'
 
18121
      delete [] combinations;
 
18122
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18123
      {
 
18124
        delete [] transform[r];
 
18125
      }// end loop over 'r'
 
18126
      delete [] transform;
 
18127
        break;
 
18128
      }
 
18129
    case 1:
 
18130
      {
 
18131
        
 
18132
      // Array of basisvalues.
 
18133
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18134
      
 
18135
      // Declare helper variables.
 
18136
      unsigned int rr = 0;
 
18137
      unsigned int ss = 0;
 
18138
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
18139
      
 
18140
      // Compute basisvalues.
 
18141
      basisvalues[0] = 1.00000000;
 
18142
      basisvalues[1] = tmp0;
 
18143
      for (unsigned int r = 0; r < 1; r++)
 
18144
      {
 
18145
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18146
        ss = r*(r + 1)*(r + 2)/6;
 
18147
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
18148
      }// end loop over 'r'
 
18149
      for (unsigned int r = 0; r < 1; r++)
 
18150
      {
 
18151
        for (unsigned int s = 0; s < 1 - r; s++)
 
18152
        {
 
18153
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18154
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18155
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
18156
        }// end loop over 's'
 
18157
      }// end loop over 'r'
 
18158
      for (unsigned int r = 0; r < 2; r++)
 
18159
      {
 
18160
        for (unsigned int s = 0; s < 2 - r; s++)
 
18161
        {
 
18162
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
18163
          {
 
18164
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18165
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
18166
          }// end loop over 't'
 
18167
        }// end loop over 's'
 
18168
      }// end loop over 'r'
 
18169
      
 
18170
      // Table(s) of coefficients.
 
18171
      static const double coefficients0[4] = \
 
18172
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
18173
      
 
18174
      static const double coefficients1[4] = \
 
18175
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18176
      
 
18177
      static const double coefficients2[4] = \
 
18178
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
18179
      
 
18180
      // Tables of derivatives of the polynomial base (transpose).
 
18181
      static const double dmats0[4][4] = \
 
18182
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18183
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
18184
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18185
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18186
      
 
18187
      static const double dmats1[4][4] = \
 
18188
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18189
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18190
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
18191
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18192
      
 
18193
      static const double dmats2[4][4] = \
 
18194
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18195
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18196
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
18197
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
18198
      
 
18199
      // Compute reference derivatives.
 
18200
      // Declare pointer to array of derivatives on FIAT element.
 
18201
      double *derivatives = new double[3*num_derivatives];
 
18202
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
18203
      {
 
18204
        derivatives[r] = 0.00000000;
 
18205
      }// end loop over 'r'
 
18206
      
 
18207
      // Declare derivative matrix (of polynomial basis).
 
18208
      double dmats[4][4] = \
 
18209
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18210
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18211
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18212
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18213
      
 
18214
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
18215
      double dmats_old[4][4] = \
 
18216
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18217
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18218
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18219
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18220
      
 
18221
      // Loop possible derivatives.
 
18222
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18223
      {
 
18224
        // Resetting dmats values to compute next derivative.
 
18225
        for (unsigned int t = 0; t < 4; t++)
 
18226
        {
 
18227
          for (unsigned int u = 0; u < 4; u++)
 
18228
          {
 
18229
            dmats[t][u] = 0.00000000;
 
18230
            if (t == u)
 
18231
            {
 
18232
            dmats[t][u] = 1.00000000;
 
18233
            }
 
18234
            
 
18235
          }// end loop over 'u'
 
18236
        }// end loop over 't'
 
18237
        
 
18238
        // Looping derivative order to generate dmats.
 
18239
        for (unsigned int s = 0; s < n; s++)
 
18240
        {
 
18241
          // Updating dmats_old with new values and resetting dmats.
 
18242
          for (unsigned int t = 0; t < 4; t++)
 
18243
          {
 
18244
            for (unsigned int u = 0; u < 4; u++)
 
18245
            {
 
18246
              dmats_old[t][u] = dmats[t][u];
 
18247
              dmats[t][u] = 0.00000000;
 
18248
            }// end loop over 'u'
 
18249
          }// end loop over 't'
 
18250
          
 
18251
          // Update dmats using an inner product.
 
18252
          if (combinations[r][s] == 0)
 
18253
          {
 
18254
          for (unsigned int t = 0; t < 4; t++)
 
18255
          {
 
18256
            for (unsigned int u = 0; u < 4; u++)
 
18257
            {
 
18258
              for (unsigned int tu = 0; tu < 4; tu++)
 
18259
              {
 
18260
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
18261
              }// end loop over 'tu'
 
18262
            }// end loop over 'u'
 
18263
          }// end loop over 't'
 
18264
          }
 
18265
          
 
18266
          if (combinations[r][s] == 1)
 
18267
          {
 
18268
          for (unsigned int t = 0; t < 4; t++)
 
18269
          {
 
18270
            for (unsigned int u = 0; u < 4; u++)
 
18271
            {
 
18272
              for (unsigned int tu = 0; tu < 4; tu++)
 
18273
              {
 
18274
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
18275
              }// end loop over 'tu'
 
18276
            }// end loop over 'u'
 
18277
          }// end loop over 't'
 
18278
          }
 
18279
          
 
18280
          if (combinations[r][s] == 2)
 
18281
          {
 
18282
          for (unsigned int t = 0; t < 4; t++)
 
18283
          {
 
18284
            for (unsigned int u = 0; u < 4; u++)
 
18285
            {
 
18286
              for (unsigned int tu = 0; tu < 4; tu++)
 
18287
              {
 
18288
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
18289
              }// end loop over 'tu'
 
18290
            }// end loop over 'u'
 
18291
          }// end loop over 't'
 
18292
          }
 
18293
          
 
18294
        }// end loop over 's'
 
18295
        for (unsigned int s = 0; s < 4; s++)
 
18296
        {
 
18297
          for (unsigned int t = 0; t < 4; t++)
 
18298
          {
 
18299
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
18300
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
18301
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
18302
          }// end loop over 't'
 
18303
        }// end loop over 's'
 
18304
        
 
18305
        // Using covariant Piola transform to map values back to the physical element
 
18306
        const double tmp_ref0 = derivatives[r];
 
18307
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
18308
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
18309
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
18310
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
18311
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
18312
      }// end loop over 'r'
 
18313
      
 
18314
      // Transform derivatives back to physical element
 
18315
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18316
      {
 
18317
        for (unsigned int s = 0; s < num_derivatives; s++)
 
18318
        {
 
18319
          values[r] += transform[r][s]*derivatives[s];
 
18320
          values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
18321
          values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
18322
        }// end loop over 's'
 
18323
      }// end loop over 'r'
 
18324
      
 
18325
      // Delete pointer to array of derivatives on FIAT element
 
18326
      delete [] derivatives;
 
18327
      
 
18328
      // Delete pointer to array of combinations of derivatives and transform
 
18329
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18330
      {
 
18331
        delete [] combinations[r];
 
18332
      }// end loop over 'r'
 
18333
      delete [] combinations;
 
18334
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18335
      {
 
18336
        delete [] transform[r];
 
18337
      }// end loop over 'r'
 
18338
      delete [] transform;
 
18339
        break;
 
18340
      }
 
18341
    case 2:
 
18342
      {
 
18343
        
 
18344
      // Array of basisvalues.
 
18345
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18346
      
 
18347
      // Declare helper variables.
 
18348
      unsigned int rr = 0;
 
18349
      unsigned int ss = 0;
 
18350
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
18351
      
 
18352
      // Compute basisvalues.
 
18353
      basisvalues[0] = 1.00000000;
 
18354
      basisvalues[1] = tmp0;
 
18355
      for (unsigned int r = 0; r < 1; r++)
 
18356
      {
 
18357
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18358
        ss = r*(r + 1)*(r + 2)/6;
 
18359
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
18360
      }// end loop over 'r'
 
18361
      for (unsigned int r = 0; r < 1; r++)
 
18362
      {
 
18363
        for (unsigned int s = 0; s < 1 - r; s++)
 
18364
        {
 
18365
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18366
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18367
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
18368
        }// end loop over 's'
 
18369
      }// end loop over 'r'
 
18370
      for (unsigned int r = 0; r < 2; r++)
 
18371
      {
 
18372
        for (unsigned int s = 0; s < 2 - r; s++)
 
18373
        {
 
18374
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
18375
          {
 
18376
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18377
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
18378
          }// end loop over 't'
 
18379
        }// end loop over 's'
 
18380
      }// end loop over 'r'
 
18381
      
 
18382
      // Table(s) of coefficients.
 
18383
      static const double coefficients0[4] = \
 
18384
      {-0.28867513, 0.00000000, -0.21081851, 0.07453560};
 
18385
      
 
18386
      static const double coefficients1[4] = \
 
18387
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
18388
      
 
18389
      static const double coefficients2[4] = \
 
18390
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18391
      
 
18392
      // Tables of derivatives of the polynomial base (transpose).
 
18393
      static const double dmats0[4][4] = \
 
18394
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18395
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
18396
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18397
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18398
      
 
18399
      static const double dmats1[4][4] = \
 
18400
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18401
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18402
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
18403
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18404
      
 
18405
      static const double dmats2[4][4] = \
 
18406
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18407
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18408
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
18409
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
18410
      
 
18411
      // Compute reference derivatives.
 
18412
      // Declare pointer to array of derivatives on FIAT element.
 
18413
      double *derivatives = new double[3*num_derivatives];
 
18414
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
18415
      {
 
18416
        derivatives[r] = 0.00000000;
 
18417
      }// end loop over 'r'
 
18418
      
 
18419
      // Declare derivative matrix (of polynomial basis).
 
18420
      double dmats[4][4] = \
 
18421
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18422
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18423
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18424
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18425
      
 
18426
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
18427
      double dmats_old[4][4] = \
 
18428
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18429
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18430
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18431
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18432
      
 
18433
      // Loop possible derivatives.
 
18434
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18435
      {
 
18436
        // Resetting dmats values to compute next derivative.
 
18437
        for (unsigned int t = 0; t < 4; t++)
 
18438
        {
 
18439
          for (unsigned int u = 0; u < 4; u++)
 
18440
          {
 
18441
            dmats[t][u] = 0.00000000;
 
18442
            if (t == u)
 
18443
            {
 
18444
            dmats[t][u] = 1.00000000;
 
18445
            }
 
18446
            
 
18447
          }// end loop over 'u'
 
18448
        }// end loop over 't'
 
18449
        
 
18450
        // Looping derivative order to generate dmats.
 
18451
        for (unsigned int s = 0; s < n; s++)
 
18452
        {
 
18453
          // Updating dmats_old with new values and resetting dmats.
 
18454
          for (unsigned int t = 0; t < 4; t++)
 
18455
          {
 
18456
            for (unsigned int u = 0; u < 4; u++)
 
18457
            {
 
18458
              dmats_old[t][u] = dmats[t][u];
 
18459
              dmats[t][u] = 0.00000000;
 
18460
            }// end loop over 'u'
 
18461
          }// end loop over 't'
 
18462
          
 
18463
          // Update dmats using an inner product.
 
18464
          if (combinations[r][s] == 0)
 
18465
          {
 
18466
          for (unsigned int t = 0; t < 4; t++)
 
18467
          {
 
18468
            for (unsigned int u = 0; u < 4; u++)
 
18469
            {
 
18470
              for (unsigned int tu = 0; tu < 4; tu++)
 
18471
              {
 
18472
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
18473
              }// end loop over 'tu'
 
18474
            }// end loop over 'u'
 
18475
          }// end loop over 't'
 
18476
          }
 
18477
          
 
18478
          if (combinations[r][s] == 1)
 
18479
          {
 
18480
          for (unsigned int t = 0; t < 4; t++)
 
18481
          {
 
18482
            for (unsigned int u = 0; u < 4; u++)
 
18483
            {
 
18484
              for (unsigned int tu = 0; tu < 4; tu++)
 
18485
              {
 
18486
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
18487
              }// end loop over 'tu'
 
18488
            }// end loop over 'u'
 
18489
          }// end loop over 't'
 
18490
          }
 
18491
          
 
18492
          if (combinations[r][s] == 2)
 
18493
          {
 
18494
          for (unsigned int t = 0; t < 4; t++)
 
18495
          {
 
18496
            for (unsigned int u = 0; u < 4; u++)
 
18497
            {
 
18498
              for (unsigned int tu = 0; tu < 4; tu++)
 
18499
              {
 
18500
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
18501
              }// end loop over 'tu'
 
18502
            }// end loop over 'u'
 
18503
          }// end loop over 't'
 
18504
          }
 
18505
          
 
18506
        }// end loop over 's'
 
18507
        for (unsigned int s = 0; s < 4; s++)
 
18508
        {
 
18509
          for (unsigned int t = 0; t < 4; t++)
 
18510
          {
 
18511
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
18512
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
18513
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
18514
          }// end loop over 't'
 
18515
        }// end loop over 's'
 
18516
        
 
18517
        // Using covariant Piola transform to map values back to the physical element
 
18518
        const double tmp_ref0 = derivatives[r];
 
18519
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
18520
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
18521
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
18522
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
18523
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
18524
      }// end loop over 'r'
 
18525
      
 
18526
      // Transform derivatives back to physical element
 
18527
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18528
      {
 
18529
        for (unsigned int s = 0; s < num_derivatives; s++)
 
18530
        {
 
18531
          values[r] += transform[r][s]*derivatives[s];
 
18532
          values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
18533
          values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
18534
        }// end loop over 's'
 
18535
      }// end loop over 'r'
 
18536
      
 
18537
      // Delete pointer to array of derivatives on FIAT element
 
18538
      delete [] derivatives;
 
18539
      
 
18540
      // Delete pointer to array of combinations of derivatives and transform
 
18541
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18542
      {
 
18543
        delete [] combinations[r];
 
18544
      }// end loop over 'r'
 
18545
      delete [] combinations;
 
18546
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18547
      {
 
18548
        delete [] transform[r];
 
18549
      }// end loop over 'r'
 
18550
      delete [] transform;
 
18551
        break;
 
18552
      }
 
18553
    case 3:
 
18554
      {
 
18555
        
 
18556
      // Array of basisvalues.
 
18557
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18558
      
 
18559
      // Declare helper variables.
 
18560
      unsigned int rr = 0;
 
18561
      unsigned int ss = 0;
 
18562
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
18563
      
 
18564
      // Compute basisvalues.
 
18565
      basisvalues[0] = 1.00000000;
 
18566
      basisvalues[1] = tmp0;
 
18567
      for (unsigned int r = 0; r < 1; r++)
 
18568
      {
 
18569
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18570
        ss = r*(r + 1)*(r + 2)/6;
 
18571
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
18572
      }// end loop over 'r'
 
18573
      for (unsigned int r = 0; r < 1; r++)
 
18574
      {
 
18575
        for (unsigned int s = 0; s < 1 - r; s++)
 
18576
        {
 
18577
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18578
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18579
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
18580
        }// end loop over 's'
 
18581
      }// end loop over 'r'
 
18582
      for (unsigned int r = 0; r < 2; r++)
 
18583
      {
 
18584
        for (unsigned int s = 0; s < 2 - r; s++)
 
18585
        {
 
18586
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
18587
          {
 
18588
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18589
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
18590
          }// end loop over 't'
 
18591
        }// end loop over 's'
 
18592
      }// end loop over 'r'
 
18593
      
 
18594
      // Table(s) of coefficients.
 
18595
      static const double coefficients0[4] = \
 
18596
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
18597
      
 
18598
      static const double coefficients1[4] = \
 
18599
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
18600
      
 
18601
      static const double coefficients2[4] = \
 
18602
      {0.57735027, -0.18257419, -0.10540926, 0.14907120};
 
18603
      
 
18604
      // Tables of derivatives of the polynomial base (transpose).
 
18605
      static const double dmats0[4][4] = \
 
18606
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18607
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
18608
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18609
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18610
      
 
18611
      static const double dmats1[4][4] = \
 
18612
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18613
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18614
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
18615
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18616
      
 
18617
      static const double dmats2[4][4] = \
 
18618
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18619
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18620
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
18621
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
18622
      
 
18623
      // Compute reference derivatives.
 
18624
      // Declare pointer to array of derivatives on FIAT element.
 
18625
      double *derivatives = new double[3*num_derivatives];
 
18626
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
18627
      {
 
18628
        derivatives[r] = 0.00000000;
 
18629
      }// end loop over 'r'
 
18630
      
 
18631
      // Declare derivative matrix (of polynomial basis).
 
18632
      double dmats[4][4] = \
 
18633
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18634
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18635
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18636
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18637
      
 
18638
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
18639
      double dmats_old[4][4] = \
 
18640
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18641
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18642
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18643
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18644
      
 
18645
      // Loop possible derivatives.
 
18646
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18647
      {
 
18648
        // Resetting dmats values to compute next derivative.
 
18649
        for (unsigned int t = 0; t < 4; t++)
 
18650
        {
 
18651
          for (unsigned int u = 0; u < 4; u++)
 
18652
          {
 
18653
            dmats[t][u] = 0.00000000;
 
18654
            if (t == u)
 
18655
            {
 
18656
            dmats[t][u] = 1.00000000;
 
18657
            }
 
18658
            
 
18659
          }// end loop over 'u'
 
18660
        }// end loop over 't'
 
18661
        
 
18662
        // Looping derivative order to generate dmats.
 
18663
        for (unsigned int s = 0; s < n; s++)
 
18664
        {
 
18665
          // Updating dmats_old with new values and resetting dmats.
 
18666
          for (unsigned int t = 0; t < 4; t++)
 
18667
          {
 
18668
            for (unsigned int u = 0; u < 4; u++)
 
18669
            {
 
18670
              dmats_old[t][u] = dmats[t][u];
 
18671
              dmats[t][u] = 0.00000000;
 
18672
            }// end loop over 'u'
 
18673
          }// end loop over 't'
 
18674
          
 
18675
          // Update dmats using an inner product.
 
18676
          if (combinations[r][s] == 0)
 
18677
          {
 
18678
          for (unsigned int t = 0; t < 4; t++)
 
18679
          {
 
18680
            for (unsigned int u = 0; u < 4; u++)
 
18681
            {
 
18682
              for (unsigned int tu = 0; tu < 4; tu++)
 
18683
              {
 
18684
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
18685
              }// end loop over 'tu'
 
18686
            }// end loop over 'u'
 
18687
          }// end loop over 't'
 
18688
          }
 
18689
          
 
18690
          if (combinations[r][s] == 1)
 
18691
          {
 
18692
          for (unsigned int t = 0; t < 4; t++)
 
18693
          {
 
18694
            for (unsigned int u = 0; u < 4; u++)
 
18695
            {
 
18696
              for (unsigned int tu = 0; tu < 4; tu++)
 
18697
              {
 
18698
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
18699
              }// end loop over 'tu'
 
18700
            }// end loop over 'u'
 
18701
          }// end loop over 't'
 
18702
          }
 
18703
          
 
18704
          if (combinations[r][s] == 2)
 
18705
          {
 
18706
          for (unsigned int t = 0; t < 4; t++)
 
18707
          {
 
18708
            for (unsigned int u = 0; u < 4; u++)
 
18709
            {
 
18710
              for (unsigned int tu = 0; tu < 4; tu++)
 
18711
              {
 
18712
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
18713
              }// end loop over 'tu'
 
18714
            }// end loop over 'u'
 
18715
          }// end loop over 't'
 
18716
          }
 
18717
          
 
18718
        }// end loop over 's'
 
18719
        for (unsigned int s = 0; s < 4; s++)
 
18720
        {
 
18721
          for (unsigned int t = 0; t < 4; t++)
 
18722
          {
 
18723
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
18724
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
18725
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
18726
          }// end loop over 't'
 
18727
        }// end loop over 's'
 
18728
        
 
18729
        // Using covariant Piola transform to map values back to the physical element
 
18730
        const double tmp_ref0 = derivatives[r];
 
18731
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
18732
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
18733
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
18734
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
18735
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
18736
      }// end loop over 'r'
 
18737
      
 
18738
      // Transform derivatives back to physical element
 
18739
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18740
      {
 
18741
        for (unsigned int s = 0; s < num_derivatives; s++)
 
18742
        {
 
18743
          values[r] += transform[r][s]*derivatives[s];
 
18744
          values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
18745
          values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
18746
        }// end loop over 's'
 
18747
      }// end loop over 'r'
 
18748
      
 
18749
      // Delete pointer to array of derivatives on FIAT element
 
18750
      delete [] derivatives;
 
18751
      
 
18752
      // Delete pointer to array of combinations of derivatives and transform
 
18753
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18754
      {
 
18755
        delete [] combinations[r];
 
18756
      }// end loop over 'r'
 
18757
      delete [] combinations;
 
18758
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18759
      {
 
18760
        delete [] transform[r];
 
18761
      }// end loop over 'r'
 
18762
      delete [] transform;
 
18763
        break;
 
18764
      }
 
18765
    case 4:
 
18766
      {
 
18767
        
 
18768
      // Array of basisvalues.
 
18769
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18770
      
 
18771
      // Declare helper variables.
 
18772
      unsigned int rr = 0;
 
18773
      unsigned int ss = 0;
 
18774
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
18775
      
 
18776
      // Compute basisvalues.
 
18777
      basisvalues[0] = 1.00000000;
 
18778
      basisvalues[1] = tmp0;
 
18779
      for (unsigned int r = 0; r < 1; r++)
 
18780
      {
 
18781
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18782
        ss = r*(r + 1)*(r + 2)/6;
 
18783
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
18784
      }// end loop over 'r'
 
18785
      for (unsigned int r = 0; r < 1; r++)
 
18786
      {
 
18787
        for (unsigned int s = 0; s < 1 - r; s++)
 
18788
        {
 
18789
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18790
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18791
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
18792
        }// end loop over 's'
 
18793
      }// end loop over 'r'
 
18794
      for (unsigned int r = 0; r < 2; r++)
 
18795
      {
 
18796
        for (unsigned int s = 0; s < 2 - r; s++)
 
18797
        {
 
18798
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
18799
          {
 
18800
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18801
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
18802
          }// end loop over 't'
 
18803
        }// end loop over 's'
 
18804
      }// end loop over 'r'
 
18805
      
 
18806
      // Table(s) of coefficients.
 
18807
      static const double coefficients0[4] = \
 
18808
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
18809
      
 
18810
      static const double coefficients1[4] = \
 
18811
      {0.57735027, -0.18257419, 0.10540926, -0.14907120};
 
18812
      
 
18813
      static const double coefficients2[4] = \
 
18814
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
18815
      
 
18816
      // Tables of derivatives of the polynomial base (transpose).
 
18817
      static const double dmats0[4][4] = \
 
18818
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18819
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
18820
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18821
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18822
      
 
18823
      static const double dmats1[4][4] = \
 
18824
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18825
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18826
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
18827
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
18828
      
 
18829
      static const double dmats2[4][4] = \
 
18830
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18831
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
18832
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
18833
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
18834
      
 
18835
      // Compute reference derivatives.
 
18836
      // Declare pointer to array of derivatives on FIAT element.
 
18837
      double *derivatives = new double[3*num_derivatives];
 
18838
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
18839
      {
 
18840
        derivatives[r] = 0.00000000;
 
18841
      }// end loop over 'r'
 
18842
      
 
18843
      // Declare derivative matrix (of polynomial basis).
 
18844
      double dmats[4][4] = \
 
18845
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18846
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18847
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18848
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18849
      
 
18850
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
18851
      double dmats_old[4][4] = \
 
18852
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
18853
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
18854
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
18855
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
18856
      
 
18857
      // Loop possible derivatives.
 
18858
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18859
      {
 
18860
        // Resetting dmats values to compute next derivative.
 
18861
        for (unsigned int t = 0; t < 4; t++)
 
18862
        {
 
18863
          for (unsigned int u = 0; u < 4; u++)
 
18864
          {
 
18865
            dmats[t][u] = 0.00000000;
 
18866
            if (t == u)
 
18867
            {
 
18868
            dmats[t][u] = 1.00000000;
 
18869
            }
 
18870
            
 
18871
          }// end loop over 'u'
 
18872
        }// end loop over 't'
 
18873
        
 
18874
        // Looping derivative order to generate dmats.
 
18875
        for (unsigned int s = 0; s < n; s++)
 
18876
        {
 
18877
          // Updating dmats_old with new values and resetting dmats.
 
18878
          for (unsigned int t = 0; t < 4; t++)
 
18879
          {
 
18880
            for (unsigned int u = 0; u < 4; u++)
 
18881
            {
 
18882
              dmats_old[t][u] = dmats[t][u];
 
18883
              dmats[t][u] = 0.00000000;
 
18884
            }// end loop over 'u'
 
18885
          }// end loop over 't'
 
18886
          
 
18887
          // Update dmats using an inner product.
 
18888
          if (combinations[r][s] == 0)
 
18889
          {
 
18890
          for (unsigned int t = 0; t < 4; t++)
 
18891
          {
 
18892
            for (unsigned int u = 0; u < 4; u++)
 
18893
            {
 
18894
              for (unsigned int tu = 0; tu < 4; tu++)
 
18895
              {
 
18896
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
18897
              }// end loop over 'tu'
 
18898
            }// end loop over 'u'
 
18899
          }// end loop over 't'
 
18900
          }
 
18901
          
 
18902
          if (combinations[r][s] == 1)
 
18903
          {
 
18904
          for (unsigned int t = 0; t < 4; t++)
 
18905
          {
 
18906
            for (unsigned int u = 0; u < 4; u++)
 
18907
            {
 
18908
              for (unsigned int tu = 0; tu < 4; tu++)
 
18909
              {
 
18910
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
18911
              }// end loop over 'tu'
 
18912
            }// end loop over 'u'
 
18913
          }// end loop over 't'
 
18914
          }
 
18915
          
 
18916
          if (combinations[r][s] == 2)
 
18917
          {
 
18918
          for (unsigned int t = 0; t < 4; t++)
 
18919
          {
 
18920
            for (unsigned int u = 0; u < 4; u++)
 
18921
            {
 
18922
              for (unsigned int tu = 0; tu < 4; tu++)
 
18923
              {
 
18924
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
18925
              }// end loop over 'tu'
 
18926
            }// end loop over 'u'
 
18927
          }// end loop over 't'
 
18928
          }
 
18929
          
 
18930
        }// end loop over 's'
 
18931
        for (unsigned int s = 0; s < 4; s++)
 
18932
        {
 
18933
          for (unsigned int t = 0; t < 4; t++)
 
18934
          {
 
18935
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
18936
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
18937
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
18938
          }// end loop over 't'
 
18939
        }// end loop over 's'
 
18940
        
 
18941
        // Using covariant Piola transform to map values back to the physical element
 
18942
        const double tmp_ref0 = derivatives[r];
 
18943
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
18944
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
18945
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
18946
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
18947
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
18948
      }// end loop over 'r'
 
18949
      
 
18950
      // Transform derivatives back to physical element
 
18951
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18952
      {
 
18953
        for (unsigned int s = 0; s < num_derivatives; s++)
 
18954
        {
 
18955
          values[r] += transform[r][s]*derivatives[s];
 
18956
          values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
18957
          values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
18958
        }// end loop over 's'
 
18959
      }// end loop over 'r'
 
18960
      
 
18961
      // Delete pointer to array of derivatives on FIAT element
 
18962
      delete [] derivatives;
 
18963
      
 
18964
      // Delete pointer to array of combinations of derivatives and transform
 
18965
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18966
      {
 
18967
        delete [] combinations[r];
 
18968
      }// end loop over 'r'
 
18969
      delete [] combinations;
 
18970
      for (unsigned int r = 0; r < num_derivatives; r++)
 
18971
      {
 
18972
        delete [] transform[r];
 
18973
      }// end loop over 'r'
 
18974
      delete [] transform;
 
18975
        break;
 
18976
      }
 
18977
    case 5:
 
18978
      {
 
18979
        
 
18980
      // Array of basisvalues.
 
18981
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
18982
      
 
18983
      // Declare helper variables.
 
18984
      unsigned int rr = 0;
 
18985
      unsigned int ss = 0;
 
18986
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
18987
      
 
18988
      // Compute basisvalues.
 
18989
      basisvalues[0] = 1.00000000;
 
18990
      basisvalues[1] = tmp0;
 
18991
      for (unsigned int r = 0; r < 1; r++)
 
18992
      {
 
18993
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18994
        ss = r*(r + 1)*(r + 2)/6;
 
18995
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
18996
      }// end loop over 'r'
 
18997
      for (unsigned int r = 0; r < 1; r++)
 
18998
      {
 
18999
        for (unsigned int s = 0; s < 1 - r; s++)
 
19000
        {
 
19001
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19002
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19003
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19004
        }// end loop over 's'
 
19005
      }// end loop over 'r'
 
19006
      for (unsigned int r = 0; r < 2; r++)
 
19007
      {
 
19008
        for (unsigned int s = 0; s < 2 - r; s++)
 
19009
        {
 
19010
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19011
          {
 
19012
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19013
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19014
          }// end loop over 't'
 
19015
        }// end loop over 's'
 
19016
      }// end loop over 'r'
 
19017
      
 
19018
      // Table(s) of coefficients.
 
19019
      static const double coefficients0[4] = \
 
19020
      {0.57735027, 0.00000000, -0.21081851, -0.14907120};
 
19021
      
 
19022
      static const double coefficients1[4] = \
 
19023
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
19024
      
 
19025
      static const double coefficients2[4] = \
 
19026
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
19027
      
 
19028
      // Tables of derivatives of the polynomial base (transpose).
 
19029
      static const double dmats0[4][4] = \
 
19030
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
19031
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
19032
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
19033
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
19034
      
 
19035
      static const double dmats1[4][4] = \
 
19036
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
19037
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
19038
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
19039
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
19040
      
 
19041
      static const double dmats2[4][4] = \
 
19042
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
19043
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
19044
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
19045
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
19046
      
 
19047
      // Compute reference derivatives.
 
19048
      // Declare pointer to array of derivatives on FIAT element.
 
19049
      double *derivatives = new double[3*num_derivatives];
 
19050
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
19051
      {
 
19052
        derivatives[r] = 0.00000000;
 
19053
      }// end loop over 'r'
 
19054
      
 
19055
      // Declare derivative matrix (of polynomial basis).
 
19056
      double dmats[4][4] = \
 
19057
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
19058
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
19059
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
19060
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
19061
      
 
19062
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
19063
      double dmats_old[4][4] = \
 
19064
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
19065
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
19066
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
19067
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
19068
      
 
19069
      // Loop possible derivatives.
 
19070
      for (unsigned int r = 0; r < num_derivatives; r++)
 
19071
      {
 
19072
        // Resetting dmats values to compute next derivative.
 
19073
        for (unsigned int t = 0; t < 4; t++)
 
19074
        {
 
19075
          for (unsigned int u = 0; u < 4; u++)
 
19076
          {
 
19077
            dmats[t][u] = 0.00000000;
 
19078
            if (t == u)
 
19079
            {
 
19080
            dmats[t][u] = 1.00000000;
 
19081
            }
 
19082
            
 
19083
          }// end loop over 'u'
 
19084
        }// end loop over 't'
 
19085
        
 
19086
        // Looping derivative order to generate dmats.
 
19087
        for (unsigned int s = 0; s < n; s++)
 
19088
        {
 
19089
          // Updating dmats_old with new values and resetting dmats.
 
19090
          for (unsigned int t = 0; t < 4; t++)
 
19091
          {
 
19092
            for (unsigned int u = 0; u < 4; u++)
 
19093
            {
 
19094
              dmats_old[t][u] = dmats[t][u];
 
19095
              dmats[t][u] = 0.00000000;
 
19096
            }// end loop over 'u'
 
19097
          }// end loop over 't'
 
19098
          
 
19099
          // Update dmats using an inner product.
 
19100
          if (combinations[r][s] == 0)
 
19101
          {
 
19102
          for (unsigned int t = 0; t < 4; t++)
 
19103
          {
 
19104
            for (unsigned int u = 0; u < 4; u++)
 
19105
            {
 
19106
              for (unsigned int tu = 0; tu < 4; tu++)
 
19107
              {
 
19108
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
19109
              }// end loop over 'tu'
 
19110
            }// end loop over 'u'
 
19111
          }// end loop over 't'
 
19112
          }
 
19113
          
 
19114
          if (combinations[r][s] == 1)
 
19115
          {
 
19116
          for (unsigned int t = 0; t < 4; t++)
 
19117
          {
 
19118
            for (unsigned int u = 0; u < 4; u++)
 
19119
            {
 
19120
              for (unsigned int tu = 0; tu < 4; tu++)
 
19121
              {
 
19122
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
19123
              }// end loop over 'tu'
 
19124
            }// end loop over 'u'
 
19125
          }// end loop over 't'
 
19126
          }
 
19127
          
 
19128
          if (combinations[r][s] == 2)
 
19129
          {
 
19130
          for (unsigned int t = 0; t < 4; t++)
 
19131
          {
 
19132
            for (unsigned int u = 0; u < 4; u++)
 
19133
            {
 
19134
              for (unsigned int tu = 0; tu < 4; tu++)
 
19135
              {
 
19136
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
19137
              }// end loop over 'tu'
 
19138
            }// end loop over 'u'
 
19139
          }// end loop over 't'
 
19140
          }
 
19141
          
 
19142
        }// end loop over 's'
 
19143
        for (unsigned int s = 0; s < 4; s++)
 
19144
        {
 
19145
          for (unsigned int t = 0; t < 4; t++)
 
19146
          {
 
19147
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
19148
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
19149
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
19150
          }// end loop over 't'
 
19151
        }// end loop over 's'
 
19152
        
 
19153
        // Using covariant Piola transform to map values back to the physical element
 
19154
        const double tmp_ref0 = derivatives[r];
 
19155
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
19156
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
19157
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
19158
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
19159
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
19160
      }// end loop over 'r'
 
19161
      
 
19162
      // Transform derivatives back to physical element
 
19163
      for (unsigned int r = 0; r < num_derivatives; r++)
 
19164
      {
 
19165
        for (unsigned int s = 0; s < num_derivatives; s++)
 
19166
        {
 
19167
          values[r] += transform[r][s]*derivatives[s];
 
19168
          values[num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
19169
          values[2*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
19170
        }// end loop over 's'
 
19171
      }// end loop over 'r'
 
19172
      
 
19173
      // Delete pointer to array of derivatives on FIAT element
 
19174
      delete [] derivatives;
 
19175
      
 
19176
      // Delete pointer to array of combinations of derivatives and transform
 
19177
      for (unsigned int r = 0; r < num_derivatives; r++)
 
19178
      {
 
19179
        delete [] combinations[r];
 
19180
      }// end loop over 'r'
 
19181
      delete [] combinations;
 
19182
      for (unsigned int r = 0; r < num_derivatives; r++)
 
19183
      {
 
19184
        delete [] transform[r];
 
19185
      }// end loop over 'r'
 
19186
      delete [] transform;
 
19187
        break;
 
19188
      }
 
19189
    }
 
19190
    
4028
19191
  }
4029
19192
 
4030
19193
  /// Evaluate order n derivatives of all basis functions at given point in cell
4402
19565
    values[1] = 0.00000000;
4403
19566
    values[2] = 0.00000000;
4404
19567
    values[3] = 0.00000000;
4405
 
    if (0 <= i && i <= 3)
4406
 
    {
4407
 
      // Map degree of freedom to element degree of freedom
4408
 
      const unsigned int dof = i;
4409
 
      
4410
 
      // Array of basisvalues.
4411
 
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4412
 
      
4413
 
      // Declare helper variables.
4414
 
      unsigned int rr = 0;
4415
 
      unsigned int ss = 0;
4416
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4417
 
      
4418
 
      // Compute basisvalues.
4419
 
      basisvalues[0] = 1.00000000;
4420
 
      basisvalues[1] = tmp0;
4421
 
      for (unsigned int r = 0; r < 1; r++)
4422
 
      {
4423
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4424
 
        ss = r*(r + 1)*(r + 2)/6;
4425
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4426
 
      }// end loop over 'r'
4427
 
      for (unsigned int r = 0; r < 1; r++)
4428
 
      {
4429
 
        for (unsigned int s = 0; s < 1 - r; s++)
4430
 
        {
4431
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4432
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4433
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4434
 
        }// end loop over 's'
4435
 
      }// end loop over 'r'
4436
 
      for (unsigned int r = 0; r < 2; r++)
4437
 
      {
4438
 
        for (unsigned int s = 0; s < 2 - r; s++)
4439
 
        {
4440
 
          for (unsigned int t = 0; t < 2 - r - s; t++)
4441
 
          {
4442
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4443
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4444
 
          }// end loop over 't'
4445
 
        }// end loop over 's'
4446
 
      }// end loop over 'r'
4447
 
      
4448
 
      // Table(s) of coefficients.
4449
 
      static const double coefficients0[4][4] = \
4450
 
      {{0.28867513, -0.18257419, -0.10540926, -0.07453560},
4451
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560},
4452
 
      {0.28867513, 0.00000000, 0.21081851, -0.07453560},
4453
 
      {0.28867513, 0.00000000, 0.00000000, 0.22360680}};
4454
 
      
4455
 
      // Compute value(s).
4456
 
      for (unsigned int r = 0; r < 4; r++)
4457
 
      {
4458
 
        values[0] += coefficients0[dof][r]*basisvalues[r];
4459
 
      }// end loop over 'r'
4460
 
    }
4461
 
    
4462
 
    if (4 <= i && i <= 9)
4463
 
    {
4464
 
      // Map degree of freedom to element degree of freedom
4465
 
      const unsigned int dof = i - 4;
4466
 
      
4467
 
      // Array of basisvalues.
4468
 
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4469
 
      
4470
 
      // Declare helper variables.
4471
 
      unsigned int rr = 0;
4472
 
      unsigned int ss = 0;
4473
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4474
 
      
4475
 
      // Compute basisvalues.
4476
 
      basisvalues[0] = 1.00000000;
4477
 
      basisvalues[1] = tmp0;
4478
 
      for (unsigned int r = 0; r < 1; r++)
4479
 
      {
4480
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4481
 
        ss = r*(r + 1)*(r + 2)/6;
4482
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4483
 
      }// end loop over 'r'
4484
 
      for (unsigned int r = 0; r < 1; r++)
4485
 
      {
4486
 
        for (unsigned int s = 0; s < 1 - r; s++)
4487
 
        {
4488
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4489
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4490
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4491
 
        }// end loop over 's'
4492
 
      }// end loop over 'r'
4493
 
      for (unsigned int r = 0; r < 2; r++)
4494
 
      {
4495
 
        for (unsigned int s = 0; s < 2 - r; s++)
4496
 
        {
4497
 
          for (unsigned int t = 0; t < 2 - r - s; t++)
4498
 
          {
4499
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4500
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4501
 
          }// end loop over 't'
4502
 
        }// end loop over 's'
4503
 
      }// end loop over 'r'
4504
 
      
4505
 
      // Table(s) of coefficients.
4506
 
      static const double coefficients0[6][4] = \
4507
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4508
 
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680},
4509
 
      {-0.28867513, 0.00000000, -0.21081851, 0.07453560},
4510
 
      {0.28867513, 0.00000000, 0.00000000, 0.22360680},
4511
 
      {0.28867513, 0.00000000, 0.21081851, -0.07453560},
4512
 
      {0.57735027, 0.00000000, -0.21081851, -0.14907120}};
4513
 
      
4514
 
      static const double coefficients1[6][4] = \
4515
 
      {{-0.28867513, 0.00000000, 0.00000000, -0.22360680},
4516
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
4517
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560},
4518
 
      {0.28867513, 0.00000000, 0.00000000, 0.22360680},
4519
 
      {0.57735027, -0.18257419, 0.10540926, -0.14907120},
4520
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
4521
 
      
4522
 
      static const double coefficients2[6][4] = \
4523
 
      {{0.28867513, 0.00000000, 0.21081851, -0.07453560},
4524
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560},
4525
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
4526
 
      {0.57735027, -0.18257419, -0.10540926, 0.14907120},
4527
 
      {0.28867513, 0.00000000, 0.21081851, -0.07453560},
4528
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
4529
 
      
4530
 
      // Compute value(s).
4531
 
      for (unsigned int r = 0; r < 4; r++)
4532
 
      {
4533
 
        values[1] += coefficients0[dof][r]*basisvalues[r];
4534
 
        values[2] += coefficients1[dof][r]*basisvalues[r];
4535
 
        values[3] += coefficients2[dof][r]*basisvalues[r];
4536
 
      }// end loop over 'r'
4537
 
      
4538
 
      // Using covariant Piola transform to map values back to the physical element.
4539
 
      const double tmp_ref0 = values[1];
4540
 
      const double tmp_ref1 = values[2];
4541
 
      const double tmp_ref2 = values[3];
4542
 
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
4543
 
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
4544
 
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
19568
    switch (i)
 
19569
    {
 
19570
    case 0:
 
19571
      {
 
19572
        
 
19573
      // Array of basisvalues.
 
19574
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19575
      
 
19576
      // Declare helper variables.
 
19577
      unsigned int rr = 0;
 
19578
      unsigned int ss = 0;
 
19579
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19580
      
 
19581
      // Compute basisvalues.
 
19582
      basisvalues[0] = 1.00000000;
 
19583
      basisvalues[1] = tmp0;
 
19584
      for (unsigned int r = 0; r < 1; r++)
 
19585
      {
 
19586
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19587
        ss = r*(r + 1)*(r + 2)/6;
 
19588
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19589
      }// end loop over 'r'
 
19590
      for (unsigned int r = 0; r < 1; r++)
 
19591
      {
 
19592
        for (unsigned int s = 0; s < 1 - r; s++)
 
19593
        {
 
19594
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19595
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19596
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19597
        }// end loop over 's'
 
19598
      }// end loop over 'r'
 
19599
      for (unsigned int r = 0; r < 2; r++)
 
19600
      {
 
19601
        for (unsigned int s = 0; s < 2 - r; s++)
 
19602
        {
 
19603
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19604
          {
 
19605
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19606
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19607
          }// end loop over 't'
 
19608
        }// end loop over 's'
 
19609
      }// end loop over 'r'
 
19610
      
 
19611
      // Table(s) of coefficients.
 
19612
      static const double coefficients0[4] = \
 
19613
      {0.28867513, -0.18257419, -0.10540926, -0.07453560};
 
19614
      
 
19615
      // Compute value(s).
 
19616
      for (unsigned int r = 0; r < 4; r++)
 
19617
      {
 
19618
        values[0] += coefficients0[r]*basisvalues[r];
 
19619
      }// end loop over 'r'
 
19620
        break;
 
19621
      }
 
19622
    case 1:
 
19623
      {
 
19624
        
 
19625
      // Array of basisvalues.
 
19626
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19627
      
 
19628
      // Declare helper variables.
 
19629
      unsigned int rr = 0;
 
19630
      unsigned int ss = 0;
 
19631
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19632
      
 
19633
      // Compute basisvalues.
 
19634
      basisvalues[0] = 1.00000000;
 
19635
      basisvalues[1] = tmp0;
 
19636
      for (unsigned int r = 0; r < 1; r++)
 
19637
      {
 
19638
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19639
        ss = r*(r + 1)*(r + 2)/6;
 
19640
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19641
      }// end loop over 'r'
 
19642
      for (unsigned int r = 0; r < 1; r++)
 
19643
      {
 
19644
        for (unsigned int s = 0; s < 1 - r; s++)
 
19645
        {
 
19646
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19647
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19648
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19649
        }// end loop over 's'
 
19650
      }// end loop over 'r'
 
19651
      for (unsigned int r = 0; r < 2; r++)
 
19652
      {
 
19653
        for (unsigned int s = 0; s < 2 - r; s++)
 
19654
        {
 
19655
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19656
          {
 
19657
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19658
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19659
          }// end loop over 't'
 
19660
        }// end loop over 's'
 
19661
      }// end loop over 'r'
 
19662
      
 
19663
      // Table(s) of coefficients.
 
19664
      static const double coefficients0[4] = \
 
19665
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
19666
      
 
19667
      // Compute value(s).
 
19668
      for (unsigned int r = 0; r < 4; r++)
 
19669
      {
 
19670
        values[0] += coefficients0[r]*basisvalues[r];
 
19671
      }// end loop over 'r'
 
19672
        break;
 
19673
      }
 
19674
    case 2:
 
19675
      {
 
19676
        
 
19677
      // Array of basisvalues.
 
19678
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19679
      
 
19680
      // Declare helper variables.
 
19681
      unsigned int rr = 0;
 
19682
      unsigned int ss = 0;
 
19683
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19684
      
 
19685
      // Compute basisvalues.
 
19686
      basisvalues[0] = 1.00000000;
 
19687
      basisvalues[1] = tmp0;
 
19688
      for (unsigned int r = 0; r < 1; r++)
 
19689
      {
 
19690
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19691
        ss = r*(r + 1)*(r + 2)/6;
 
19692
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19693
      }// end loop over 'r'
 
19694
      for (unsigned int r = 0; r < 1; r++)
 
19695
      {
 
19696
        for (unsigned int s = 0; s < 1 - r; s++)
 
19697
        {
 
19698
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19699
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19700
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19701
        }// end loop over 's'
 
19702
      }// end loop over 'r'
 
19703
      for (unsigned int r = 0; r < 2; r++)
 
19704
      {
 
19705
        for (unsigned int s = 0; s < 2 - r; s++)
 
19706
        {
 
19707
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19708
          {
 
19709
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19710
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19711
          }// end loop over 't'
 
19712
        }// end loop over 's'
 
19713
      }// end loop over 'r'
 
19714
      
 
19715
      // Table(s) of coefficients.
 
19716
      static const double coefficients0[4] = \
 
19717
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
19718
      
 
19719
      // Compute value(s).
 
19720
      for (unsigned int r = 0; r < 4; r++)
 
19721
      {
 
19722
        values[0] += coefficients0[r]*basisvalues[r];
 
19723
      }// end loop over 'r'
 
19724
        break;
 
19725
      }
 
19726
    case 3:
 
19727
      {
 
19728
        
 
19729
      // Array of basisvalues.
 
19730
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19731
      
 
19732
      // Declare helper variables.
 
19733
      unsigned int rr = 0;
 
19734
      unsigned int ss = 0;
 
19735
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19736
      
 
19737
      // Compute basisvalues.
 
19738
      basisvalues[0] = 1.00000000;
 
19739
      basisvalues[1] = tmp0;
 
19740
      for (unsigned int r = 0; r < 1; r++)
 
19741
      {
 
19742
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19743
        ss = r*(r + 1)*(r + 2)/6;
 
19744
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19745
      }// end loop over 'r'
 
19746
      for (unsigned int r = 0; r < 1; r++)
 
19747
      {
 
19748
        for (unsigned int s = 0; s < 1 - r; s++)
 
19749
        {
 
19750
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19751
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19752
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19753
        }// end loop over 's'
 
19754
      }// end loop over 'r'
 
19755
      for (unsigned int r = 0; r < 2; r++)
 
19756
      {
 
19757
        for (unsigned int s = 0; s < 2 - r; s++)
 
19758
        {
 
19759
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19760
          {
 
19761
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19762
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19763
          }// end loop over 't'
 
19764
        }// end loop over 's'
 
19765
      }// end loop over 'r'
 
19766
      
 
19767
      // Table(s) of coefficients.
 
19768
      static const double coefficients0[4] = \
 
19769
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
19770
      
 
19771
      // Compute value(s).
 
19772
      for (unsigned int r = 0; r < 4; r++)
 
19773
      {
 
19774
        values[0] += coefficients0[r]*basisvalues[r];
 
19775
      }// end loop over 'r'
 
19776
        break;
 
19777
      }
 
19778
    case 4:
 
19779
      {
 
19780
        
 
19781
      // Array of basisvalues.
 
19782
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19783
      
 
19784
      // Declare helper variables.
 
19785
      unsigned int rr = 0;
 
19786
      unsigned int ss = 0;
 
19787
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19788
      
 
19789
      // Compute basisvalues.
 
19790
      basisvalues[0] = 1.00000000;
 
19791
      basisvalues[1] = tmp0;
 
19792
      for (unsigned int r = 0; r < 1; r++)
 
19793
      {
 
19794
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19795
        ss = r*(r + 1)*(r + 2)/6;
 
19796
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19797
      }// end loop over 'r'
 
19798
      for (unsigned int r = 0; r < 1; r++)
 
19799
      {
 
19800
        for (unsigned int s = 0; s < 1 - r; s++)
 
19801
        {
 
19802
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19803
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19804
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19805
        }// end loop over 's'
 
19806
      }// end loop over 'r'
 
19807
      for (unsigned int r = 0; r < 2; r++)
 
19808
      {
 
19809
        for (unsigned int s = 0; s < 2 - r; s++)
 
19810
        {
 
19811
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19812
          {
 
19813
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19814
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19815
          }// end loop over 't'
 
19816
        }// end loop over 's'
 
19817
      }// end loop over 'r'
 
19818
      
 
19819
      // Table(s) of coefficients.
 
19820
      static const double coefficients0[4] = \
 
19821
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19822
      
 
19823
      static const double coefficients1[4] = \
 
19824
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
19825
      
 
19826
      static const double coefficients2[4] = \
 
19827
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
19828
      
 
19829
      // Compute value(s).
 
19830
      for (unsigned int r = 0; r < 4; r++)
 
19831
      {
 
19832
        values[1] += coefficients0[r]*basisvalues[r];
 
19833
        values[2] += coefficients1[r]*basisvalues[r];
 
19834
        values[3] += coefficients2[r]*basisvalues[r];
 
19835
      }// end loop over 'r'
 
19836
      
 
19837
      // Using covariant Piola transform to map values back to the physical element.
 
19838
      const double tmp_ref0 = values[1];
 
19839
      const double tmp_ref1 = values[2];
 
19840
      const double tmp_ref2 = values[3];
 
19841
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
19842
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
19843
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
19844
        break;
 
19845
      }
 
19846
    case 5:
 
19847
      {
 
19848
        
 
19849
      // Array of basisvalues.
 
19850
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19851
      
 
19852
      // Declare helper variables.
 
19853
      unsigned int rr = 0;
 
19854
      unsigned int ss = 0;
 
19855
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19856
      
 
19857
      // Compute basisvalues.
 
19858
      basisvalues[0] = 1.00000000;
 
19859
      basisvalues[1] = tmp0;
 
19860
      for (unsigned int r = 0; r < 1; r++)
 
19861
      {
 
19862
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19863
        ss = r*(r + 1)*(r + 2)/6;
 
19864
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19865
      }// end loop over 'r'
 
19866
      for (unsigned int r = 0; r < 1; r++)
 
19867
      {
 
19868
        for (unsigned int s = 0; s < 1 - r; s++)
 
19869
        {
 
19870
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19871
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19872
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19873
        }// end loop over 's'
 
19874
      }// end loop over 'r'
 
19875
      for (unsigned int r = 0; r < 2; r++)
 
19876
      {
 
19877
        for (unsigned int s = 0; s < 2 - r; s++)
 
19878
        {
 
19879
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19880
          {
 
19881
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19882
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19883
          }// end loop over 't'
 
19884
        }// end loop over 's'
 
19885
      }// end loop over 'r'
 
19886
      
 
19887
      // Table(s) of coefficients.
 
19888
      static const double coefficients0[4] = \
 
19889
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
19890
      
 
19891
      static const double coefficients1[4] = \
 
19892
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19893
      
 
19894
      static const double coefficients2[4] = \
 
19895
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
19896
      
 
19897
      // Compute value(s).
 
19898
      for (unsigned int r = 0; r < 4; r++)
 
19899
      {
 
19900
        values[1] += coefficients0[r]*basisvalues[r];
 
19901
        values[2] += coefficients1[r]*basisvalues[r];
 
19902
        values[3] += coefficients2[r]*basisvalues[r];
 
19903
      }// end loop over 'r'
 
19904
      
 
19905
      // Using covariant Piola transform to map values back to the physical element.
 
19906
      const double tmp_ref0 = values[1];
 
19907
      const double tmp_ref1 = values[2];
 
19908
      const double tmp_ref2 = values[3];
 
19909
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
19910
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
19911
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
19912
        break;
 
19913
      }
 
19914
    case 6:
 
19915
      {
 
19916
        
 
19917
      // Array of basisvalues.
 
19918
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19919
      
 
19920
      // Declare helper variables.
 
19921
      unsigned int rr = 0;
 
19922
      unsigned int ss = 0;
 
19923
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19924
      
 
19925
      // Compute basisvalues.
 
19926
      basisvalues[0] = 1.00000000;
 
19927
      basisvalues[1] = tmp0;
 
19928
      for (unsigned int r = 0; r < 1; r++)
 
19929
      {
 
19930
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19931
        ss = r*(r + 1)*(r + 2)/6;
 
19932
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
19933
      }// end loop over 'r'
 
19934
      for (unsigned int r = 0; r < 1; r++)
 
19935
      {
 
19936
        for (unsigned int s = 0; s < 1 - r; s++)
 
19937
        {
 
19938
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19939
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19940
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
19941
        }// end loop over 's'
 
19942
      }// end loop over 'r'
 
19943
      for (unsigned int r = 0; r < 2; r++)
 
19944
      {
 
19945
        for (unsigned int s = 0; s < 2 - r; s++)
 
19946
        {
 
19947
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
19948
          {
 
19949
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19950
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
19951
          }// end loop over 't'
 
19952
        }// end loop over 's'
 
19953
      }// end loop over 'r'
 
19954
      
 
19955
      // Table(s) of coefficients.
 
19956
      static const double coefficients0[4] = \
 
19957
      {-0.28867513, 0.00000000, -0.21081851, 0.07453560};
 
19958
      
 
19959
      static const double coefficients1[4] = \
 
19960
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
19961
      
 
19962
      static const double coefficients2[4] = \
 
19963
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19964
      
 
19965
      // Compute value(s).
 
19966
      for (unsigned int r = 0; r < 4; r++)
 
19967
      {
 
19968
        values[1] += coefficients0[r]*basisvalues[r];
 
19969
        values[2] += coefficients1[r]*basisvalues[r];
 
19970
        values[3] += coefficients2[r]*basisvalues[r];
 
19971
      }// end loop over 'r'
 
19972
      
 
19973
      // Using covariant Piola transform to map values back to the physical element.
 
19974
      const double tmp_ref0 = values[1];
 
19975
      const double tmp_ref1 = values[2];
 
19976
      const double tmp_ref2 = values[3];
 
19977
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
19978
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
19979
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
19980
        break;
 
19981
      }
 
19982
    case 7:
 
19983
      {
 
19984
        
 
19985
      // Array of basisvalues.
 
19986
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
19987
      
 
19988
      // Declare helper variables.
 
19989
      unsigned int rr = 0;
 
19990
      unsigned int ss = 0;
 
19991
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
19992
      
 
19993
      // Compute basisvalues.
 
19994
      basisvalues[0] = 1.00000000;
 
19995
      basisvalues[1] = tmp0;
 
19996
      for (unsigned int r = 0; r < 1; r++)
 
19997
      {
 
19998
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19999
        ss = r*(r + 1)*(r + 2)/6;
 
20000
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20001
      }// end loop over 'r'
 
20002
      for (unsigned int r = 0; r < 1; r++)
 
20003
      {
 
20004
        for (unsigned int s = 0; s < 1 - r; s++)
 
20005
        {
 
20006
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20007
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20008
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20009
        }// end loop over 's'
 
20010
      }// end loop over 'r'
 
20011
      for (unsigned int r = 0; r < 2; r++)
 
20012
      {
 
20013
        for (unsigned int s = 0; s < 2 - r; s++)
 
20014
        {
 
20015
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20016
          {
 
20017
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20018
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20019
          }// end loop over 't'
 
20020
        }// end loop over 's'
 
20021
      }// end loop over 'r'
 
20022
      
 
20023
      // Table(s) of coefficients.
 
20024
      static const double coefficients0[4] = \
 
20025
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
20026
      
 
20027
      static const double coefficients1[4] = \
 
20028
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
20029
      
 
20030
      static const double coefficients2[4] = \
 
20031
      {0.57735027, -0.18257419, -0.10540926, 0.14907120};
 
20032
      
 
20033
      // Compute value(s).
 
20034
      for (unsigned int r = 0; r < 4; r++)
 
20035
      {
 
20036
        values[1] += coefficients0[r]*basisvalues[r];
 
20037
        values[2] += coefficients1[r]*basisvalues[r];
 
20038
        values[3] += coefficients2[r]*basisvalues[r];
 
20039
      }// end loop over 'r'
 
20040
      
 
20041
      // Using covariant Piola transform to map values back to the physical element.
 
20042
      const double tmp_ref0 = values[1];
 
20043
      const double tmp_ref1 = values[2];
 
20044
      const double tmp_ref2 = values[3];
 
20045
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
20046
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
20047
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
20048
        break;
 
20049
      }
 
20050
    case 8:
 
20051
      {
 
20052
        
 
20053
      // Array of basisvalues.
 
20054
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
20055
      
 
20056
      // Declare helper variables.
 
20057
      unsigned int rr = 0;
 
20058
      unsigned int ss = 0;
 
20059
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
20060
      
 
20061
      // Compute basisvalues.
 
20062
      basisvalues[0] = 1.00000000;
 
20063
      basisvalues[1] = tmp0;
 
20064
      for (unsigned int r = 0; r < 1; r++)
 
20065
      {
 
20066
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20067
        ss = r*(r + 1)*(r + 2)/6;
 
20068
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20069
      }// end loop over 'r'
 
20070
      for (unsigned int r = 0; r < 1; r++)
 
20071
      {
 
20072
        for (unsigned int s = 0; s < 1 - r; s++)
 
20073
        {
 
20074
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20075
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20076
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20077
        }// end loop over 's'
 
20078
      }// end loop over 'r'
 
20079
      for (unsigned int r = 0; r < 2; r++)
 
20080
      {
 
20081
        for (unsigned int s = 0; s < 2 - r; s++)
 
20082
        {
 
20083
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20084
          {
 
20085
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20086
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20087
          }// end loop over 't'
 
20088
        }// end loop over 's'
 
20089
      }// end loop over 'r'
 
20090
      
 
20091
      // Table(s) of coefficients.
 
20092
      static const double coefficients0[4] = \
 
20093
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
20094
      
 
20095
      static const double coefficients1[4] = \
 
20096
      {0.57735027, -0.18257419, 0.10540926, -0.14907120};
 
20097
      
 
20098
      static const double coefficients2[4] = \
 
20099
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
20100
      
 
20101
      // Compute value(s).
 
20102
      for (unsigned int r = 0; r < 4; r++)
 
20103
      {
 
20104
        values[1] += coefficients0[r]*basisvalues[r];
 
20105
        values[2] += coefficients1[r]*basisvalues[r];
 
20106
        values[3] += coefficients2[r]*basisvalues[r];
 
20107
      }// end loop over 'r'
 
20108
      
 
20109
      // Using covariant Piola transform to map values back to the physical element.
 
20110
      const double tmp_ref0 = values[1];
 
20111
      const double tmp_ref1 = values[2];
 
20112
      const double tmp_ref2 = values[3];
 
20113
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
20114
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
20115
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
20116
        break;
 
20117
      }
 
20118
    case 9:
 
20119
      {
 
20120
        
 
20121
      // Array of basisvalues.
 
20122
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
20123
      
 
20124
      // Declare helper variables.
 
20125
      unsigned int rr = 0;
 
20126
      unsigned int ss = 0;
 
20127
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
20128
      
 
20129
      // Compute basisvalues.
 
20130
      basisvalues[0] = 1.00000000;
 
20131
      basisvalues[1] = tmp0;
 
20132
      for (unsigned int r = 0; r < 1; r++)
 
20133
      {
 
20134
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20135
        ss = r*(r + 1)*(r + 2)/6;
 
20136
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20137
      }// end loop over 'r'
 
20138
      for (unsigned int r = 0; r < 1; r++)
 
20139
      {
 
20140
        for (unsigned int s = 0; s < 1 - r; s++)
 
20141
        {
 
20142
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20143
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20144
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20145
        }// end loop over 's'
 
20146
      }// end loop over 'r'
 
20147
      for (unsigned int r = 0; r < 2; r++)
 
20148
      {
 
20149
        for (unsigned int s = 0; s < 2 - r; s++)
 
20150
        {
 
20151
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20152
          {
 
20153
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20154
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20155
          }// end loop over 't'
 
20156
        }// end loop over 's'
 
20157
      }// end loop over 'r'
 
20158
      
 
20159
      // Table(s) of coefficients.
 
20160
      static const double coefficients0[4] = \
 
20161
      {0.57735027, 0.00000000, -0.21081851, -0.14907120};
 
20162
      
 
20163
      static const double coefficients1[4] = \
 
20164
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
20165
      
 
20166
      static const double coefficients2[4] = \
 
20167
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
20168
      
 
20169
      // Compute value(s).
 
20170
      for (unsigned int r = 0; r < 4; r++)
 
20171
      {
 
20172
        values[1] += coefficients0[r]*basisvalues[r];
 
20173
        values[2] += coefficients1[r]*basisvalues[r];
 
20174
        values[3] += coefficients2[r]*basisvalues[r];
 
20175
      }// end loop over 'r'
 
20176
      
 
20177
      // Using covariant Piola transform to map values back to the physical element.
 
20178
      const double tmp_ref0 = values[1];
 
20179
      const double tmp_ref1 = values[2];
 
20180
      const double tmp_ref2 = values[3];
 
20181
      values[1] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
20182
      values[2] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
20183
      values[3] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
20184
        break;
 
20185
      }
4545
20186
    }
4546
20187
    
4547
20188
  }
4686
20327
      values[r] = 0.00000000;
4687
20328
    }// end loop over 'r'
4688
20329
    
4689
 
    if (0 <= i && i <= 3)
4690
 
    {
4691
 
      // Map degree of freedom to element degree of freedom
4692
 
      const unsigned int dof = i;
4693
 
      
4694
 
      // Array of basisvalues.
4695
 
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4696
 
      
4697
 
      // Declare helper variables.
4698
 
      unsigned int rr = 0;
4699
 
      unsigned int ss = 0;
4700
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4701
 
      
4702
 
      // Compute basisvalues.
4703
 
      basisvalues[0] = 1.00000000;
4704
 
      basisvalues[1] = tmp0;
4705
 
      for (unsigned int r = 0; r < 1; r++)
4706
 
      {
4707
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4708
 
        ss = r*(r + 1)*(r + 2)/6;
4709
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4710
 
      }// end loop over 'r'
4711
 
      for (unsigned int r = 0; r < 1; r++)
4712
 
      {
4713
 
        for (unsigned int s = 0; s < 1 - r; s++)
4714
 
        {
4715
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4716
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4717
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4718
 
        }// end loop over 's'
4719
 
      }// end loop over 'r'
4720
 
      for (unsigned int r = 0; r < 2; r++)
4721
 
      {
4722
 
        for (unsigned int s = 0; s < 2 - r; s++)
4723
 
        {
4724
 
          for (unsigned int t = 0; t < 2 - r - s; t++)
4725
 
          {
4726
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4727
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4728
 
          }// end loop over 't'
4729
 
        }// end loop over 's'
4730
 
      }// end loop over 'r'
4731
 
      
4732
 
      // Table(s) of coefficients.
4733
 
      static const double coefficients0[4][4] = \
4734
 
      {{0.28867513, -0.18257419, -0.10540926, -0.07453560},
4735
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560},
4736
 
      {0.28867513, 0.00000000, 0.21081851, -0.07453560},
4737
 
      {0.28867513, 0.00000000, 0.00000000, 0.22360680}};
4738
 
      
4739
 
      // Tables of derivatives of the polynomial base (transpose).
4740
 
      static const double dmats0[4][4] = \
4741
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4742
 
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
4743
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
4744
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4745
 
      
4746
 
      static const double dmats1[4][4] = \
4747
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4748
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
4749
 
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
4750
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4751
 
      
4752
 
      static const double dmats2[4][4] = \
4753
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4754
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
4755
 
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
4756
 
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4757
 
      
4758
 
      // Compute reference derivatives.
4759
 
      // Declare pointer to array of derivatives on FIAT element.
4760
 
      double *derivatives = new double[num_derivatives];
4761
 
      for (unsigned int r = 0; r < num_derivatives; r++)
4762
 
      {
4763
 
        derivatives[r] = 0.00000000;
4764
 
      }// end loop over 'r'
4765
 
      
4766
 
      // Declare derivative matrix (of polynomial basis).
4767
 
      double dmats[4][4] = \
4768
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4769
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
4770
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
4771
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4772
 
      
4773
 
      // Declare (auxiliary) derivative matrix (of polynomial basis).
4774
 
      double dmats_old[4][4] = \
4775
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4776
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
4777
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
4778
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4779
 
      
4780
 
      // Loop possible derivatives.
4781
 
      for (unsigned int r = 0; r < num_derivatives; r++)
4782
 
      {
4783
 
        // Resetting dmats values to compute next derivative.
4784
 
        for (unsigned int t = 0; t < 4; t++)
4785
 
        {
4786
 
          for (unsigned int u = 0; u < 4; u++)
4787
 
          {
4788
 
            dmats[t][u] = 0.00000000;
4789
 
            if (t == u)
4790
 
            {
4791
 
            dmats[t][u] = 1.00000000;
4792
 
            }
4793
 
            
4794
 
          }// end loop over 'u'
4795
 
        }// end loop over 't'
4796
 
        
4797
 
        // Looping derivative order to generate dmats.
4798
 
        for (unsigned int s = 0; s < n; s++)
4799
 
        {
4800
 
          // Updating dmats_old with new values and resetting dmats.
4801
 
          for (unsigned int t = 0; t < 4; t++)
4802
 
          {
4803
 
            for (unsigned int u = 0; u < 4; u++)
4804
 
            {
4805
 
              dmats_old[t][u] = dmats[t][u];
4806
 
              dmats[t][u] = 0.00000000;
4807
 
            }// end loop over 'u'
4808
 
          }// end loop over 't'
4809
 
          
4810
 
          // Update dmats using an inner product.
4811
 
          if (combinations[r][s] == 0)
4812
 
          {
4813
 
          for (unsigned int t = 0; t < 4; t++)
4814
 
          {
4815
 
            for (unsigned int u = 0; u < 4; u++)
4816
 
            {
4817
 
              for (unsigned int tu = 0; tu < 4; tu++)
4818
 
              {
4819
 
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
4820
 
              }// end loop over 'tu'
4821
 
            }// end loop over 'u'
4822
 
          }// end loop over 't'
4823
 
          }
4824
 
          
4825
 
          if (combinations[r][s] == 1)
4826
 
          {
4827
 
          for (unsigned int t = 0; t < 4; t++)
4828
 
          {
4829
 
            for (unsigned int u = 0; u < 4; u++)
4830
 
            {
4831
 
              for (unsigned int tu = 0; tu < 4; tu++)
4832
 
              {
4833
 
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
4834
 
              }// end loop over 'tu'
4835
 
            }// end loop over 'u'
4836
 
          }// end loop over 't'
4837
 
          }
4838
 
          
4839
 
          if (combinations[r][s] == 2)
4840
 
          {
4841
 
          for (unsigned int t = 0; t < 4; t++)
4842
 
          {
4843
 
            for (unsigned int u = 0; u < 4; u++)
4844
 
            {
4845
 
              for (unsigned int tu = 0; tu < 4; tu++)
4846
 
              {
4847
 
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
4848
 
              }// end loop over 'tu'
4849
 
            }// end loop over 'u'
4850
 
          }// end loop over 't'
4851
 
          }
4852
 
          
4853
 
        }// end loop over 's'
4854
 
        for (unsigned int s = 0; s < 4; s++)
4855
 
        {
4856
 
          for (unsigned int t = 0; t < 4; t++)
4857
 
          {
4858
 
            derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
4859
 
          }// end loop over 't'
4860
 
        }// end loop over 's'
4861
 
      }// end loop over 'r'
4862
 
      
4863
 
      // Transform derivatives back to physical element
4864
 
      for (unsigned int r = 0; r < num_derivatives; r++)
4865
 
      {
4866
 
        for (unsigned int s = 0; s < num_derivatives; s++)
4867
 
        {
4868
 
          values[r] += transform[r][s]*derivatives[s];
4869
 
        }// end loop over 's'
4870
 
      }// end loop over 'r'
4871
 
      
4872
 
      // Delete pointer to array of derivatives on FIAT element
4873
 
      delete [] derivatives;
4874
 
      
4875
 
      // Delete pointer to array of combinations of derivatives and transform
4876
 
      for (unsigned int r = 0; r < num_derivatives; r++)
4877
 
      {
4878
 
        delete [] combinations[r];
4879
 
      }// end loop over 'r'
4880
 
      delete [] combinations;
4881
 
      for (unsigned int r = 0; r < num_derivatives; r++)
4882
 
      {
4883
 
        delete [] transform[r];
4884
 
      }// end loop over 'r'
4885
 
      delete [] transform;
4886
 
    }
4887
 
    
4888
 
    if (4 <= i && i <= 9)
4889
 
    {
4890
 
      // Map degree of freedom to element degree of freedom
4891
 
      const unsigned int dof = i - 4;
4892
 
      
4893
 
      // Array of basisvalues.
4894
 
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
4895
 
      
4896
 
      // Declare helper variables.
4897
 
      unsigned int rr = 0;
4898
 
      unsigned int ss = 0;
4899
 
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
4900
 
      
4901
 
      // Compute basisvalues.
4902
 
      basisvalues[0] = 1.00000000;
4903
 
      basisvalues[1] = tmp0;
4904
 
      for (unsigned int r = 0; r < 1; r++)
4905
 
      {
4906
 
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
4907
 
        ss = r*(r + 1)*(r + 2)/6;
4908
 
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
4909
 
      }// end loop over 'r'
4910
 
      for (unsigned int r = 0; r < 1; r++)
4911
 
      {
4912
 
        for (unsigned int s = 0; s < 1 - r; s++)
4913
 
        {
4914
 
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
4915
 
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
4916
 
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
4917
 
        }// end loop over 's'
4918
 
      }// end loop over 'r'
4919
 
      for (unsigned int r = 0; r < 2; r++)
4920
 
      {
4921
 
        for (unsigned int s = 0; s < 2 - r; s++)
4922
 
        {
4923
 
          for (unsigned int t = 0; t < 2 - r - s; t++)
4924
 
          {
4925
 
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
4926
 
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
4927
 
          }// end loop over 't'
4928
 
        }// end loop over 's'
4929
 
      }// end loop over 'r'
4930
 
      
4931
 
      // Table(s) of coefficients.
4932
 
      static const double coefficients0[6][4] = \
4933
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4934
 
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680},
4935
 
      {-0.28867513, 0.00000000, -0.21081851, 0.07453560},
4936
 
      {0.28867513, 0.00000000, 0.00000000, 0.22360680},
4937
 
      {0.28867513, 0.00000000, 0.21081851, -0.07453560},
4938
 
      {0.57735027, 0.00000000, -0.21081851, -0.14907120}};
4939
 
      
4940
 
      static const double coefficients1[6][4] = \
4941
 
      {{-0.28867513, 0.00000000, 0.00000000, -0.22360680},
4942
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
4943
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560},
4944
 
      {0.28867513, 0.00000000, 0.00000000, 0.22360680},
4945
 
      {0.57735027, -0.18257419, 0.10540926, -0.14907120},
4946
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
4947
 
      
4948
 
      static const double coefficients2[6][4] = \
4949
 
      {{0.28867513, 0.00000000, 0.21081851, -0.07453560},
4950
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560},
4951
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
4952
 
      {0.57735027, -0.18257419, -0.10540926, 0.14907120},
4953
 
      {0.28867513, 0.00000000, 0.21081851, -0.07453560},
4954
 
      {0.28867513, 0.18257419, -0.10540926, -0.07453560}};
4955
 
      
4956
 
      // Tables of derivatives of the polynomial base (transpose).
4957
 
      static const double dmats0[4][4] = \
4958
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4959
 
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
4960
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
4961
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4962
 
      
4963
 
      static const double dmats1[4][4] = \
4964
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4965
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
4966
 
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
4967
 
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
4968
 
      
4969
 
      static const double dmats2[4][4] = \
4970
 
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
4971
 
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
4972
 
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
4973
 
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
4974
 
      
4975
 
      // Compute reference derivatives.
4976
 
      // Declare pointer to array of derivatives on FIAT element.
4977
 
      double *derivatives = new double[3*num_derivatives];
4978
 
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
4979
 
      {
4980
 
        derivatives[r] = 0.00000000;
4981
 
      }// end loop over 'r'
4982
 
      
4983
 
      // Declare derivative matrix (of polynomial basis).
4984
 
      double dmats[4][4] = \
4985
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4986
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
4987
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
4988
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4989
 
      
4990
 
      // Declare (auxiliary) derivative matrix (of polynomial basis).
4991
 
      double dmats_old[4][4] = \
4992
 
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
4993
 
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
4994
 
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
4995
 
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
4996
 
      
4997
 
      // Loop possible derivatives.
4998
 
      for (unsigned int r = 0; r < num_derivatives; r++)
4999
 
      {
5000
 
        // Resetting dmats values to compute next derivative.
5001
 
        for (unsigned int t = 0; t < 4; t++)
5002
 
        {
5003
 
          for (unsigned int u = 0; u < 4; u++)
5004
 
          {
5005
 
            dmats[t][u] = 0.00000000;
5006
 
            if (t == u)
5007
 
            {
5008
 
            dmats[t][u] = 1.00000000;
5009
 
            }
5010
 
            
5011
 
          }// end loop over 'u'
5012
 
        }// end loop over 't'
5013
 
        
5014
 
        // Looping derivative order to generate dmats.
5015
 
        for (unsigned int s = 0; s < n; s++)
5016
 
        {
5017
 
          // Updating dmats_old with new values and resetting dmats.
5018
 
          for (unsigned int t = 0; t < 4; t++)
5019
 
          {
5020
 
            for (unsigned int u = 0; u < 4; u++)
5021
 
            {
5022
 
              dmats_old[t][u] = dmats[t][u];
5023
 
              dmats[t][u] = 0.00000000;
5024
 
            }// end loop over 'u'
5025
 
          }// end loop over 't'
5026
 
          
5027
 
          // Update dmats using an inner product.
5028
 
          if (combinations[r][s] == 0)
5029
 
          {
5030
 
          for (unsigned int t = 0; t < 4; t++)
5031
 
          {
5032
 
            for (unsigned int u = 0; u < 4; u++)
5033
 
            {
5034
 
              for (unsigned int tu = 0; tu < 4; tu++)
5035
 
              {
5036
 
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
5037
 
              }// end loop over 'tu'
5038
 
            }// end loop over 'u'
5039
 
          }// end loop over 't'
5040
 
          }
5041
 
          
5042
 
          if (combinations[r][s] == 1)
5043
 
          {
5044
 
          for (unsigned int t = 0; t < 4; t++)
5045
 
          {
5046
 
            for (unsigned int u = 0; u < 4; u++)
5047
 
            {
5048
 
              for (unsigned int tu = 0; tu < 4; tu++)
5049
 
              {
5050
 
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
5051
 
              }// end loop over 'tu'
5052
 
            }// end loop over 'u'
5053
 
          }// end loop over 't'
5054
 
          }
5055
 
          
5056
 
          if (combinations[r][s] == 2)
5057
 
          {
5058
 
          for (unsigned int t = 0; t < 4; t++)
5059
 
          {
5060
 
            for (unsigned int u = 0; u < 4; u++)
5061
 
            {
5062
 
              for (unsigned int tu = 0; tu < 4; tu++)
5063
 
              {
5064
 
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
5065
 
              }// end loop over 'tu'
5066
 
            }// end loop over 'u'
5067
 
          }// end loop over 't'
5068
 
          }
5069
 
          
5070
 
        }// end loop over 's'
5071
 
        for (unsigned int s = 0; s < 4; s++)
5072
 
        {
5073
 
          for (unsigned int t = 0; t < 4; t++)
5074
 
          {
5075
 
            derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
5076
 
            derivatives[num_derivatives + r] += coefficients1[dof][s]*dmats[s][t]*basisvalues[t];
5077
 
            derivatives[2*num_derivatives + r] += coefficients2[dof][s]*dmats[s][t]*basisvalues[t];
5078
 
          }// end loop over 't'
5079
 
        }// end loop over 's'
5080
 
        
5081
 
        // Using covariant Piola transform to map values back to the physical element
5082
 
        const double tmp_ref0 = derivatives[r];
5083
 
        const double tmp_ref1 = derivatives[num_derivatives + r];
5084
 
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
5085
 
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
5086
 
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
5087
 
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
5088
 
      }// end loop over 'r'
5089
 
      
5090
 
      // Transform derivatives back to physical element
5091
 
      for (unsigned int r = 0; r < num_derivatives; r++)
5092
 
      {
5093
 
        for (unsigned int s = 0; s < num_derivatives; s++)
5094
 
        {
5095
 
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
5096
 
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
5097
 
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
5098
 
        }// end loop over 's'
5099
 
      }// end loop over 'r'
5100
 
      
5101
 
      // Delete pointer to array of derivatives on FIAT element
5102
 
      delete [] derivatives;
5103
 
      
5104
 
      // Delete pointer to array of combinations of derivatives and transform
5105
 
      for (unsigned int r = 0; r < num_derivatives; r++)
5106
 
      {
5107
 
        delete [] combinations[r];
5108
 
      }// end loop over 'r'
5109
 
      delete [] combinations;
5110
 
      for (unsigned int r = 0; r < num_derivatives; r++)
5111
 
      {
5112
 
        delete [] transform[r];
5113
 
      }// end loop over 'r'
5114
 
      delete [] transform;
 
20330
    switch (i)
 
20331
    {
 
20332
    case 0:
 
20333
      {
 
20334
        
 
20335
      // Array of basisvalues.
 
20336
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
20337
      
 
20338
      // Declare helper variables.
 
20339
      unsigned int rr = 0;
 
20340
      unsigned int ss = 0;
 
20341
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
20342
      
 
20343
      // Compute basisvalues.
 
20344
      basisvalues[0] = 1.00000000;
 
20345
      basisvalues[1] = tmp0;
 
20346
      for (unsigned int r = 0; r < 1; r++)
 
20347
      {
 
20348
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20349
        ss = r*(r + 1)*(r + 2)/6;
 
20350
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20351
      }// end loop over 'r'
 
20352
      for (unsigned int r = 0; r < 1; r++)
 
20353
      {
 
20354
        for (unsigned int s = 0; s < 1 - r; s++)
 
20355
        {
 
20356
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20357
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20358
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20359
        }// end loop over 's'
 
20360
      }// end loop over 'r'
 
20361
      for (unsigned int r = 0; r < 2; r++)
 
20362
      {
 
20363
        for (unsigned int s = 0; s < 2 - r; s++)
 
20364
        {
 
20365
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20366
          {
 
20367
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20368
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20369
          }// end loop over 't'
 
20370
        }// end loop over 's'
 
20371
      }// end loop over 'r'
 
20372
      
 
20373
      // Table(s) of coefficients.
 
20374
      static const double coefficients0[4] = \
 
20375
      {0.28867513, -0.18257419, -0.10540926, -0.07453560};
 
20376
      
 
20377
      // Tables of derivatives of the polynomial base (transpose).
 
20378
      static const double dmats0[4][4] = \
 
20379
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20380
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
20381
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20382
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20383
      
 
20384
      static const double dmats1[4][4] = \
 
20385
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20386
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20387
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
20388
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20389
      
 
20390
      static const double dmats2[4][4] = \
 
20391
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20392
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20393
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
20394
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
20395
      
 
20396
      // Compute reference derivatives.
 
20397
      // Declare pointer to array of derivatives on FIAT element.
 
20398
      double *derivatives = new double[num_derivatives];
 
20399
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20400
      {
 
20401
        derivatives[r] = 0.00000000;
 
20402
      }// end loop over 'r'
 
20403
      
 
20404
      // Declare derivative matrix (of polynomial basis).
 
20405
      double dmats[4][4] = \
 
20406
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20407
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20408
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20409
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20410
      
 
20411
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
20412
      double dmats_old[4][4] = \
 
20413
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20414
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20415
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20416
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20417
      
 
20418
      // Loop possible derivatives.
 
20419
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20420
      {
 
20421
        // Resetting dmats values to compute next derivative.
 
20422
        for (unsigned int t = 0; t < 4; t++)
 
20423
        {
 
20424
          for (unsigned int u = 0; u < 4; u++)
 
20425
          {
 
20426
            dmats[t][u] = 0.00000000;
 
20427
            if (t == u)
 
20428
            {
 
20429
            dmats[t][u] = 1.00000000;
 
20430
            }
 
20431
            
 
20432
          }// end loop over 'u'
 
20433
        }// end loop over 't'
 
20434
        
 
20435
        // Looping derivative order to generate dmats.
 
20436
        for (unsigned int s = 0; s < n; s++)
 
20437
        {
 
20438
          // Updating dmats_old with new values and resetting dmats.
 
20439
          for (unsigned int t = 0; t < 4; t++)
 
20440
          {
 
20441
            for (unsigned int u = 0; u < 4; u++)
 
20442
            {
 
20443
              dmats_old[t][u] = dmats[t][u];
 
20444
              dmats[t][u] = 0.00000000;
 
20445
            }// end loop over 'u'
 
20446
          }// end loop over 't'
 
20447
          
 
20448
          // Update dmats using an inner product.
 
20449
          if (combinations[r][s] == 0)
 
20450
          {
 
20451
          for (unsigned int t = 0; t < 4; t++)
 
20452
          {
 
20453
            for (unsigned int u = 0; u < 4; u++)
 
20454
            {
 
20455
              for (unsigned int tu = 0; tu < 4; tu++)
 
20456
              {
 
20457
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
20458
              }// end loop over 'tu'
 
20459
            }// end loop over 'u'
 
20460
          }// end loop over 't'
 
20461
          }
 
20462
          
 
20463
          if (combinations[r][s] == 1)
 
20464
          {
 
20465
          for (unsigned int t = 0; t < 4; t++)
 
20466
          {
 
20467
            for (unsigned int u = 0; u < 4; u++)
 
20468
            {
 
20469
              for (unsigned int tu = 0; tu < 4; tu++)
 
20470
              {
 
20471
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
20472
              }// end loop over 'tu'
 
20473
            }// end loop over 'u'
 
20474
          }// end loop over 't'
 
20475
          }
 
20476
          
 
20477
          if (combinations[r][s] == 2)
 
20478
          {
 
20479
          for (unsigned int t = 0; t < 4; t++)
 
20480
          {
 
20481
            for (unsigned int u = 0; u < 4; u++)
 
20482
            {
 
20483
              for (unsigned int tu = 0; tu < 4; tu++)
 
20484
              {
 
20485
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
20486
              }// end loop over 'tu'
 
20487
            }// end loop over 'u'
 
20488
          }// end loop over 't'
 
20489
          }
 
20490
          
 
20491
        }// end loop over 's'
 
20492
        for (unsigned int s = 0; s < 4; s++)
 
20493
        {
 
20494
          for (unsigned int t = 0; t < 4; t++)
 
20495
          {
 
20496
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
20497
          }// end loop over 't'
 
20498
        }// end loop over 's'
 
20499
      }// end loop over 'r'
 
20500
      
 
20501
      // Transform derivatives back to physical element
 
20502
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20503
      {
 
20504
        for (unsigned int s = 0; s < num_derivatives; s++)
 
20505
        {
 
20506
          values[r] += transform[r][s]*derivatives[s];
 
20507
        }// end loop over 's'
 
20508
      }// end loop over 'r'
 
20509
      
 
20510
      // Delete pointer to array of derivatives on FIAT element
 
20511
      delete [] derivatives;
 
20512
      
 
20513
      // Delete pointer to array of combinations of derivatives and transform
 
20514
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20515
      {
 
20516
        delete [] combinations[r];
 
20517
      }// end loop over 'r'
 
20518
      delete [] combinations;
 
20519
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20520
      {
 
20521
        delete [] transform[r];
 
20522
      }// end loop over 'r'
 
20523
      delete [] transform;
 
20524
        break;
 
20525
      }
 
20526
    case 1:
 
20527
      {
 
20528
        
 
20529
      // Array of basisvalues.
 
20530
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
20531
      
 
20532
      // Declare helper variables.
 
20533
      unsigned int rr = 0;
 
20534
      unsigned int ss = 0;
 
20535
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
20536
      
 
20537
      // Compute basisvalues.
 
20538
      basisvalues[0] = 1.00000000;
 
20539
      basisvalues[1] = tmp0;
 
20540
      for (unsigned int r = 0; r < 1; r++)
 
20541
      {
 
20542
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20543
        ss = r*(r + 1)*(r + 2)/6;
 
20544
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20545
      }// end loop over 'r'
 
20546
      for (unsigned int r = 0; r < 1; r++)
 
20547
      {
 
20548
        for (unsigned int s = 0; s < 1 - r; s++)
 
20549
        {
 
20550
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20551
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20552
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20553
        }// end loop over 's'
 
20554
      }// end loop over 'r'
 
20555
      for (unsigned int r = 0; r < 2; r++)
 
20556
      {
 
20557
        for (unsigned int s = 0; s < 2 - r; s++)
 
20558
        {
 
20559
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20560
          {
 
20561
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20562
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20563
          }// end loop over 't'
 
20564
        }// end loop over 's'
 
20565
      }// end loop over 'r'
 
20566
      
 
20567
      // Table(s) of coefficients.
 
20568
      static const double coefficients0[4] = \
 
20569
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
20570
      
 
20571
      // Tables of derivatives of the polynomial base (transpose).
 
20572
      static const double dmats0[4][4] = \
 
20573
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20574
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
20575
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20576
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20577
      
 
20578
      static const double dmats1[4][4] = \
 
20579
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20580
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20581
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
20582
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20583
      
 
20584
      static const double dmats2[4][4] = \
 
20585
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20586
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20587
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
20588
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
20589
      
 
20590
      // Compute reference derivatives.
 
20591
      // Declare pointer to array of derivatives on FIAT element.
 
20592
      double *derivatives = new double[num_derivatives];
 
20593
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20594
      {
 
20595
        derivatives[r] = 0.00000000;
 
20596
      }// end loop over 'r'
 
20597
      
 
20598
      // Declare derivative matrix (of polynomial basis).
 
20599
      double dmats[4][4] = \
 
20600
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20601
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20602
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20603
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20604
      
 
20605
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
20606
      double dmats_old[4][4] = \
 
20607
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20608
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20609
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20610
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20611
      
 
20612
      // Loop possible derivatives.
 
20613
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20614
      {
 
20615
        // Resetting dmats values to compute next derivative.
 
20616
        for (unsigned int t = 0; t < 4; t++)
 
20617
        {
 
20618
          for (unsigned int u = 0; u < 4; u++)
 
20619
          {
 
20620
            dmats[t][u] = 0.00000000;
 
20621
            if (t == u)
 
20622
            {
 
20623
            dmats[t][u] = 1.00000000;
 
20624
            }
 
20625
            
 
20626
          }// end loop over 'u'
 
20627
        }// end loop over 't'
 
20628
        
 
20629
        // Looping derivative order to generate dmats.
 
20630
        for (unsigned int s = 0; s < n; s++)
 
20631
        {
 
20632
          // Updating dmats_old with new values and resetting dmats.
 
20633
          for (unsigned int t = 0; t < 4; t++)
 
20634
          {
 
20635
            for (unsigned int u = 0; u < 4; u++)
 
20636
            {
 
20637
              dmats_old[t][u] = dmats[t][u];
 
20638
              dmats[t][u] = 0.00000000;
 
20639
            }// end loop over 'u'
 
20640
          }// end loop over 't'
 
20641
          
 
20642
          // Update dmats using an inner product.
 
20643
          if (combinations[r][s] == 0)
 
20644
          {
 
20645
          for (unsigned int t = 0; t < 4; t++)
 
20646
          {
 
20647
            for (unsigned int u = 0; u < 4; u++)
 
20648
            {
 
20649
              for (unsigned int tu = 0; tu < 4; tu++)
 
20650
              {
 
20651
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
20652
              }// end loop over 'tu'
 
20653
            }// end loop over 'u'
 
20654
          }// end loop over 't'
 
20655
          }
 
20656
          
 
20657
          if (combinations[r][s] == 1)
 
20658
          {
 
20659
          for (unsigned int t = 0; t < 4; t++)
 
20660
          {
 
20661
            for (unsigned int u = 0; u < 4; u++)
 
20662
            {
 
20663
              for (unsigned int tu = 0; tu < 4; tu++)
 
20664
              {
 
20665
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
20666
              }// end loop over 'tu'
 
20667
            }// end loop over 'u'
 
20668
          }// end loop over 't'
 
20669
          }
 
20670
          
 
20671
          if (combinations[r][s] == 2)
 
20672
          {
 
20673
          for (unsigned int t = 0; t < 4; t++)
 
20674
          {
 
20675
            for (unsigned int u = 0; u < 4; u++)
 
20676
            {
 
20677
              for (unsigned int tu = 0; tu < 4; tu++)
 
20678
              {
 
20679
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
20680
              }// end loop over 'tu'
 
20681
            }// end loop over 'u'
 
20682
          }// end loop over 't'
 
20683
          }
 
20684
          
 
20685
        }// end loop over 's'
 
20686
        for (unsigned int s = 0; s < 4; s++)
 
20687
        {
 
20688
          for (unsigned int t = 0; t < 4; t++)
 
20689
          {
 
20690
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
20691
          }// end loop over 't'
 
20692
        }// end loop over 's'
 
20693
      }// end loop over 'r'
 
20694
      
 
20695
      // Transform derivatives back to physical element
 
20696
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20697
      {
 
20698
        for (unsigned int s = 0; s < num_derivatives; s++)
 
20699
        {
 
20700
          values[r] += transform[r][s]*derivatives[s];
 
20701
        }// end loop over 's'
 
20702
      }// end loop over 'r'
 
20703
      
 
20704
      // Delete pointer to array of derivatives on FIAT element
 
20705
      delete [] derivatives;
 
20706
      
 
20707
      // Delete pointer to array of combinations of derivatives and transform
 
20708
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20709
      {
 
20710
        delete [] combinations[r];
 
20711
      }// end loop over 'r'
 
20712
      delete [] combinations;
 
20713
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20714
      {
 
20715
        delete [] transform[r];
 
20716
      }// end loop over 'r'
 
20717
      delete [] transform;
 
20718
        break;
 
20719
      }
 
20720
    case 2:
 
20721
      {
 
20722
        
 
20723
      // Array of basisvalues.
 
20724
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
20725
      
 
20726
      // Declare helper variables.
 
20727
      unsigned int rr = 0;
 
20728
      unsigned int ss = 0;
 
20729
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
20730
      
 
20731
      // Compute basisvalues.
 
20732
      basisvalues[0] = 1.00000000;
 
20733
      basisvalues[1] = tmp0;
 
20734
      for (unsigned int r = 0; r < 1; r++)
 
20735
      {
 
20736
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20737
        ss = r*(r + 1)*(r + 2)/6;
 
20738
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20739
      }// end loop over 'r'
 
20740
      for (unsigned int r = 0; r < 1; r++)
 
20741
      {
 
20742
        for (unsigned int s = 0; s < 1 - r; s++)
 
20743
        {
 
20744
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20745
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20746
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20747
        }// end loop over 's'
 
20748
      }// end loop over 'r'
 
20749
      for (unsigned int r = 0; r < 2; r++)
 
20750
      {
 
20751
        for (unsigned int s = 0; s < 2 - r; s++)
 
20752
        {
 
20753
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20754
          {
 
20755
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20756
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20757
          }// end loop over 't'
 
20758
        }// end loop over 's'
 
20759
      }// end loop over 'r'
 
20760
      
 
20761
      // Table(s) of coefficients.
 
20762
      static const double coefficients0[4] = \
 
20763
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
20764
      
 
20765
      // Tables of derivatives of the polynomial base (transpose).
 
20766
      static const double dmats0[4][4] = \
 
20767
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20768
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
20769
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20770
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20771
      
 
20772
      static const double dmats1[4][4] = \
 
20773
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20774
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20775
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
20776
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20777
      
 
20778
      static const double dmats2[4][4] = \
 
20779
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20780
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20781
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
20782
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
20783
      
 
20784
      // Compute reference derivatives.
 
20785
      // Declare pointer to array of derivatives on FIAT element.
 
20786
      double *derivatives = new double[num_derivatives];
 
20787
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20788
      {
 
20789
        derivatives[r] = 0.00000000;
 
20790
      }// end loop over 'r'
 
20791
      
 
20792
      // Declare derivative matrix (of polynomial basis).
 
20793
      double dmats[4][4] = \
 
20794
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20795
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20796
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20797
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20798
      
 
20799
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
20800
      double dmats_old[4][4] = \
 
20801
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20802
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20803
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20804
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20805
      
 
20806
      // Loop possible derivatives.
 
20807
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20808
      {
 
20809
        // Resetting dmats values to compute next derivative.
 
20810
        for (unsigned int t = 0; t < 4; t++)
 
20811
        {
 
20812
          for (unsigned int u = 0; u < 4; u++)
 
20813
          {
 
20814
            dmats[t][u] = 0.00000000;
 
20815
            if (t == u)
 
20816
            {
 
20817
            dmats[t][u] = 1.00000000;
 
20818
            }
 
20819
            
 
20820
          }// end loop over 'u'
 
20821
        }// end loop over 't'
 
20822
        
 
20823
        // Looping derivative order to generate dmats.
 
20824
        for (unsigned int s = 0; s < n; s++)
 
20825
        {
 
20826
          // Updating dmats_old with new values and resetting dmats.
 
20827
          for (unsigned int t = 0; t < 4; t++)
 
20828
          {
 
20829
            for (unsigned int u = 0; u < 4; u++)
 
20830
            {
 
20831
              dmats_old[t][u] = dmats[t][u];
 
20832
              dmats[t][u] = 0.00000000;
 
20833
            }// end loop over 'u'
 
20834
          }// end loop over 't'
 
20835
          
 
20836
          // Update dmats using an inner product.
 
20837
          if (combinations[r][s] == 0)
 
20838
          {
 
20839
          for (unsigned int t = 0; t < 4; t++)
 
20840
          {
 
20841
            for (unsigned int u = 0; u < 4; u++)
 
20842
            {
 
20843
              for (unsigned int tu = 0; tu < 4; tu++)
 
20844
              {
 
20845
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
20846
              }// end loop over 'tu'
 
20847
            }// end loop over 'u'
 
20848
          }// end loop over 't'
 
20849
          }
 
20850
          
 
20851
          if (combinations[r][s] == 1)
 
20852
          {
 
20853
          for (unsigned int t = 0; t < 4; t++)
 
20854
          {
 
20855
            for (unsigned int u = 0; u < 4; u++)
 
20856
            {
 
20857
              for (unsigned int tu = 0; tu < 4; tu++)
 
20858
              {
 
20859
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
20860
              }// end loop over 'tu'
 
20861
            }// end loop over 'u'
 
20862
          }// end loop over 't'
 
20863
          }
 
20864
          
 
20865
          if (combinations[r][s] == 2)
 
20866
          {
 
20867
          for (unsigned int t = 0; t < 4; t++)
 
20868
          {
 
20869
            for (unsigned int u = 0; u < 4; u++)
 
20870
            {
 
20871
              for (unsigned int tu = 0; tu < 4; tu++)
 
20872
              {
 
20873
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
20874
              }// end loop over 'tu'
 
20875
            }// end loop over 'u'
 
20876
          }// end loop over 't'
 
20877
          }
 
20878
          
 
20879
        }// end loop over 's'
 
20880
        for (unsigned int s = 0; s < 4; s++)
 
20881
        {
 
20882
          for (unsigned int t = 0; t < 4; t++)
 
20883
          {
 
20884
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
20885
          }// end loop over 't'
 
20886
        }// end loop over 's'
 
20887
      }// end loop over 'r'
 
20888
      
 
20889
      // Transform derivatives back to physical element
 
20890
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20891
      {
 
20892
        for (unsigned int s = 0; s < num_derivatives; s++)
 
20893
        {
 
20894
          values[r] += transform[r][s]*derivatives[s];
 
20895
        }// end loop over 's'
 
20896
      }// end loop over 'r'
 
20897
      
 
20898
      // Delete pointer to array of derivatives on FIAT element
 
20899
      delete [] derivatives;
 
20900
      
 
20901
      // Delete pointer to array of combinations of derivatives and transform
 
20902
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20903
      {
 
20904
        delete [] combinations[r];
 
20905
      }// end loop over 'r'
 
20906
      delete [] combinations;
 
20907
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20908
      {
 
20909
        delete [] transform[r];
 
20910
      }// end loop over 'r'
 
20911
      delete [] transform;
 
20912
        break;
 
20913
      }
 
20914
    case 3:
 
20915
      {
 
20916
        
 
20917
      // Array of basisvalues.
 
20918
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
20919
      
 
20920
      // Declare helper variables.
 
20921
      unsigned int rr = 0;
 
20922
      unsigned int ss = 0;
 
20923
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
20924
      
 
20925
      // Compute basisvalues.
 
20926
      basisvalues[0] = 1.00000000;
 
20927
      basisvalues[1] = tmp0;
 
20928
      for (unsigned int r = 0; r < 1; r++)
 
20929
      {
 
20930
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20931
        ss = r*(r + 1)*(r + 2)/6;
 
20932
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
20933
      }// end loop over 'r'
 
20934
      for (unsigned int r = 0; r < 1; r++)
 
20935
      {
 
20936
        for (unsigned int s = 0; s < 1 - r; s++)
 
20937
        {
 
20938
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20939
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20940
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
20941
        }// end loop over 's'
 
20942
      }// end loop over 'r'
 
20943
      for (unsigned int r = 0; r < 2; r++)
 
20944
      {
 
20945
        for (unsigned int s = 0; s < 2 - r; s++)
 
20946
        {
 
20947
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20948
          {
 
20949
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20950
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
20951
          }// end loop over 't'
 
20952
        }// end loop over 's'
 
20953
      }// end loop over 'r'
 
20954
      
 
20955
      // Table(s) of coefficients.
 
20956
      static const double coefficients0[4] = \
 
20957
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
20958
      
 
20959
      // Tables of derivatives of the polynomial base (transpose).
 
20960
      static const double dmats0[4][4] = \
 
20961
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20962
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
20963
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20964
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20965
      
 
20966
      static const double dmats1[4][4] = \
 
20967
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20968
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20969
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
20970
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
20971
      
 
20972
      static const double dmats2[4][4] = \
 
20973
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20974
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
20975
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
20976
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
20977
      
 
20978
      // Compute reference derivatives.
 
20979
      // Declare pointer to array of derivatives on FIAT element.
 
20980
      double *derivatives = new double[num_derivatives];
 
20981
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20982
      {
 
20983
        derivatives[r] = 0.00000000;
 
20984
      }// end loop over 'r'
 
20985
      
 
20986
      // Declare derivative matrix (of polynomial basis).
 
20987
      double dmats[4][4] = \
 
20988
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20989
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20990
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20991
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20992
      
 
20993
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
20994
      double dmats_old[4][4] = \
 
20995
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
20996
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
20997
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
20998
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
20999
      
 
21000
      // Loop possible derivatives.
 
21001
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21002
      {
 
21003
        // Resetting dmats values to compute next derivative.
 
21004
        for (unsigned int t = 0; t < 4; t++)
 
21005
        {
 
21006
          for (unsigned int u = 0; u < 4; u++)
 
21007
          {
 
21008
            dmats[t][u] = 0.00000000;
 
21009
            if (t == u)
 
21010
            {
 
21011
            dmats[t][u] = 1.00000000;
 
21012
            }
 
21013
            
 
21014
          }// end loop over 'u'
 
21015
        }// end loop over 't'
 
21016
        
 
21017
        // Looping derivative order to generate dmats.
 
21018
        for (unsigned int s = 0; s < n; s++)
 
21019
        {
 
21020
          // Updating dmats_old with new values and resetting dmats.
 
21021
          for (unsigned int t = 0; t < 4; t++)
 
21022
          {
 
21023
            for (unsigned int u = 0; u < 4; u++)
 
21024
            {
 
21025
              dmats_old[t][u] = dmats[t][u];
 
21026
              dmats[t][u] = 0.00000000;
 
21027
            }// end loop over 'u'
 
21028
          }// end loop over 't'
 
21029
          
 
21030
          // Update dmats using an inner product.
 
21031
          if (combinations[r][s] == 0)
 
21032
          {
 
21033
          for (unsigned int t = 0; t < 4; t++)
 
21034
          {
 
21035
            for (unsigned int u = 0; u < 4; u++)
 
21036
            {
 
21037
              for (unsigned int tu = 0; tu < 4; tu++)
 
21038
              {
 
21039
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21040
              }// end loop over 'tu'
 
21041
            }// end loop over 'u'
 
21042
          }// end loop over 't'
 
21043
          }
 
21044
          
 
21045
          if (combinations[r][s] == 1)
 
21046
          {
 
21047
          for (unsigned int t = 0; t < 4; t++)
 
21048
          {
 
21049
            for (unsigned int u = 0; u < 4; u++)
 
21050
            {
 
21051
              for (unsigned int tu = 0; tu < 4; tu++)
 
21052
              {
 
21053
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21054
              }// end loop over 'tu'
 
21055
            }// end loop over 'u'
 
21056
          }// end loop over 't'
 
21057
          }
 
21058
          
 
21059
          if (combinations[r][s] == 2)
 
21060
          {
 
21061
          for (unsigned int t = 0; t < 4; t++)
 
21062
          {
 
21063
            for (unsigned int u = 0; u < 4; u++)
 
21064
            {
 
21065
              for (unsigned int tu = 0; tu < 4; tu++)
 
21066
              {
 
21067
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21068
              }// end loop over 'tu'
 
21069
            }// end loop over 'u'
 
21070
          }// end loop over 't'
 
21071
          }
 
21072
          
 
21073
        }// end loop over 's'
 
21074
        for (unsigned int s = 0; s < 4; s++)
 
21075
        {
 
21076
          for (unsigned int t = 0; t < 4; t++)
 
21077
          {
 
21078
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21079
          }// end loop over 't'
 
21080
        }// end loop over 's'
 
21081
      }// end loop over 'r'
 
21082
      
 
21083
      // Transform derivatives back to physical element
 
21084
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21085
      {
 
21086
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21087
        {
 
21088
          values[r] += transform[r][s]*derivatives[s];
 
21089
        }// end loop over 's'
 
21090
      }// end loop over 'r'
 
21091
      
 
21092
      // Delete pointer to array of derivatives on FIAT element
 
21093
      delete [] derivatives;
 
21094
      
 
21095
      // Delete pointer to array of combinations of derivatives and transform
 
21096
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21097
      {
 
21098
        delete [] combinations[r];
 
21099
      }// end loop over 'r'
 
21100
      delete [] combinations;
 
21101
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21102
      {
 
21103
        delete [] transform[r];
 
21104
      }// end loop over 'r'
 
21105
      delete [] transform;
 
21106
        break;
 
21107
      }
 
21108
    case 4:
 
21109
      {
 
21110
        
 
21111
      // Array of basisvalues.
 
21112
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21113
      
 
21114
      // Declare helper variables.
 
21115
      unsigned int rr = 0;
 
21116
      unsigned int ss = 0;
 
21117
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
21118
      
 
21119
      // Compute basisvalues.
 
21120
      basisvalues[0] = 1.00000000;
 
21121
      basisvalues[1] = tmp0;
 
21122
      for (unsigned int r = 0; r < 1; r++)
 
21123
      {
 
21124
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21125
        ss = r*(r + 1)*(r + 2)/6;
 
21126
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
21127
      }// end loop over 'r'
 
21128
      for (unsigned int r = 0; r < 1; r++)
 
21129
      {
 
21130
        for (unsigned int s = 0; s < 1 - r; s++)
 
21131
        {
 
21132
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21133
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21134
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
21135
        }// end loop over 's'
 
21136
      }// end loop over 'r'
 
21137
      for (unsigned int r = 0; r < 2; r++)
 
21138
      {
 
21139
        for (unsigned int s = 0; s < 2 - r; s++)
 
21140
        {
 
21141
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
21142
          {
 
21143
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21144
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
21145
          }// end loop over 't'
 
21146
        }// end loop over 's'
 
21147
      }// end loop over 'r'
 
21148
      
 
21149
      // Table(s) of coefficients.
 
21150
      static const double coefficients0[4] = \
 
21151
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21152
      
 
21153
      static const double coefficients1[4] = \
 
21154
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
21155
      
 
21156
      static const double coefficients2[4] = \
 
21157
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
21158
      
 
21159
      // Tables of derivatives of the polynomial base (transpose).
 
21160
      static const double dmats0[4][4] = \
 
21161
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21162
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
21163
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21164
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21165
      
 
21166
      static const double dmats1[4][4] = \
 
21167
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21168
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21169
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
21170
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21171
      
 
21172
      static const double dmats2[4][4] = \
 
21173
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21174
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21175
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
21176
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
21177
      
 
21178
      // Compute reference derivatives.
 
21179
      // Declare pointer to array of derivatives on FIAT element.
 
21180
      double *derivatives = new double[3*num_derivatives];
 
21181
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
21182
      {
 
21183
        derivatives[r] = 0.00000000;
 
21184
      }// end loop over 'r'
 
21185
      
 
21186
      // Declare derivative matrix (of polynomial basis).
 
21187
      double dmats[4][4] = \
 
21188
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21189
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21190
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21191
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21192
      
 
21193
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21194
      double dmats_old[4][4] = \
 
21195
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21196
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21197
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21198
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21199
      
 
21200
      // Loop possible derivatives.
 
21201
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21202
      {
 
21203
        // Resetting dmats values to compute next derivative.
 
21204
        for (unsigned int t = 0; t < 4; t++)
 
21205
        {
 
21206
          for (unsigned int u = 0; u < 4; u++)
 
21207
          {
 
21208
            dmats[t][u] = 0.00000000;
 
21209
            if (t == u)
 
21210
            {
 
21211
            dmats[t][u] = 1.00000000;
 
21212
            }
 
21213
            
 
21214
          }// end loop over 'u'
 
21215
        }// end loop over 't'
 
21216
        
 
21217
        // Looping derivative order to generate dmats.
 
21218
        for (unsigned int s = 0; s < n; s++)
 
21219
        {
 
21220
          // Updating dmats_old with new values and resetting dmats.
 
21221
          for (unsigned int t = 0; t < 4; t++)
 
21222
          {
 
21223
            for (unsigned int u = 0; u < 4; u++)
 
21224
            {
 
21225
              dmats_old[t][u] = dmats[t][u];
 
21226
              dmats[t][u] = 0.00000000;
 
21227
            }// end loop over 'u'
 
21228
          }// end loop over 't'
 
21229
          
 
21230
          // Update dmats using an inner product.
 
21231
          if (combinations[r][s] == 0)
 
21232
          {
 
21233
          for (unsigned int t = 0; t < 4; t++)
 
21234
          {
 
21235
            for (unsigned int u = 0; u < 4; u++)
 
21236
            {
 
21237
              for (unsigned int tu = 0; tu < 4; tu++)
 
21238
              {
 
21239
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21240
              }// end loop over 'tu'
 
21241
            }// end loop over 'u'
 
21242
          }// end loop over 't'
 
21243
          }
 
21244
          
 
21245
          if (combinations[r][s] == 1)
 
21246
          {
 
21247
          for (unsigned int t = 0; t < 4; t++)
 
21248
          {
 
21249
            for (unsigned int u = 0; u < 4; u++)
 
21250
            {
 
21251
              for (unsigned int tu = 0; tu < 4; tu++)
 
21252
              {
 
21253
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21254
              }// end loop over 'tu'
 
21255
            }// end loop over 'u'
 
21256
          }// end loop over 't'
 
21257
          }
 
21258
          
 
21259
          if (combinations[r][s] == 2)
 
21260
          {
 
21261
          for (unsigned int t = 0; t < 4; t++)
 
21262
          {
 
21263
            for (unsigned int u = 0; u < 4; u++)
 
21264
            {
 
21265
              for (unsigned int tu = 0; tu < 4; tu++)
 
21266
              {
 
21267
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21268
              }// end loop over 'tu'
 
21269
            }// end loop over 'u'
 
21270
          }// end loop over 't'
 
21271
          }
 
21272
          
 
21273
        }// end loop over 's'
 
21274
        for (unsigned int s = 0; s < 4; s++)
 
21275
        {
 
21276
          for (unsigned int t = 0; t < 4; t++)
 
21277
          {
 
21278
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21279
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
21280
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
21281
          }// end loop over 't'
 
21282
        }// end loop over 's'
 
21283
        
 
21284
        // Using covariant Piola transform to map values back to the physical element
 
21285
        const double tmp_ref0 = derivatives[r];
 
21286
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
21287
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
21288
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
21289
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
21290
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
21291
      }// end loop over 'r'
 
21292
      
 
21293
      // Transform derivatives back to physical element
 
21294
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21295
      {
 
21296
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21297
        {
 
21298
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
21299
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
21300
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
21301
        }// end loop over 's'
 
21302
      }// end loop over 'r'
 
21303
      
 
21304
      // Delete pointer to array of derivatives on FIAT element
 
21305
      delete [] derivatives;
 
21306
      
 
21307
      // Delete pointer to array of combinations of derivatives and transform
 
21308
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21309
      {
 
21310
        delete [] combinations[r];
 
21311
      }// end loop over 'r'
 
21312
      delete [] combinations;
 
21313
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21314
      {
 
21315
        delete [] transform[r];
 
21316
      }// end loop over 'r'
 
21317
      delete [] transform;
 
21318
        break;
 
21319
      }
 
21320
    case 5:
 
21321
      {
 
21322
        
 
21323
      // Array of basisvalues.
 
21324
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21325
      
 
21326
      // Declare helper variables.
 
21327
      unsigned int rr = 0;
 
21328
      unsigned int ss = 0;
 
21329
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
21330
      
 
21331
      // Compute basisvalues.
 
21332
      basisvalues[0] = 1.00000000;
 
21333
      basisvalues[1] = tmp0;
 
21334
      for (unsigned int r = 0; r < 1; r++)
 
21335
      {
 
21336
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21337
        ss = r*(r + 1)*(r + 2)/6;
 
21338
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
21339
      }// end loop over 'r'
 
21340
      for (unsigned int r = 0; r < 1; r++)
 
21341
      {
 
21342
        for (unsigned int s = 0; s < 1 - r; s++)
 
21343
        {
 
21344
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21345
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21346
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
21347
        }// end loop over 's'
 
21348
      }// end loop over 'r'
 
21349
      for (unsigned int r = 0; r < 2; r++)
 
21350
      {
 
21351
        for (unsigned int s = 0; s < 2 - r; s++)
 
21352
        {
 
21353
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
21354
          {
 
21355
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21356
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
21357
          }// end loop over 't'
 
21358
        }// end loop over 's'
 
21359
      }// end loop over 'r'
 
21360
      
 
21361
      // Table(s) of coefficients.
 
21362
      static const double coefficients0[4] = \
 
21363
      {-0.28867513, 0.00000000, 0.00000000, -0.22360680};
 
21364
      
 
21365
      static const double coefficients1[4] = \
 
21366
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21367
      
 
21368
      static const double coefficients2[4] = \
 
21369
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
21370
      
 
21371
      // Tables of derivatives of the polynomial base (transpose).
 
21372
      static const double dmats0[4][4] = \
 
21373
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21374
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
21375
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21376
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21377
      
 
21378
      static const double dmats1[4][4] = \
 
21379
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21380
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21381
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
21382
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21383
      
 
21384
      static const double dmats2[4][4] = \
 
21385
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21386
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21387
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
21388
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
21389
      
 
21390
      // Compute reference derivatives.
 
21391
      // Declare pointer to array of derivatives on FIAT element.
 
21392
      double *derivatives = new double[3*num_derivatives];
 
21393
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
21394
      {
 
21395
        derivatives[r] = 0.00000000;
 
21396
      }// end loop over 'r'
 
21397
      
 
21398
      // Declare derivative matrix (of polynomial basis).
 
21399
      double dmats[4][4] = \
 
21400
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21401
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21402
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21403
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21404
      
 
21405
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21406
      double dmats_old[4][4] = \
 
21407
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21408
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21409
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21410
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21411
      
 
21412
      // Loop possible derivatives.
 
21413
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21414
      {
 
21415
        // Resetting dmats values to compute next derivative.
 
21416
        for (unsigned int t = 0; t < 4; t++)
 
21417
        {
 
21418
          for (unsigned int u = 0; u < 4; u++)
 
21419
          {
 
21420
            dmats[t][u] = 0.00000000;
 
21421
            if (t == u)
 
21422
            {
 
21423
            dmats[t][u] = 1.00000000;
 
21424
            }
 
21425
            
 
21426
          }// end loop over 'u'
 
21427
        }// end loop over 't'
 
21428
        
 
21429
        // Looping derivative order to generate dmats.
 
21430
        for (unsigned int s = 0; s < n; s++)
 
21431
        {
 
21432
          // Updating dmats_old with new values and resetting dmats.
 
21433
          for (unsigned int t = 0; t < 4; t++)
 
21434
          {
 
21435
            for (unsigned int u = 0; u < 4; u++)
 
21436
            {
 
21437
              dmats_old[t][u] = dmats[t][u];
 
21438
              dmats[t][u] = 0.00000000;
 
21439
            }// end loop over 'u'
 
21440
          }// end loop over 't'
 
21441
          
 
21442
          // Update dmats using an inner product.
 
21443
          if (combinations[r][s] == 0)
 
21444
          {
 
21445
          for (unsigned int t = 0; t < 4; t++)
 
21446
          {
 
21447
            for (unsigned int u = 0; u < 4; u++)
 
21448
            {
 
21449
              for (unsigned int tu = 0; tu < 4; tu++)
 
21450
              {
 
21451
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21452
              }// end loop over 'tu'
 
21453
            }// end loop over 'u'
 
21454
          }// end loop over 't'
 
21455
          }
 
21456
          
 
21457
          if (combinations[r][s] == 1)
 
21458
          {
 
21459
          for (unsigned int t = 0; t < 4; t++)
 
21460
          {
 
21461
            for (unsigned int u = 0; u < 4; u++)
 
21462
            {
 
21463
              for (unsigned int tu = 0; tu < 4; tu++)
 
21464
              {
 
21465
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21466
              }// end loop over 'tu'
 
21467
            }// end loop over 'u'
 
21468
          }// end loop over 't'
 
21469
          }
 
21470
          
 
21471
          if (combinations[r][s] == 2)
 
21472
          {
 
21473
          for (unsigned int t = 0; t < 4; t++)
 
21474
          {
 
21475
            for (unsigned int u = 0; u < 4; u++)
 
21476
            {
 
21477
              for (unsigned int tu = 0; tu < 4; tu++)
 
21478
              {
 
21479
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21480
              }// end loop over 'tu'
 
21481
            }// end loop over 'u'
 
21482
          }// end loop over 't'
 
21483
          }
 
21484
          
 
21485
        }// end loop over 's'
 
21486
        for (unsigned int s = 0; s < 4; s++)
 
21487
        {
 
21488
          for (unsigned int t = 0; t < 4; t++)
 
21489
          {
 
21490
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21491
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
21492
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
21493
          }// end loop over 't'
 
21494
        }// end loop over 's'
 
21495
        
 
21496
        // Using covariant Piola transform to map values back to the physical element
 
21497
        const double tmp_ref0 = derivatives[r];
 
21498
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
21499
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
21500
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
21501
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
21502
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
21503
      }// end loop over 'r'
 
21504
      
 
21505
      // Transform derivatives back to physical element
 
21506
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21507
      {
 
21508
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21509
        {
 
21510
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
21511
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
21512
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
21513
        }// end loop over 's'
 
21514
      }// end loop over 'r'
 
21515
      
 
21516
      // Delete pointer to array of derivatives on FIAT element
 
21517
      delete [] derivatives;
 
21518
      
 
21519
      // Delete pointer to array of combinations of derivatives and transform
 
21520
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21521
      {
 
21522
        delete [] combinations[r];
 
21523
      }// end loop over 'r'
 
21524
      delete [] combinations;
 
21525
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21526
      {
 
21527
        delete [] transform[r];
 
21528
      }// end loop over 'r'
 
21529
      delete [] transform;
 
21530
        break;
 
21531
      }
 
21532
    case 6:
 
21533
      {
 
21534
        
 
21535
      // Array of basisvalues.
 
21536
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21537
      
 
21538
      // Declare helper variables.
 
21539
      unsigned int rr = 0;
 
21540
      unsigned int ss = 0;
 
21541
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
21542
      
 
21543
      // Compute basisvalues.
 
21544
      basisvalues[0] = 1.00000000;
 
21545
      basisvalues[1] = tmp0;
 
21546
      for (unsigned int r = 0; r < 1; r++)
 
21547
      {
 
21548
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21549
        ss = r*(r + 1)*(r + 2)/6;
 
21550
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
21551
      }// end loop over 'r'
 
21552
      for (unsigned int r = 0; r < 1; r++)
 
21553
      {
 
21554
        for (unsigned int s = 0; s < 1 - r; s++)
 
21555
        {
 
21556
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21557
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21558
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
21559
        }// end loop over 's'
 
21560
      }// end loop over 'r'
 
21561
      for (unsigned int r = 0; r < 2; r++)
 
21562
      {
 
21563
        for (unsigned int s = 0; s < 2 - r; s++)
 
21564
        {
 
21565
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
21566
          {
 
21567
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21568
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
21569
          }// end loop over 't'
 
21570
        }// end loop over 's'
 
21571
      }// end loop over 'r'
 
21572
      
 
21573
      // Table(s) of coefficients.
 
21574
      static const double coefficients0[4] = \
 
21575
      {-0.28867513, 0.00000000, -0.21081851, 0.07453560};
 
21576
      
 
21577
      static const double coefficients1[4] = \
 
21578
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
21579
      
 
21580
      static const double coefficients2[4] = \
 
21581
      {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21582
      
 
21583
      // Tables of derivatives of the polynomial base (transpose).
 
21584
      static const double dmats0[4][4] = \
 
21585
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21586
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
21587
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21588
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21589
      
 
21590
      static const double dmats1[4][4] = \
 
21591
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21592
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21593
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
21594
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21595
      
 
21596
      static const double dmats2[4][4] = \
 
21597
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21598
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21599
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
21600
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
21601
      
 
21602
      // Compute reference derivatives.
 
21603
      // Declare pointer to array of derivatives on FIAT element.
 
21604
      double *derivatives = new double[3*num_derivatives];
 
21605
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
21606
      {
 
21607
        derivatives[r] = 0.00000000;
 
21608
      }// end loop over 'r'
 
21609
      
 
21610
      // Declare derivative matrix (of polynomial basis).
 
21611
      double dmats[4][4] = \
 
21612
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21613
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21614
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21615
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21616
      
 
21617
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21618
      double dmats_old[4][4] = \
 
21619
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21620
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21621
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21622
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21623
      
 
21624
      // Loop possible derivatives.
 
21625
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21626
      {
 
21627
        // Resetting dmats values to compute next derivative.
 
21628
        for (unsigned int t = 0; t < 4; t++)
 
21629
        {
 
21630
          for (unsigned int u = 0; u < 4; u++)
 
21631
          {
 
21632
            dmats[t][u] = 0.00000000;
 
21633
            if (t == u)
 
21634
            {
 
21635
            dmats[t][u] = 1.00000000;
 
21636
            }
 
21637
            
 
21638
          }// end loop over 'u'
 
21639
        }// end loop over 't'
 
21640
        
 
21641
        // Looping derivative order to generate dmats.
 
21642
        for (unsigned int s = 0; s < n; s++)
 
21643
        {
 
21644
          // Updating dmats_old with new values and resetting dmats.
 
21645
          for (unsigned int t = 0; t < 4; t++)
 
21646
          {
 
21647
            for (unsigned int u = 0; u < 4; u++)
 
21648
            {
 
21649
              dmats_old[t][u] = dmats[t][u];
 
21650
              dmats[t][u] = 0.00000000;
 
21651
            }// end loop over 'u'
 
21652
          }// end loop over 't'
 
21653
          
 
21654
          // Update dmats using an inner product.
 
21655
          if (combinations[r][s] == 0)
 
21656
          {
 
21657
          for (unsigned int t = 0; t < 4; t++)
 
21658
          {
 
21659
            for (unsigned int u = 0; u < 4; u++)
 
21660
            {
 
21661
              for (unsigned int tu = 0; tu < 4; tu++)
 
21662
              {
 
21663
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21664
              }// end loop over 'tu'
 
21665
            }// end loop over 'u'
 
21666
          }// end loop over 't'
 
21667
          }
 
21668
          
 
21669
          if (combinations[r][s] == 1)
 
21670
          {
 
21671
          for (unsigned int t = 0; t < 4; t++)
 
21672
          {
 
21673
            for (unsigned int u = 0; u < 4; u++)
 
21674
            {
 
21675
              for (unsigned int tu = 0; tu < 4; tu++)
 
21676
              {
 
21677
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21678
              }// end loop over 'tu'
 
21679
            }// end loop over 'u'
 
21680
          }// end loop over 't'
 
21681
          }
 
21682
          
 
21683
          if (combinations[r][s] == 2)
 
21684
          {
 
21685
          for (unsigned int t = 0; t < 4; t++)
 
21686
          {
 
21687
            for (unsigned int u = 0; u < 4; u++)
 
21688
            {
 
21689
              for (unsigned int tu = 0; tu < 4; tu++)
 
21690
              {
 
21691
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21692
              }// end loop over 'tu'
 
21693
            }// end loop over 'u'
 
21694
          }// end loop over 't'
 
21695
          }
 
21696
          
 
21697
        }// end loop over 's'
 
21698
        for (unsigned int s = 0; s < 4; s++)
 
21699
        {
 
21700
          for (unsigned int t = 0; t < 4; t++)
 
21701
          {
 
21702
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21703
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
21704
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
21705
          }// end loop over 't'
 
21706
        }// end loop over 's'
 
21707
        
 
21708
        // Using covariant Piola transform to map values back to the physical element
 
21709
        const double tmp_ref0 = derivatives[r];
 
21710
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
21711
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
21712
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
21713
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
21714
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
21715
      }// end loop over 'r'
 
21716
      
 
21717
      // Transform derivatives back to physical element
 
21718
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21719
      {
 
21720
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21721
        {
 
21722
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
21723
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
21724
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
21725
        }// end loop over 's'
 
21726
      }// end loop over 'r'
 
21727
      
 
21728
      // Delete pointer to array of derivatives on FIAT element
 
21729
      delete [] derivatives;
 
21730
      
 
21731
      // Delete pointer to array of combinations of derivatives and transform
 
21732
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21733
      {
 
21734
        delete [] combinations[r];
 
21735
      }// end loop over 'r'
 
21736
      delete [] combinations;
 
21737
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21738
      {
 
21739
        delete [] transform[r];
 
21740
      }// end loop over 'r'
 
21741
      delete [] transform;
 
21742
        break;
 
21743
      }
 
21744
    case 7:
 
21745
      {
 
21746
        
 
21747
      // Array of basisvalues.
 
21748
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21749
      
 
21750
      // Declare helper variables.
 
21751
      unsigned int rr = 0;
 
21752
      unsigned int ss = 0;
 
21753
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
21754
      
 
21755
      // Compute basisvalues.
 
21756
      basisvalues[0] = 1.00000000;
 
21757
      basisvalues[1] = tmp0;
 
21758
      for (unsigned int r = 0; r < 1; r++)
 
21759
      {
 
21760
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21761
        ss = r*(r + 1)*(r + 2)/6;
 
21762
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
21763
      }// end loop over 'r'
 
21764
      for (unsigned int r = 0; r < 1; r++)
 
21765
      {
 
21766
        for (unsigned int s = 0; s < 1 - r; s++)
 
21767
        {
 
21768
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21769
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21770
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
21771
        }// end loop over 's'
 
21772
      }// end loop over 'r'
 
21773
      for (unsigned int r = 0; r < 2; r++)
 
21774
      {
 
21775
        for (unsigned int s = 0; s < 2 - r; s++)
 
21776
        {
 
21777
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
21778
          {
 
21779
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21780
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
21781
          }// end loop over 't'
 
21782
        }// end loop over 's'
 
21783
      }// end loop over 'r'
 
21784
      
 
21785
      // Table(s) of coefficients.
 
21786
      static const double coefficients0[4] = \
 
21787
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
21788
      
 
21789
      static const double coefficients1[4] = \
 
21790
      {0.28867513, 0.00000000, 0.00000000, 0.22360680};
 
21791
      
 
21792
      static const double coefficients2[4] = \
 
21793
      {0.57735027, -0.18257419, -0.10540926, 0.14907120};
 
21794
      
 
21795
      // Tables of derivatives of the polynomial base (transpose).
 
21796
      static const double dmats0[4][4] = \
 
21797
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21798
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
21799
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21800
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21801
      
 
21802
      static const double dmats1[4][4] = \
 
21803
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21804
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21805
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
21806
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
21807
      
 
21808
      static const double dmats2[4][4] = \
 
21809
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21810
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
21811
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
21812
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
21813
      
 
21814
      // Compute reference derivatives.
 
21815
      // Declare pointer to array of derivatives on FIAT element.
 
21816
      double *derivatives = new double[3*num_derivatives];
 
21817
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
21818
      {
 
21819
        derivatives[r] = 0.00000000;
 
21820
      }// end loop over 'r'
 
21821
      
 
21822
      // Declare derivative matrix (of polynomial basis).
 
21823
      double dmats[4][4] = \
 
21824
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21825
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21826
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21827
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21828
      
 
21829
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21830
      double dmats_old[4][4] = \
 
21831
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
21832
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
21833
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
21834
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
21835
      
 
21836
      // Loop possible derivatives.
 
21837
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21838
      {
 
21839
        // Resetting dmats values to compute next derivative.
 
21840
        for (unsigned int t = 0; t < 4; t++)
 
21841
        {
 
21842
          for (unsigned int u = 0; u < 4; u++)
 
21843
          {
 
21844
            dmats[t][u] = 0.00000000;
 
21845
            if (t == u)
 
21846
            {
 
21847
            dmats[t][u] = 1.00000000;
 
21848
            }
 
21849
            
 
21850
          }// end loop over 'u'
 
21851
        }// end loop over 't'
 
21852
        
 
21853
        // Looping derivative order to generate dmats.
 
21854
        for (unsigned int s = 0; s < n; s++)
 
21855
        {
 
21856
          // Updating dmats_old with new values and resetting dmats.
 
21857
          for (unsigned int t = 0; t < 4; t++)
 
21858
          {
 
21859
            for (unsigned int u = 0; u < 4; u++)
 
21860
            {
 
21861
              dmats_old[t][u] = dmats[t][u];
 
21862
              dmats[t][u] = 0.00000000;
 
21863
            }// end loop over 'u'
 
21864
          }// end loop over 't'
 
21865
          
 
21866
          // Update dmats using an inner product.
 
21867
          if (combinations[r][s] == 0)
 
21868
          {
 
21869
          for (unsigned int t = 0; t < 4; t++)
 
21870
          {
 
21871
            for (unsigned int u = 0; u < 4; u++)
 
21872
            {
 
21873
              for (unsigned int tu = 0; tu < 4; tu++)
 
21874
              {
 
21875
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21876
              }// end loop over 'tu'
 
21877
            }// end loop over 'u'
 
21878
          }// end loop over 't'
 
21879
          }
 
21880
          
 
21881
          if (combinations[r][s] == 1)
 
21882
          {
 
21883
          for (unsigned int t = 0; t < 4; t++)
 
21884
          {
 
21885
            for (unsigned int u = 0; u < 4; u++)
 
21886
            {
 
21887
              for (unsigned int tu = 0; tu < 4; tu++)
 
21888
              {
 
21889
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21890
              }// end loop over 'tu'
 
21891
            }// end loop over 'u'
 
21892
          }// end loop over 't'
 
21893
          }
 
21894
          
 
21895
          if (combinations[r][s] == 2)
 
21896
          {
 
21897
          for (unsigned int t = 0; t < 4; t++)
 
21898
          {
 
21899
            for (unsigned int u = 0; u < 4; u++)
 
21900
            {
 
21901
              for (unsigned int tu = 0; tu < 4; tu++)
 
21902
              {
 
21903
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21904
              }// end loop over 'tu'
 
21905
            }// end loop over 'u'
 
21906
          }// end loop over 't'
 
21907
          }
 
21908
          
 
21909
        }// end loop over 's'
 
21910
        for (unsigned int s = 0; s < 4; s++)
 
21911
        {
 
21912
          for (unsigned int t = 0; t < 4; t++)
 
21913
          {
 
21914
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21915
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
21916
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
21917
          }// end loop over 't'
 
21918
        }// end loop over 's'
 
21919
        
 
21920
        // Using covariant Piola transform to map values back to the physical element
 
21921
        const double tmp_ref0 = derivatives[r];
 
21922
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
21923
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
21924
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
21925
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
21926
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
21927
      }// end loop over 'r'
 
21928
      
 
21929
      // Transform derivatives back to physical element
 
21930
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21931
      {
 
21932
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21933
        {
 
21934
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
21935
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
21936
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
21937
        }// end loop over 's'
 
21938
      }// end loop over 'r'
 
21939
      
 
21940
      // Delete pointer to array of derivatives on FIAT element
 
21941
      delete [] derivatives;
 
21942
      
 
21943
      // Delete pointer to array of combinations of derivatives and transform
 
21944
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21945
      {
 
21946
        delete [] combinations[r];
 
21947
      }// end loop over 'r'
 
21948
      delete [] combinations;
 
21949
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21950
      {
 
21951
        delete [] transform[r];
 
21952
      }// end loop over 'r'
 
21953
      delete [] transform;
 
21954
        break;
 
21955
      }
 
21956
    case 8:
 
21957
      {
 
21958
        
 
21959
      // Array of basisvalues.
 
21960
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
21961
      
 
21962
      // Declare helper variables.
 
21963
      unsigned int rr = 0;
 
21964
      unsigned int ss = 0;
 
21965
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
21966
      
 
21967
      // Compute basisvalues.
 
21968
      basisvalues[0] = 1.00000000;
 
21969
      basisvalues[1] = tmp0;
 
21970
      for (unsigned int r = 0; r < 1; r++)
 
21971
      {
 
21972
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21973
        ss = r*(r + 1)*(r + 2)/6;
 
21974
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
21975
      }// end loop over 'r'
 
21976
      for (unsigned int r = 0; r < 1; r++)
 
21977
      {
 
21978
        for (unsigned int s = 0; s < 1 - r; s++)
 
21979
        {
 
21980
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21981
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21982
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
21983
        }// end loop over 's'
 
21984
      }// end loop over 'r'
 
21985
      for (unsigned int r = 0; r < 2; r++)
 
21986
      {
 
21987
        for (unsigned int s = 0; s < 2 - r; s++)
 
21988
        {
 
21989
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
21990
          {
 
21991
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21992
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
21993
          }// end loop over 't'
 
21994
        }// end loop over 's'
 
21995
      }// end loop over 'r'
 
21996
      
 
21997
      // Table(s) of coefficients.
 
21998
      static const double coefficients0[4] = \
 
21999
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
22000
      
 
22001
      static const double coefficients1[4] = \
 
22002
      {0.57735027, -0.18257419, 0.10540926, -0.14907120};
 
22003
      
 
22004
      static const double coefficients2[4] = \
 
22005
      {0.28867513, 0.00000000, 0.21081851, -0.07453560};
 
22006
      
 
22007
      // Tables of derivatives of the polynomial base (transpose).
 
22008
      static const double dmats0[4][4] = \
 
22009
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22010
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
22011
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22012
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
22013
      
 
22014
      static const double dmats1[4][4] = \
 
22015
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22016
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
22017
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
22018
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
22019
      
 
22020
      static const double dmats2[4][4] = \
 
22021
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22022
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
22023
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
22024
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
22025
      
 
22026
      // Compute reference derivatives.
 
22027
      // Declare pointer to array of derivatives on FIAT element.
 
22028
      double *derivatives = new double[3*num_derivatives];
 
22029
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
22030
      {
 
22031
        derivatives[r] = 0.00000000;
 
22032
      }// end loop over 'r'
 
22033
      
 
22034
      // Declare derivative matrix (of polynomial basis).
 
22035
      double dmats[4][4] = \
 
22036
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22037
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
22038
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
22039
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
22040
      
 
22041
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
22042
      double dmats_old[4][4] = \
 
22043
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22044
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
22045
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
22046
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
22047
      
 
22048
      // Loop possible derivatives.
 
22049
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22050
      {
 
22051
        // Resetting dmats values to compute next derivative.
 
22052
        for (unsigned int t = 0; t < 4; t++)
 
22053
        {
 
22054
          for (unsigned int u = 0; u < 4; u++)
 
22055
          {
 
22056
            dmats[t][u] = 0.00000000;
 
22057
            if (t == u)
 
22058
            {
 
22059
            dmats[t][u] = 1.00000000;
 
22060
            }
 
22061
            
 
22062
          }// end loop over 'u'
 
22063
        }// end loop over 't'
 
22064
        
 
22065
        // Looping derivative order to generate dmats.
 
22066
        for (unsigned int s = 0; s < n; s++)
 
22067
        {
 
22068
          // Updating dmats_old with new values and resetting dmats.
 
22069
          for (unsigned int t = 0; t < 4; t++)
 
22070
          {
 
22071
            for (unsigned int u = 0; u < 4; u++)
 
22072
            {
 
22073
              dmats_old[t][u] = dmats[t][u];
 
22074
              dmats[t][u] = 0.00000000;
 
22075
            }// end loop over 'u'
 
22076
          }// end loop over 't'
 
22077
          
 
22078
          // Update dmats using an inner product.
 
22079
          if (combinations[r][s] == 0)
 
22080
          {
 
22081
          for (unsigned int t = 0; t < 4; t++)
 
22082
          {
 
22083
            for (unsigned int u = 0; u < 4; u++)
 
22084
            {
 
22085
              for (unsigned int tu = 0; tu < 4; tu++)
 
22086
              {
 
22087
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
22088
              }// end loop over 'tu'
 
22089
            }// end loop over 'u'
 
22090
          }// end loop over 't'
 
22091
          }
 
22092
          
 
22093
          if (combinations[r][s] == 1)
 
22094
          {
 
22095
          for (unsigned int t = 0; t < 4; t++)
 
22096
          {
 
22097
            for (unsigned int u = 0; u < 4; u++)
 
22098
            {
 
22099
              for (unsigned int tu = 0; tu < 4; tu++)
 
22100
              {
 
22101
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
22102
              }// end loop over 'tu'
 
22103
            }// end loop over 'u'
 
22104
          }// end loop over 't'
 
22105
          }
 
22106
          
 
22107
          if (combinations[r][s] == 2)
 
22108
          {
 
22109
          for (unsigned int t = 0; t < 4; t++)
 
22110
          {
 
22111
            for (unsigned int u = 0; u < 4; u++)
 
22112
            {
 
22113
              for (unsigned int tu = 0; tu < 4; tu++)
 
22114
              {
 
22115
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
22116
              }// end loop over 'tu'
 
22117
            }// end loop over 'u'
 
22118
          }// end loop over 't'
 
22119
          }
 
22120
          
 
22121
        }// end loop over 's'
 
22122
        for (unsigned int s = 0; s < 4; s++)
 
22123
        {
 
22124
          for (unsigned int t = 0; t < 4; t++)
 
22125
          {
 
22126
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
22127
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
22128
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
22129
          }// end loop over 't'
 
22130
        }// end loop over 's'
 
22131
        
 
22132
        // Using covariant Piola transform to map values back to the physical element
 
22133
        const double tmp_ref0 = derivatives[r];
 
22134
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
22135
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
22136
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
22137
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
22138
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
22139
      }// end loop over 'r'
 
22140
      
 
22141
      // Transform derivatives back to physical element
 
22142
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22143
      {
 
22144
        for (unsigned int s = 0; s < num_derivatives; s++)
 
22145
        {
 
22146
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
22147
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
22148
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
22149
        }// end loop over 's'
 
22150
      }// end loop over 'r'
 
22151
      
 
22152
      // Delete pointer to array of derivatives on FIAT element
 
22153
      delete [] derivatives;
 
22154
      
 
22155
      // Delete pointer to array of combinations of derivatives and transform
 
22156
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22157
      {
 
22158
        delete [] combinations[r];
 
22159
      }// end loop over 'r'
 
22160
      delete [] combinations;
 
22161
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22162
      {
 
22163
        delete [] transform[r];
 
22164
      }// end loop over 'r'
 
22165
      delete [] transform;
 
22166
        break;
 
22167
      }
 
22168
    case 9:
 
22169
      {
 
22170
        
 
22171
      // Array of basisvalues.
 
22172
      double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
 
22173
      
 
22174
      // Declare helper variables.
 
22175
      unsigned int rr = 0;
 
22176
      unsigned int ss = 0;
 
22177
      double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
 
22178
      
 
22179
      // Compute basisvalues.
 
22180
      basisvalues[0] = 1.00000000;
 
22181
      basisvalues[1] = tmp0;
 
22182
      for (unsigned int r = 0; r < 1; r++)
 
22183
      {
 
22184
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
22185
        ss = r*(r + 1)*(r + 2)/6;
 
22186
        basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
 
22187
      }// end loop over 'r'
 
22188
      for (unsigned int r = 0; r < 1; r++)
 
22189
      {
 
22190
        for (unsigned int s = 0; s < 1 - r; s++)
 
22191
        {
 
22192
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
22193
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22194
          basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
 
22195
        }// end loop over 's'
 
22196
      }// end loop over 'r'
 
22197
      for (unsigned int r = 0; r < 2; r++)
 
22198
      {
 
22199
        for (unsigned int s = 0; s < 2 - r; s++)
 
22200
        {
 
22201
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
22202
          {
 
22203
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22204
            basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
 
22205
          }// end loop over 't'
 
22206
        }// end loop over 's'
 
22207
      }// end loop over 'r'
 
22208
      
 
22209
      // Table(s) of coefficients.
 
22210
      static const double coefficients0[4] = \
 
22211
      {0.57735027, 0.00000000, -0.21081851, -0.14907120};
 
22212
      
 
22213
      static const double coefficients1[4] = \
 
22214
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
22215
      
 
22216
      static const double coefficients2[4] = \
 
22217
      {0.28867513, 0.18257419, -0.10540926, -0.07453560};
 
22218
      
 
22219
      // Tables of derivatives of the polynomial base (transpose).
 
22220
      static const double dmats0[4][4] = \
 
22221
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22222
      {6.32455532, 0.00000000, 0.00000000, 0.00000000},
 
22223
      {0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22224
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
22225
      
 
22226
      static const double dmats1[4][4] = \
 
22227
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22228
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
22229
      {5.47722558, 0.00000000, 0.00000000, 0.00000000},
 
22230
      {0.00000000, 0.00000000, 0.00000000, 0.00000000}};
 
22231
      
 
22232
      static const double dmats2[4][4] = \
 
22233
      {{0.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22234
      {3.16227766, 0.00000000, 0.00000000, 0.00000000},
 
22235
      {1.82574186, 0.00000000, 0.00000000, 0.00000000},
 
22236
      {5.16397779, 0.00000000, 0.00000000, 0.00000000}};
 
22237
      
 
22238
      // Compute reference derivatives.
 
22239
      // Declare pointer to array of derivatives on FIAT element.
 
22240
      double *derivatives = new double[3*num_derivatives];
 
22241
      for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
22242
      {
 
22243
        derivatives[r] = 0.00000000;
 
22244
      }// end loop over 'r'
 
22245
      
 
22246
      // Declare derivative matrix (of polynomial basis).
 
22247
      double dmats[4][4] = \
 
22248
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22249
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
22250
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
22251
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
22252
      
 
22253
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
22254
      double dmats_old[4][4] = \
 
22255
      {{1.00000000, 0.00000000, 0.00000000, 0.00000000},
 
22256
      {0.00000000, 1.00000000, 0.00000000, 0.00000000},
 
22257
      {0.00000000, 0.00000000, 1.00000000, 0.00000000},
 
22258
      {0.00000000, 0.00000000, 0.00000000, 1.00000000}};
 
22259
      
 
22260
      // Loop possible derivatives.
 
22261
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22262
      {
 
22263
        // Resetting dmats values to compute next derivative.
 
22264
        for (unsigned int t = 0; t < 4; t++)
 
22265
        {
 
22266
          for (unsigned int u = 0; u < 4; u++)
 
22267
          {
 
22268
            dmats[t][u] = 0.00000000;
 
22269
            if (t == u)
 
22270
            {
 
22271
            dmats[t][u] = 1.00000000;
 
22272
            }
 
22273
            
 
22274
          }// end loop over 'u'
 
22275
        }// end loop over 't'
 
22276
        
 
22277
        // Looping derivative order to generate dmats.
 
22278
        for (unsigned int s = 0; s < n; s++)
 
22279
        {
 
22280
          // Updating dmats_old with new values and resetting dmats.
 
22281
          for (unsigned int t = 0; t < 4; t++)
 
22282
          {
 
22283
            for (unsigned int u = 0; u < 4; u++)
 
22284
            {
 
22285
              dmats_old[t][u] = dmats[t][u];
 
22286
              dmats[t][u] = 0.00000000;
 
22287
            }// end loop over 'u'
 
22288
          }// end loop over 't'
 
22289
          
 
22290
          // Update dmats using an inner product.
 
22291
          if (combinations[r][s] == 0)
 
22292
          {
 
22293
          for (unsigned int t = 0; t < 4; t++)
 
22294
          {
 
22295
            for (unsigned int u = 0; u < 4; u++)
 
22296
            {
 
22297
              for (unsigned int tu = 0; tu < 4; tu++)
 
22298
              {
 
22299
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
22300
              }// end loop over 'tu'
 
22301
            }// end loop over 'u'
 
22302
          }// end loop over 't'
 
22303
          }
 
22304
          
 
22305
          if (combinations[r][s] == 1)
 
22306
          {
 
22307
          for (unsigned int t = 0; t < 4; t++)
 
22308
          {
 
22309
            for (unsigned int u = 0; u < 4; u++)
 
22310
            {
 
22311
              for (unsigned int tu = 0; tu < 4; tu++)
 
22312
              {
 
22313
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
22314
              }// end loop over 'tu'
 
22315
            }// end loop over 'u'
 
22316
          }// end loop over 't'
 
22317
          }
 
22318
          
 
22319
          if (combinations[r][s] == 2)
 
22320
          {
 
22321
          for (unsigned int t = 0; t < 4; t++)
 
22322
          {
 
22323
            for (unsigned int u = 0; u < 4; u++)
 
22324
            {
 
22325
              for (unsigned int tu = 0; tu < 4; tu++)
 
22326
              {
 
22327
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
22328
              }// end loop over 'tu'
 
22329
            }// end loop over 'u'
 
22330
          }// end loop over 't'
 
22331
          }
 
22332
          
 
22333
        }// end loop over 's'
 
22334
        for (unsigned int s = 0; s < 4; s++)
 
22335
        {
 
22336
          for (unsigned int t = 0; t < 4; t++)
 
22337
          {
 
22338
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
22339
            derivatives[num_derivatives + r] += coefficients1[s]*dmats[s][t]*basisvalues[t];
 
22340
            derivatives[2*num_derivatives + r] += coefficients2[s]*dmats[s][t]*basisvalues[t];
 
22341
          }// end loop over 't'
 
22342
        }// end loop over 's'
 
22343
        
 
22344
        // Using covariant Piola transform to map values back to the physical element
 
22345
        const double tmp_ref0 = derivatives[r];
 
22346
        const double tmp_ref1 = derivatives[num_derivatives + r];
 
22347
        const double tmp_ref2 = derivatives[2*num_derivatives + r];
 
22348
        derivatives[r] = (K_00*tmp_ref0 + K_10*tmp_ref1 + K_20*tmp_ref2);
 
22349
        derivatives[num_derivatives + r] = (K_01*tmp_ref0 + K_11*tmp_ref1 + K_21*tmp_ref2);
 
22350
        derivatives[2*num_derivatives + r] = (K_02*tmp_ref0 + K_12*tmp_ref1 + K_22*tmp_ref2);
 
22351
      }// end loop over 'r'
 
22352
      
 
22353
      // Transform derivatives back to physical element
 
22354
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22355
      {
 
22356
        for (unsigned int s = 0; s < num_derivatives; s++)
 
22357
        {
 
22358
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
22359
          values[2*num_derivatives + r] += transform[r][s]*derivatives[num_derivatives + s];
 
22360
          values[3*num_derivatives + r] += transform[r][s]*derivatives[2*num_derivatives + s];
 
22361
        }// end loop over 's'
 
22362
      }// end loop over 'r'
 
22363
      
 
22364
      // Delete pointer to array of derivatives on FIAT element
 
22365
      delete [] derivatives;
 
22366
      
 
22367
      // Delete pointer to array of combinations of derivatives and transform
 
22368
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22369
      {
 
22370
        delete [] combinations[r];
 
22371
      }// end loop over 'r'
 
22372
      delete [] combinations;
 
22373
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22374
      {
 
22375
        delete [] transform[r];
 
22376
      }// end loop over 'r'
 
22377
      delete [] transform;
 
22378
        break;
 
22379
      }
5115
22380
    }
5116
22381
    
5117
22382
  }
7521
24786
    }// end loop over 'r'
7522
24787
    
7523
24788
    // Compute element tensor using UFL quadrature representation
7524
 
    // Optimisations: ('simplify expressions', False), ('ignore zero tables', False), ('non zero columns', False), ('remove zero terms', False), ('ignore ones', False)
 
24789
    // Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
7525
24790
    
7526
24791
    // Loop quadrature points for integral.
7527
24792
    // Number of operations to compute element tensor for following IP loop = 325600