~ubuntu-branches/ubuntu/natty/dolfin/natty

« back to all changes in this revision

Viewing changes to demo/undocumented/stokes-iterative/cpp/Stokes.h

  • Committer: Bazaar Package Importer
  • Author(s): Johannes Ring
  • Date: 2011-02-24 10:34:44 UTC
  • mfrom: (1.1.7 upstream) (14.1.4 sid)
  • Revision ID: james.westby@ubuntu.com-20110224103444-n3fwnmh32lfoske0
Tags: 0.9.10-1
* New upstream release. This release fixes bug "FTBFS: error:
  'SCOTCH_Dgraph' was not declared in this scope" (closes: #612602).
* debian/control:
  - Add libslepc3.1-dev and libboost-thread-dev to Build-Depends and
    Depends field in binary package libdolfin0-dev.
  - Bump build dependency on python-ufc to >= 2.0.0.
  - Remove Build-Depends-Indep field as upstream no longer ships the
    user manual.
  - Remove old fields Conflicts, Provides, and Replaces from
    libdolfin0-dev, libdolfin0, libdolfin0-dbg, and python-dolfin.
* Remove all patches as they are now incorporated upstream.
* Add dolfin-plot and dolfin-version to debian/dolfin-bin.install.
* Remove .doc-base file since the user manual is removed by upstream.
* Remove targets clean and install/dolfin-doc from debian/rules since
  they are no longer needed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// This code conforms with the UFC specification version 1.4.2
 
2
// and was automatically generated by FFC version 0.9.4+.
 
3
//
 
4
// This code was generated with the option '-l dolfin' and
 
5
// contains DOLFIN-specific wrappers that depend on DOLFIN.
 
6
// 
 
7
// This code was generated with the following parameters:
 
8
// 
 
9
//   cache_dir:                      ''
 
10
//   convert_exceptions_to_warnings: False
 
11
//   cpp_optimize:                   False
 
12
//   cpp_optimize_flags:             '-O2'
 
13
//   epsilon:                        1e-14
 
14
//   error_control:                  False
 
15
//   form_postfix:                   True
 
16
//   format:                         'dolfin'
 
17
//   log_level:                      10
 
18
//   log_prefix:                     ''
 
19
//   no_ferari:                      True
 
20
//   optimize:                       True
 
21
//   output_dir:                     '.'
 
22
//   precision:                      15
 
23
//   quadrature_degree:              'auto'
 
24
//   quadrature_rule:                'auto'
 
25
//   representation:                 'auto'
 
26
//   split:                          False
 
27
 
 
28
#ifndef __STOKES_H
 
29
#define __STOKES_H
 
30
 
 
31
#include <cmath>
 
32
#include <stdexcept>
 
33
#include <fstream>
 
34
#include <ufc.h>
 
35
 
 
36
/// This class defines the interface for a finite element.
 
37
 
 
38
class stokes_finite_element_0: public ufc::finite_element
 
39
{
 
40
public:
 
41
 
 
42
  /// Constructor
 
43
  stokes_finite_element_0() : ufc::finite_element()
 
44
  {
 
45
    // Do nothing
 
46
  }
 
47
 
 
48
  /// Destructor
 
49
  virtual ~stokes_finite_element_0()
 
50
  {
 
51
    // Do nothing
 
52
  }
 
53
 
 
54
  /// Return a string identifying the finite element
 
55
  virtual const char* signature() const
 
56
  {
 
57
    return "FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2)";
 
58
  }
 
59
 
 
60
  /// Return the cell shape
 
61
  virtual ufc::shape cell_shape() const
 
62
  {
 
63
    return ufc::tetrahedron;
 
64
  }
 
65
 
 
66
  /// Return the topological dimension of the cell shape
 
67
  virtual unsigned int topological_dimension() const
 
68
  {
 
69
    return 3;
 
70
  }
 
71
 
 
72
  /// Return the geometric dimension of the cell shape
 
73
  virtual unsigned int geometric_dimension() const
 
74
  {
 
75
    return 3;
 
76
  }
 
77
 
 
78
  /// Return the dimension of the finite element function space
 
79
  virtual unsigned int space_dimension() const
 
80
  {
 
81
    return 10;
 
82
  }
 
83
 
 
84
  /// Return the rank of the value space
 
85
  virtual unsigned int value_rank() const
 
86
  {
 
87
    return 0;
 
88
  }
 
89
 
 
90
  /// Return the dimension of the value space for axis i
 
91
  virtual unsigned int value_dimension(unsigned int i) const
 
92
  {
 
93
    return 1;
 
94
  }
 
95
 
 
96
  /// Evaluate basis function i at given point in cell
 
97
  virtual void evaluate_basis(unsigned int i,
 
98
                              double* values,
 
99
                              const double* coordinates,
 
100
                              const ufc::cell& c) const
 
101
  {
 
102
    // Extract vertex coordinates
 
103
    const double * const * x = c.coordinates;
 
104
    
 
105
    // Compute Jacobian of affine map from reference cell
 
106
    const double J_00 = x[1][0] - x[0][0];
 
107
    const double J_01 = x[2][0] - x[0][0];
 
108
    const double J_02 = x[3][0] - x[0][0];
 
109
    const double J_10 = x[1][1] - x[0][1];
 
110
    const double J_11 = x[2][1] - x[0][1];
 
111
    const double J_12 = x[3][1] - x[0][1];
 
112
    const double J_20 = x[1][2] - x[0][2];
 
113
    const double J_21 = x[2][2] - x[0][2];
 
114
    const double J_22 = x[3][2] - x[0][2];
 
115
    
 
116
    // Compute sub determinants
 
117
    const double d_00 = J_11*J_22 - J_12*J_21;
 
118
    const double d_01 = J_12*J_20 - J_10*J_22;
 
119
    const double d_02 = J_10*J_21 - J_11*J_20;
 
120
    const double d_10 = J_02*J_21 - J_01*J_22;
 
121
    const double d_11 = J_00*J_22 - J_02*J_20;
 
122
    const double d_12 = J_01*J_20 - J_00*J_21;
 
123
    const double d_20 = J_01*J_12 - J_02*J_11;
 
124
    const double d_21 = J_02*J_10 - J_00*J_12;
 
125
    const double d_22 = J_00*J_11 - J_01*J_10;
 
126
    
 
127
    // Compute determinant of Jacobian
 
128
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
129
    
 
130
    // Compute inverse of Jacobian
 
131
    
 
132
    // Compute constants
 
133
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
134
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
135
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
136
    
 
137
    // Get coordinates and map to the reference (FIAT) element
 
138
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
139
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
140
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
141
    
 
142
    
 
143
    // Reset values.
 
144
    *values = 0.000000000000000;
 
145
    switch (i)
 
146
    {
 
147
    case 0:
 
148
      {
 
149
        
 
150
      // Array of basisvalues.
 
151
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
152
      
 
153
      // Declare helper variables.
 
154
      unsigned int rr = 0;
 
155
      unsigned int ss = 0;
 
156
      unsigned int tt = 0;
 
157
      double tmp5 = 0.000000000000000;
 
158
      double tmp6 = 0.000000000000000;
 
159
      double tmp7 = 0.000000000000000;
 
160
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
161
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
162
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
163
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
164
      double tmp4 = tmp3*tmp3;
 
165
      
 
166
      // Compute basisvalues.
 
167
      basisvalues[0] = 1.000000000000000;
 
168
      basisvalues[1] = tmp0;
 
169
      for (unsigned int r = 1; r < 2; r++)
 
170
      {
 
171
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
172
        ss = r*(r + 1)*(r + 2)/6;
 
173
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
174
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
175
      }// end loop over 'r'
 
176
      for (unsigned int r = 0; r < 2; r++)
 
177
      {
 
178
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
179
        ss = r*(r + 1)*(r + 2)/6;
 
180
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
181
      }// end loop over 'r'
 
182
      for (unsigned int r = 0; r < 1; r++)
 
183
      {
 
184
        for (unsigned int s = 1; s < 2 - r; s++)
 
185
        {
 
186
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
187
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
188
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
189
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
190
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
191
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
192
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
193
        }// end loop over 's'
 
194
      }// end loop over 'r'
 
195
      for (unsigned int r = 0; r < 2; r++)
 
196
      {
 
197
        for (unsigned int s = 0; s < 2 - r; s++)
 
198
        {
 
199
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
200
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
201
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
202
        }// end loop over 's'
 
203
      }// end loop over 'r'
 
204
      for (unsigned int r = 0; r < 1; r++)
 
205
      {
 
206
        for (unsigned int s = 0; s < 1 - r; s++)
 
207
        {
 
208
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
209
          {
 
210
            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;
 
211
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
212
            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;
 
213
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
214
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
215
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
216
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
217
          }// end loop over 't'
 
218
        }// end loop over 's'
 
219
      }// end loop over 'r'
 
220
      for (unsigned int r = 0; r < 3; r++)
 
221
      {
 
222
        for (unsigned int s = 0; s < 3 - r; s++)
 
223
        {
 
224
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
225
          {
 
226
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
227
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
228
          }// end loop over 't'
 
229
        }// end loop over 's'
 
230
      }// end loop over 'r'
 
231
      
 
232
      // Table(s) of coefficients.
 
233
      static const double coefficients0[10] = \
 
234
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
235
      
 
236
      // Compute value(s).
 
237
      for (unsigned int r = 0; r < 10; r++)
 
238
      {
 
239
        *values += coefficients0[r]*basisvalues[r];
 
240
      }// end loop over 'r'
 
241
        break;
 
242
      }
 
243
    case 1:
 
244
      {
 
245
        
 
246
      // Array of basisvalues.
 
247
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
248
      
 
249
      // Declare helper variables.
 
250
      unsigned int rr = 0;
 
251
      unsigned int ss = 0;
 
252
      unsigned int tt = 0;
 
253
      double tmp5 = 0.000000000000000;
 
254
      double tmp6 = 0.000000000000000;
 
255
      double tmp7 = 0.000000000000000;
 
256
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
257
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
258
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
259
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
260
      double tmp4 = tmp3*tmp3;
 
261
      
 
262
      // Compute basisvalues.
 
263
      basisvalues[0] = 1.000000000000000;
 
264
      basisvalues[1] = tmp0;
 
265
      for (unsigned int r = 1; r < 2; r++)
 
266
      {
 
267
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
268
        ss = r*(r + 1)*(r + 2)/6;
 
269
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
270
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
271
      }// end loop over 'r'
 
272
      for (unsigned int r = 0; r < 2; r++)
 
273
      {
 
274
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
275
        ss = r*(r + 1)*(r + 2)/6;
 
276
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
277
      }// end loop over 'r'
 
278
      for (unsigned int r = 0; r < 1; r++)
 
279
      {
 
280
        for (unsigned int s = 1; s < 2 - r; s++)
 
281
        {
 
282
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
283
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
284
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
285
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
286
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
287
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
288
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
289
        }// end loop over 's'
 
290
      }// end loop over 'r'
 
291
      for (unsigned int r = 0; r < 2; r++)
 
292
      {
 
293
        for (unsigned int s = 0; s < 2 - r; s++)
 
294
        {
 
295
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
296
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
297
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
298
        }// end loop over 's'
 
299
      }// end loop over 'r'
 
300
      for (unsigned int r = 0; r < 1; r++)
 
301
      {
 
302
        for (unsigned int s = 0; s < 1 - r; s++)
 
303
        {
 
304
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
305
          {
 
306
            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;
 
307
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
308
            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;
 
309
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
310
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
311
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
312
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
313
          }// end loop over 't'
 
314
        }// end loop over 's'
 
315
      }// end loop over 'r'
 
316
      for (unsigned int r = 0; r < 3; r++)
 
317
      {
 
318
        for (unsigned int s = 0; s < 3 - r; s++)
 
319
        {
 
320
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
321
          {
 
322
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
323
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
324
          }// end loop over 't'
 
325
        }// end loop over 's'
 
326
      }// end loop over 'r'
 
327
      
 
328
      // Table(s) of coefficients.
 
329
      static const double coefficients0[10] = \
 
330
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
331
      
 
332
      // Compute value(s).
 
333
      for (unsigned int r = 0; r < 10; r++)
 
334
      {
 
335
        *values += coefficients0[r]*basisvalues[r];
 
336
      }// end loop over 'r'
 
337
        break;
 
338
      }
 
339
    case 2:
 
340
      {
 
341
        
 
342
      // Array of basisvalues.
 
343
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
344
      
 
345
      // Declare helper variables.
 
346
      unsigned int rr = 0;
 
347
      unsigned int ss = 0;
 
348
      unsigned int tt = 0;
 
349
      double tmp5 = 0.000000000000000;
 
350
      double tmp6 = 0.000000000000000;
 
351
      double tmp7 = 0.000000000000000;
 
352
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
353
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
354
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
355
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
356
      double tmp4 = tmp3*tmp3;
 
357
      
 
358
      // Compute basisvalues.
 
359
      basisvalues[0] = 1.000000000000000;
 
360
      basisvalues[1] = tmp0;
 
361
      for (unsigned int r = 1; r < 2; r++)
 
362
      {
 
363
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
364
        ss = r*(r + 1)*(r + 2)/6;
 
365
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
366
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
367
      }// end loop over 'r'
 
368
      for (unsigned int r = 0; r < 2; r++)
 
369
      {
 
370
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
371
        ss = r*(r + 1)*(r + 2)/6;
 
372
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
373
      }// end loop over 'r'
 
374
      for (unsigned int r = 0; r < 1; r++)
 
375
      {
 
376
        for (unsigned int s = 1; s < 2 - r; s++)
 
377
        {
 
378
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
379
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
380
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
381
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
382
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
383
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
384
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
385
        }// end loop over 's'
 
386
      }// end loop over 'r'
 
387
      for (unsigned int r = 0; r < 2; r++)
 
388
      {
 
389
        for (unsigned int s = 0; s < 2 - r; s++)
 
390
        {
 
391
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
392
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
393
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
394
        }// end loop over 's'
 
395
      }// end loop over 'r'
 
396
      for (unsigned int r = 0; r < 1; r++)
 
397
      {
 
398
        for (unsigned int s = 0; s < 1 - r; s++)
 
399
        {
 
400
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
401
          {
 
402
            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;
 
403
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
404
            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;
 
405
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
406
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
407
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
408
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
409
          }// end loop over 't'
 
410
        }// end loop over 's'
 
411
      }// end loop over 'r'
 
412
      for (unsigned int r = 0; r < 3; r++)
 
413
      {
 
414
        for (unsigned int s = 0; s < 3 - r; s++)
 
415
        {
 
416
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
417
          {
 
418
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
419
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
420
          }// end loop over 't'
 
421
        }// end loop over 's'
 
422
      }// end loop over 'r'
 
423
      
 
424
      // Table(s) of coefficients.
 
425
      static const double coefficients0[10] = \
 
426
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
427
      
 
428
      // Compute value(s).
 
429
      for (unsigned int r = 0; r < 10; r++)
 
430
      {
 
431
        *values += coefficients0[r]*basisvalues[r];
 
432
      }// end loop over 'r'
 
433
        break;
 
434
      }
 
435
    case 3:
 
436
      {
 
437
        
 
438
      // Array of basisvalues.
 
439
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
440
      
 
441
      // Declare helper variables.
 
442
      unsigned int rr = 0;
 
443
      unsigned int ss = 0;
 
444
      unsigned int tt = 0;
 
445
      double tmp5 = 0.000000000000000;
 
446
      double tmp6 = 0.000000000000000;
 
447
      double tmp7 = 0.000000000000000;
 
448
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
449
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
450
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
451
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
452
      double tmp4 = tmp3*tmp3;
 
453
      
 
454
      // Compute basisvalues.
 
455
      basisvalues[0] = 1.000000000000000;
 
456
      basisvalues[1] = tmp0;
 
457
      for (unsigned int r = 1; r < 2; r++)
 
458
      {
 
459
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
460
        ss = r*(r + 1)*(r + 2)/6;
 
461
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
462
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
463
      }// end loop over 'r'
 
464
      for (unsigned int r = 0; r < 2; r++)
 
465
      {
 
466
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
467
        ss = r*(r + 1)*(r + 2)/6;
 
468
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
469
      }// end loop over 'r'
 
470
      for (unsigned int r = 0; r < 1; r++)
 
471
      {
 
472
        for (unsigned int s = 1; s < 2 - r; s++)
 
473
        {
 
474
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
475
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
476
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
477
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
478
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
479
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
480
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
481
        }// end loop over 's'
 
482
      }// end loop over 'r'
 
483
      for (unsigned int r = 0; r < 2; r++)
 
484
      {
 
485
        for (unsigned int s = 0; s < 2 - r; s++)
 
486
        {
 
487
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
488
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
489
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
490
        }// end loop over 's'
 
491
      }// end loop over 'r'
 
492
      for (unsigned int r = 0; r < 1; r++)
 
493
      {
 
494
        for (unsigned int s = 0; s < 1 - r; s++)
 
495
        {
 
496
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
497
          {
 
498
            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;
 
499
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
500
            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;
 
501
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
502
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
503
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
504
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
505
          }// end loop over 't'
 
506
        }// end loop over 's'
 
507
      }// end loop over 'r'
 
508
      for (unsigned int r = 0; r < 3; r++)
 
509
      {
 
510
        for (unsigned int s = 0; s < 3 - r; s++)
 
511
        {
 
512
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
513
          {
 
514
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
515
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
516
          }// end loop over 't'
 
517
        }// end loop over 's'
 
518
      }// end loop over 'r'
 
519
      
 
520
      // Table(s) of coefficients.
 
521
      static const double coefficients0[10] = \
 
522
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
523
      
 
524
      // Compute value(s).
 
525
      for (unsigned int r = 0; r < 10; r++)
 
526
      {
 
527
        *values += coefficients0[r]*basisvalues[r];
 
528
      }// end loop over 'r'
 
529
        break;
 
530
      }
 
531
    case 4:
 
532
      {
 
533
        
 
534
      // Array of basisvalues.
 
535
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
536
      
 
537
      // Declare helper variables.
 
538
      unsigned int rr = 0;
 
539
      unsigned int ss = 0;
 
540
      unsigned int tt = 0;
 
541
      double tmp5 = 0.000000000000000;
 
542
      double tmp6 = 0.000000000000000;
 
543
      double tmp7 = 0.000000000000000;
 
544
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
545
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
546
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
547
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
548
      double tmp4 = tmp3*tmp3;
 
549
      
 
550
      // Compute basisvalues.
 
551
      basisvalues[0] = 1.000000000000000;
 
552
      basisvalues[1] = tmp0;
 
553
      for (unsigned int r = 1; r < 2; r++)
 
554
      {
 
555
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
556
        ss = r*(r + 1)*(r + 2)/6;
 
557
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
558
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
559
      }// end loop over 'r'
 
560
      for (unsigned int r = 0; r < 2; r++)
 
561
      {
 
562
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
563
        ss = r*(r + 1)*(r + 2)/6;
 
564
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
565
      }// end loop over 'r'
 
566
      for (unsigned int r = 0; r < 1; r++)
 
567
      {
 
568
        for (unsigned int s = 1; s < 2 - r; s++)
 
569
        {
 
570
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
571
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
572
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
573
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
574
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
575
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
576
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
577
        }// end loop over 's'
 
578
      }// end loop over 'r'
 
579
      for (unsigned int r = 0; r < 2; r++)
 
580
      {
 
581
        for (unsigned int s = 0; s < 2 - r; s++)
 
582
        {
 
583
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
584
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
585
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
586
        }// end loop over 's'
 
587
      }// end loop over 'r'
 
588
      for (unsigned int r = 0; r < 1; r++)
 
589
      {
 
590
        for (unsigned int s = 0; s < 1 - r; s++)
 
591
        {
 
592
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
593
          {
 
594
            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;
 
595
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
596
            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;
 
597
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
598
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
599
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
600
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
601
          }// end loop over 't'
 
602
        }// end loop over 's'
 
603
      }// end loop over 'r'
 
604
      for (unsigned int r = 0; r < 3; r++)
 
605
      {
 
606
        for (unsigned int s = 0; s < 3 - r; s++)
 
607
        {
 
608
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
609
          {
 
610
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
611
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
612
          }// end loop over 't'
 
613
        }// end loop over 's'
 
614
      }// end loop over 'r'
 
615
      
 
616
      // Table(s) of coefficients.
 
617
      static const double coefficients0[10] = \
 
618
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
619
      
 
620
      // Compute value(s).
 
621
      for (unsigned int r = 0; r < 10; r++)
 
622
      {
 
623
        *values += coefficients0[r]*basisvalues[r];
 
624
      }// end loop over 'r'
 
625
        break;
 
626
      }
 
627
    case 5:
 
628
      {
 
629
        
 
630
      // Array of basisvalues.
 
631
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
632
      
 
633
      // Declare helper variables.
 
634
      unsigned int rr = 0;
 
635
      unsigned int ss = 0;
 
636
      unsigned int tt = 0;
 
637
      double tmp5 = 0.000000000000000;
 
638
      double tmp6 = 0.000000000000000;
 
639
      double tmp7 = 0.000000000000000;
 
640
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
641
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
642
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
643
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
644
      double tmp4 = tmp3*tmp3;
 
645
      
 
646
      // Compute basisvalues.
 
647
      basisvalues[0] = 1.000000000000000;
 
648
      basisvalues[1] = tmp0;
 
649
      for (unsigned int r = 1; r < 2; r++)
 
650
      {
 
651
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
652
        ss = r*(r + 1)*(r + 2)/6;
 
653
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
654
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
655
      }// end loop over 'r'
 
656
      for (unsigned int r = 0; r < 2; r++)
 
657
      {
 
658
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
659
        ss = r*(r + 1)*(r + 2)/6;
 
660
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
661
      }// end loop over 'r'
 
662
      for (unsigned int r = 0; r < 1; r++)
 
663
      {
 
664
        for (unsigned int s = 1; s < 2 - r; s++)
 
665
        {
 
666
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
667
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
668
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
669
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
670
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
671
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
672
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
673
        }// end loop over 's'
 
674
      }// end loop over 'r'
 
675
      for (unsigned int r = 0; r < 2; r++)
 
676
      {
 
677
        for (unsigned int s = 0; s < 2 - r; s++)
 
678
        {
 
679
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
680
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
681
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
682
        }// end loop over 's'
 
683
      }// end loop over 'r'
 
684
      for (unsigned int r = 0; r < 1; r++)
 
685
      {
 
686
        for (unsigned int s = 0; s < 1 - r; s++)
 
687
        {
 
688
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
689
          {
 
690
            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;
 
691
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
692
            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;
 
693
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
694
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
695
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
696
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
697
          }// end loop over 't'
 
698
        }// end loop over 's'
 
699
      }// end loop over 'r'
 
700
      for (unsigned int r = 0; r < 3; r++)
 
701
      {
 
702
        for (unsigned int s = 0; s < 3 - r; s++)
 
703
        {
 
704
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
705
          {
 
706
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
707
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
708
          }// end loop over 't'
 
709
        }// end loop over 's'
 
710
      }// end loop over 'r'
 
711
      
 
712
      // Table(s) of coefficients.
 
713
      static const double coefficients0[10] = \
 
714
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
715
      
 
716
      // Compute value(s).
 
717
      for (unsigned int r = 0; r < 10; r++)
 
718
      {
 
719
        *values += coefficients0[r]*basisvalues[r];
 
720
      }// end loop over 'r'
 
721
        break;
 
722
      }
 
723
    case 6:
 
724
      {
 
725
        
 
726
      // Array of basisvalues.
 
727
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
728
      
 
729
      // Declare helper variables.
 
730
      unsigned int rr = 0;
 
731
      unsigned int ss = 0;
 
732
      unsigned int tt = 0;
 
733
      double tmp5 = 0.000000000000000;
 
734
      double tmp6 = 0.000000000000000;
 
735
      double tmp7 = 0.000000000000000;
 
736
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
737
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
738
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
739
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
740
      double tmp4 = tmp3*tmp3;
 
741
      
 
742
      // Compute basisvalues.
 
743
      basisvalues[0] = 1.000000000000000;
 
744
      basisvalues[1] = tmp0;
 
745
      for (unsigned int r = 1; r < 2; r++)
 
746
      {
 
747
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
748
        ss = r*(r + 1)*(r + 2)/6;
 
749
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
750
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
751
      }// end loop over 'r'
 
752
      for (unsigned int r = 0; r < 2; r++)
 
753
      {
 
754
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
755
        ss = r*(r + 1)*(r + 2)/6;
 
756
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
757
      }// end loop over 'r'
 
758
      for (unsigned int r = 0; r < 1; r++)
 
759
      {
 
760
        for (unsigned int s = 1; s < 2 - r; s++)
 
761
        {
 
762
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
763
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
764
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
765
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
766
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
767
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
768
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
769
        }// end loop over 's'
 
770
      }// end loop over 'r'
 
771
      for (unsigned int r = 0; r < 2; r++)
 
772
      {
 
773
        for (unsigned int s = 0; s < 2 - r; s++)
 
774
        {
 
775
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
776
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
777
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
778
        }// end loop over 's'
 
779
      }// end loop over 'r'
 
780
      for (unsigned int r = 0; r < 1; r++)
 
781
      {
 
782
        for (unsigned int s = 0; s < 1 - r; s++)
 
783
        {
 
784
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
785
          {
 
786
            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;
 
787
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
788
            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;
 
789
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
790
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
791
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
792
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
793
          }// end loop over 't'
 
794
        }// end loop over 's'
 
795
      }// end loop over 'r'
 
796
      for (unsigned int r = 0; r < 3; r++)
 
797
      {
 
798
        for (unsigned int s = 0; s < 3 - r; s++)
 
799
        {
 
800
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
801
          {
 
802
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
803
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
804
          }// end loop over 't'
 
805
        }// end loop over 's'
 
806
      }// end loop over 'r'
 
807
      
 
808
      // Table(s) of coefficients.
 
809
      static const double coefficients0[10] = \
 
810
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
811
      
 
812
      // Compute value(s).
 
813
      for (unsigned int r = 0; r < 10; r++)
 
814
      {
 
815
        *values += coefficients0[r]*basisvalues[r];
 
816
      }// end loop over 'r'
 
817
        break;
 
818
      }
 
819
    case 7:
 
820
      {
 
821
        
 
822
      // Array of basisvalues.
 
823
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
824
      
 
825
      // Declare helper variables.
 
826
      unsigned int rr = 0;
 
827
      unsigned int ss = 0;
 
828
      unsigned int tt = 0;
 
829
      double tmp5 = 0.000000000000000;
 
830
      double tmp6 = 0.000000000000000;
 
831
      double tmp7 = 0.000000000000000;
 
832
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
833
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
834
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
835
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
836
      double tmp4 = tmp3*tmp3;
 
837
      
 
838
      // Compute basisvalues.
 
839
      basisvalues[0] = 1.000000000000000;
 
840
      basisvalues[1] = tmp0;
 
841
      for (unsigned int r = 1; r < 2; r++)
 
842
      {
 
843
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
844
        ss = r*(r + 1)*(r + 2)/6;
 
845
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
846
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
847
      }// end loop over 'r'
 
848
      for (unsigned int r = 0; r < 2; r++)
 
849
      {
 
850
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
851
        ss = r*(r + 1)*(r + 2)/6;
 
852
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
853
      }// end loop over 'r'
 
854
      for (unsigned int r = 0; r < 1; r++)
 
855
      {
 
856
        for (unsigned int s = 1; s < 2 - r; s++)
 
857
        {
 
858
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
859
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
860
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
861
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
862
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
863
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
864
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
865
        }// end loop over 's'
 
866
      }// end loop over 'r'
 
867
      for (unsigned int r = 0; r < 2; r++)
 
868
      {
 
869
        for (unsigned int s = 0; s < 2 - r; s++)
 
870
        {
 
871
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
872
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
873
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
874
        }// end loop over 's'
 
875
      }// end loop over 'r'
 
876
      for (unsigned int r = 0; r < 1; r++)
 
877
      {
 
878
        for (unsigned int s = 0; s < 1 - r; s++)
 
879
        {
 
880
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
881
          {
 
882
            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;
 
883
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
884
            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;
 
885
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
886
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
887
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
888
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
889
          }// end loop over 't'
 
890
        }// end loop over 's'
 
891
      }// end loop over 'r'
 
892
      for (unsigned int r = 0; r < 3; r++)
 
893
      {
 
894
        for (unsigned int s = 0; s < 3 - r; s++)
 
895
        {
 
896
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
897
          {
 
898
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
899
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
900
          }// end loop over 't'
 
901
        }// end loop over 's'
 
902
      }// end loop over 'r'
 
903
      
 
904
      // Table(s) of coefficients.
 
905
      static const double coefficients0[10] = \
 
906
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
907
      
 
908
      // Compute value(s).
 
909
      for (unsigned int r = 0; r < 10; r++)
 
910
      {
 
911
        *values += coefficients0[r]*basisvalues[r];
 
912
      }// end loop over 'r'
 
913
        break;
 
914
      }
 
915
    case 8:
 
916
      {
 
917
        
 
918
      // Array of basisvalues.
 
919
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
920
      
 
921
      // Declare helper variables.
 
922
      unsigned int rr = 0;
 
923
      unsigned int ss = 0;
 
924
      unsigned int tt = 0;
 
925
      double tmp5 = 0.000000000000000;
 
926
      double tmp6 = 0.000000000000000;
 
927
      double tmp7 = 0.000000000000000;
 
928
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
929
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
930
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
931
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
932
      double tmp4 = tmp3*tmp3;
 
933
      
 
934
      // Compute basisvalues.
 
935
      basisvalues[0] = 1.000000000000000;
 
936
      basisvalues[1] = tmp0;
 
937
      for (unsigned int r = 1; r < 2; r++)
 
938
      {
 
939
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
940
        ss = r*(r + 1)*(r + 2)/6;
 
941
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
942
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
943
      }// end loop over 'r'
 
944
      for (unsigned int r = 0; r < 2; r++)
 
945
      {
 
946
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
947
        ss = r*(r + 1)*(r + 2)/6;
 
948
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
949
      }// end loop over 'r'
 
950
      for (unsigned int r = 0; r < 1; r++)
 
951
      {
 
952
        for (unsigned int s = 1; s < 2 - r; s++)
 
953
        {
 
954
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
955
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
956
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
957
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
958
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
959
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
960
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
961
        }// end loop over 's'
 
962
      }// end loop over 'r'
 
963
      for (unsigned int r = 0; r < 2; r++)
 
964
      {
 
965
        for (unsigned int s = 0; s < 2 - r; s++)
 
966
        {
 
967
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
968
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
969
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
970
        }// end loop over 's'
 
971
      }// end loop over 'r'
 
972
      for (unsigned int r = 0; r < 1; r++)
 
973
      {
 
974
        for (unsigned int s = 0; s < 1 - r; s++)
 
975
        {
 
976
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
977
          {
 
978
            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;
 
979
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
980
            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;
 
981
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
982
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
983
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
984
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
985
          }// end loop over 't'
 
986
        }// end loop over 's'
 
987
      }// end loop over 'r'
 
988
      for (unsigned int r = 0; r < 3; r++)
 
989
      {
 
990
        for (unsigned int s = 0; s < 3 - r; s++)
 
991
        {
 
992
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
993
          {
 
994
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
995
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
996
          }// end loop over 't'
 
997
        }// end loop over 's'
 
998
      }// end loop over 'r'
 
999
      
 
1000
      // Table(s) of coefficients.
 
1001
      static const double coefficients0[10] = \
 
1002
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
1003
      
 
1004
      // Compute value(s).
 
1005
      for (unsigned int r = 0; r < 10; r++)
 
1006
      {
 
1007
        *values += coefficients0[r]*basisvalues[r];
 
1008
      }// end loop over 'r'
 
1009
        break;
 
1010
      }
 
1011
    case 9:
 
1012
      {
 
1013
        
 
1014
      // Array of basisvalues.
 
1015
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
1016
      
 
1017
      // Declare helper variables.
 
1018
      unsigned int rr = 0;
 
1019
      unsigned int ss = 0;
 
1020
      unsigned int tt = 0;
 
1021
      double tmp5 = 0.000000000000000;
 
1022
      double tmp6 = 0.000000000000000;
 
1023
      double tmp7 = 0.000000000000000;
 
1024
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
1025
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
1026
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
1027
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
1028
      double tmp4 = tmp3*tmp3;
 
1029
      
 
1030
      // Compute basisvalues.
 
1031
      basisvalues[0] = 1.000000000000000;
 
1032
      basisvalues[1] = tmp0;
 
1033
      for (unsigned int r = 1; r < 2; r++)
 
1034
      {
 
1035
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1036
        ss = r*(r + 1)*(r + 2)/6;
 
1037
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1038
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
1039
      }// end loop over 'r'
 
1040
      for (unsigned int r = 0; r < 2; r++)
 
1041
      {
 
1042
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1043
        ss = r*(r + 1)*(r + 2)/6;
 
1044
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
1045
      }// end loop over 'r'
 
1046
      for (unsigned int r = 0; r < 1; r++)
 
1047
      {
 
1048
        for (unsigned int s = 1; s < 2 - r; s++)
 
1049
        {
 
1050
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1051
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1052
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1053
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1054
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1055
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1056
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1057
        }// end loop over 's'
 
1058
      }// end loop over 'r'
 
1059
      for (unsigned int r = 0; r < 2; r++)
 
1060
      {
 
1061
        for (unsigned int s = 0; s < 2 - r; s++)
 
1062
        {
 
1063
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1064
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1065
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
1066
        }// end loop over 's'
 
1067
      }// end loop over 'r'
 
1068
      for (unsigned int r = 0; r < 1; r++)
 
1069
      {
 
1070
        for (unsigned int s = 0; s < 1 - r; s++)
 
1071
        {
 
1072
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1073
          {
 
1074
            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;
 
1075
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1076
            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;
 
1077
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1078
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1079
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1080
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1081
          }// end loop over 't'
 
1082
        }// end loop over 's'
 
1083
      }// end loop over 'r'
 
1084
      for (unsigned int r = 0; r < 3; r++)
 
1085
      {
 
1086
        for (unsigned int s = 0; s < 3 - r; s++)
 
1087
        {
 
1088
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1089
          {
 
1090
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1091
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
1092
          }// end loop over 't'
 
1093
        }// end loop over 's'
 
1094
      }// end loop over 'r'
 
1095
      
 
1096
      // Table(s) of coefficients.
 
1097
      static const double coefficients0[10] = \
 
1098
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
1099
      
 
1100
      // Compute value(s).
 
1101
      for (unsigned int r = 0; r < 10; r++)
 
1102
      {
 
1103
        *values += coefficients0[r]*basisvalues[r];
 
1104
      }// end loop over 'r'
 
1105
        break;
 
1106
      }
 
1107
    }
 
1108
    
 
1109
  }
 
1110
 
 
1111
  /// Evaluate all basis functions at given point in cell
 
1112
  virtual void evaluate_basis_all(double* values,
 
1113
                                  const double* coordinates,
 
1114
                                  const ufc::cell& c) const
 
1115
  {
 
1116
    // Helper variable to hold values of a single dof.
 
1117
    double dof_values = 0.000000000000000;
 
1118
    
 
1119
    // Loop dofs and call evaluate_basis.
 
1120
    for (unsigned int r = 0; r < 10; r++)
 
1121
    {
 
1122
      evaluate_basis(r, &dof_values, coordinates, c);
 
1123
      values[r] = dof_values;
 
1124
    }// end loop over 'r'
 
1125
  }
 
1126
 
 
1127
  /// Evaluate order n derivatives of basis function i at given point in cell
 
1128
  virtual void evaluate_basis_derivatives(unsigned int i,
 
1129
                                          unsigned int n,
 
1130
                                          double* values,
 
1131
                                          const double* coordinates,
 
1132
                                          const ufc::cell& c) const
 
1133
  {
 
1134
    // Extract vertex coordinates
 
1135
    const double * const * x = c.coordinates;
 
1136
    
 
1137
    // Compute Jacobian of affine map from reference cell
 
1138
    const double J_00 = x[1][0] - x[0][0];
 
1139
    const double J_01 = x[2][0] - x[0][0];
 
1140
    const double J_02 = x[3][0] - x[0][0];
 
1141
    const double J_10 = x[1][1] - x[0][1];
 
1142
    const double J_11 = x[2][1] - x[0][1];
 
1143
    const double J_12 = x[3][1] - x[0][1];
 
1144
    const double J_20 = x[1][2] - x[0][2];
 
1145
    const double J_21 = x[2][2] - x[0][2];
 
1146
    const double J_22 = x[3][2] - x[0][2];
 
1147
    
 
1148
    // Compute sub determinants
 
1149
    const double d_00 = J_11*J_22 - J_12*J_21;
 
1150
    const double d_01 = J_12*J_20 - J_10*J_22;
 
1151
    const double d_02 = J_10*J_21 - J_11*J_20;
 
1152
    const double d_10 = J_02*J_21 - J_01*J_22;
 
1153
    const double d_11 = J_00*J_22 - J_02*J_20;
 
1154
    const double d_12 = J_01*J_20 - J_00*J_21;
 
1155
    const double d_20 = J_01*J_12 - J_02*J_11;
 
1156
    const double d_21 = J_02*J_10 - J_00*J_12;
 
1157
    const double d_22 = J_00*J_11 - J_01*J_10;
 
1158
    
 
1159
    // Compute determinant of Jacobian
 
1160
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
1161
    
 
1162
    // Compute inverse of Jacobian
 
1163
    const double K_00 = d_00 / detJ;
 
1164
    const double K_01 = d_10 / detJ;
 
1165
    const double K_02 = d_20 / detJ;
 
1166
    const double K_10 = d_01 / detJ;
 
1167
    const double K_11 = d_11 / detJ;
 
1168
    const double K_12 = d_21 / detJ;
 
1169
    const double K_20 = d_02 / detJ;
 
1170
    const double K_21 = d_12 / detJ;
 
1171
    const double K_22 = d_22 / detJ;
 
1172
    
 
1173
    // Compute constants
 
1174
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
1175
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
1176
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
1177
    
 
1178
    // Get coordinates and map to the reference (FIAT) element
 
1179
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
1180
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
1181
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
1182
    
 
1183
    
 
1184
    // Compute number of derivatives.
 
1185
    unsigned int num_derivatives = 1;
 
1186
    for (unsigned int r = 0; r < n; r++)
 
1187
    {
 
1188
      num_derivatives *= 3;
 
1189
    }// end loop over 'r'
 
1190
    
 
1191
    // Declare pointer to two dimensional array that holds combinations of derivatives and initialise
 
1192
    unsigned int **combinations = new unsigned int *[num_derivatives];
 
1193
    for (unsigned int row = 0; row < num_derivatives; row++)
 
1194
    {
 
1195
      combinations[row] = new unsigned int [n];
 
1196
      for (unsigned int col = 0; col < n; col++)
 
1197
        combinations[row][col] = 0;
 
1198
    }
 
1199
    
 
1200
    // Generate combinations of derivatives
 
1201
    for (unsigned int row = 1; row < num_derivatives; row++)
 
1202
    {
 
1203
      for (unsigned int num = 0; num < row; num++)
 
1204
      {
 
1205
        for (unsigned int col = n-1; col+1 > 0; col--)
 
1206
        {
 
1207
          if (combinations[row][col] + 1 > 2)
 
1208
            combinations[row][col] = 0;
 
1209
          else
 
1210
          {
 
1211
            combinations[row][col] += 1;
 
1212
            break;
 
1213
          }
 
1214
        }
 
1215
      }
 
1216
    }
 
1217
    
 
1218
    // Compute inverse of Jacobian
 
1219
    const double Jinv[3][3] = {{K_00, K_01, K_02}, {K_10, K_11, K_12}, {K_20, K_21, K_22}};
 
1220
    
 
1221
    // Declare transformation matrix
 
1222
    // Declare pointer to two dimensional array and initialise
 
1223
    double **transform = new double *[num_derivatives];
 
1224
    
 
1225
    for (unsigned int j = 0; j < num_derivatives; j++)
 
1226
    {
 
1227
      transform[j] = new double [num_derivatives];
 
1228
      for (unsigned int k = 0; k < num_derivatives; k++)
 
1229
        transform[j][k] = 1;
 
1230
    }
 
1231
    
 
1232
    // Construct transformation matrix
 
1233
    for (unsigned int row = 0; row < num_derivatives; row++)
 
1234
    {
 
1235
      for (unsigned int col = 0; col < num_derivatives; col++)
 
1236
      {
 
1237
        for (unsigned int k = 0; k < n; k++)
 
1238
          transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
 
1239
      }
 
1240
    }
 
1241
    
 
1242
    // Reset values. Assuming that values is always an array.
 
1243
    for (unsigned int r = 0; r < num_derivatives; r++)
 
1244
    {
 
1245
      values[r] = 0.000000000000000;
 
1246
    }// end loop over 'r'
 
1247
    
 
1248
    switch (i)
 
1249
    {
 
1250
    case 0:
 
1251
      {
 
1252
        
 
1253
      // Array of basisvalues.
 
1254
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
1255
      
 
1256
      // Declare helper variables.
 
1257
      unsigned int rr = 0;
 
1258
      unsigned int ss = 0;
 
1259
      unsigned int tt = 0;
 
1260
      double tmp5 = 0.000000000000000;
 
1261
      double tmp6 = 0.000000000000000;
 
1262
      double tmp7 = 0.000000000000000;
 
1263
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
1264
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
1265
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
1266
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
1267
      double tmp4 = tmp3*tmp3;
 
1268
      
 
1269
      // Compute basisvalues.
 
1270
      basisvalues[0] = 1.000000000000000;
 
1271
      basisvalues[1] = tmp0;
 
1272
      for (unsigned int r = 1; r < 2; r++)
 
1273
      {
 
1274
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1275
        ss = r*(r + 1)*(r + 2)/6;
 
1276
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1277
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
1278
      }// end loop over 'r'
 
1279
      for (unsigned int r = 0; r < 2; r++)
 
1280
      {
 
1281
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1282
        ss = r*(r + 1)*(r + 2)/6;
 
1283
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
1284
      }// end loop over 'r'
 
1285
      for (unsigned int r = 0; r < 1; r++)
 
1286
      {
 
1287
        for (unsigned int s = 1; s < 2 - r; s++)
 
1288
        {
 
1289
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1290
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1291
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1292
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1293
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1294
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1295
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1296
        }// end loop over 's'
 
1297
      }// end loop over 'r'
 
1298
      for (unsigned int r = 0; r < 2; r++)
 
1299
      {
 
1300
        for (unsigned int s = 0; s < 2 - r; s++)
 
1301
        {
 
1302
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1303
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1304
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
1305
        }// end loop over 's'
 
1306
      }// end loop over 'r'
 
1307
      for (unsigned int r = 0; r < 1; r++)
 
1308
      {
 
1309
        for (unsigned int s = 0; s < 1 - r; s++)
 
1310
        {
 
1311
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1312
          {
 
1313
            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;
 
1314
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1315
            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;
 
1316
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1317
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1318
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1319
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1320
          }// end loop over 't'
 
1321
        }// end loop over 's'
 
1322
      }// end loop over 'r'
 
1323
      for (unsigned int r = 0; r < 3; r++)
 
1324
      {
 
1325
        for (unsigned int s = 0; s < 3 - r; s++)
 
1326
        {
 
1327
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1328
          {
 
1329
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1330
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
1331
          }// end loop over 't'
 
1332
        }// end loop over 's'
 
1333
      }// end loop over 'r'
 
1334
      
 
1335
      // Table(s) of coefficients.
 
1336
      static const double coefficients0[10] = \
 
1337
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
1338
      
 
1339
      // Tables of derivatives of the polynomial base (transpose).
 
1340
      static const double dmats0[10][10] = \
 
1341
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1342
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1343
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1344
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1345
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1346
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1347
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1348
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1349
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1350
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1351
      
 
1352
      static const double dmats1[10][10] = \
 
1353
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1354
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1355
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1356
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1357
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1358
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1359
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1360
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1361
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1362
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1363
      
 
1364
      static const double dmats2[10][10] = \
 
1365
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1366
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1367
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1368
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1369
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1370
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1371
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1372
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1373
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1374
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1375
      
 
1376
      // Compute reference derivatives.
 
1377
      // Declare pointer to array of derivatives on FIAT element.
 
1378
      double *derivatives = new double[num_derivatives];
 
1379
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1380
      {
 
1381
        derivatives[r] = 0.000000000000000;
 
1382
      }// end loop over 'r'
 
1383
      
 
1384
      // Declare derivative matrix (of polynomial basis).
 
1385
      double dmats[10][10] = \
 
1386
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1387
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1388
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1389
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1390
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1391
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1392
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1393
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
1394
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
1395
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
1396
      
 
1397
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
1398
      double dmats_old[10][10] = \
 
1399
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1400
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1401
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1402
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1403
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1404
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1405
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1406
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
1407
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
1408
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
1409
      
 
1410
      // Loop possible derivatives.
 
1411
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1412
      {
 
1413
        // Resetting dmats values to compute next derivative.
 
1414
        for (unsigned int t = 0; t < 10; t++)
 
1415
        {
 
1416
          for (unsigned int u = 0; u < 10; u++)
 
1417
          {
 
1418
            dmats[t][u] = 0.000000000000000;
 
1419
            if (t == u)
 
1420
            {
 
1421
            dmats[t][u] = 1.000000000000000;
 
1422
            }
 
1423
            
 
1424
          }// end loop over 'u'
 
1425
        }// end loop over 't'
 
1426
        
 
1427
        // Looping derivative order to generate dmats.
 
1428
        for (unsigned int s = 0; s < n; s++)
 
1429
        {
 
1430
          // Updating dmats_old with new values and resetting dmats.
 
1431
          for (unsigned int t = 0; t < 10; t++)
 
1432
          {
 
1433
            for (unsigned int u = 0; u < 10; u++)
 
1434
            {
 
1435
              dmats_old[t][u] = dmats[t][u];
 
1436
              dmats[t][u] = 0.000000000000000;
 
1437
            }// end loop over 'u'
 
1438
          }// end loop over 't'
 
1439
          
 
1440
          // Update dmats using an inner product.
 
1441
          if (combinations[r][s] == 0)
 
1442
          {
 
1443
          for (unsigned int t = 0; t < 10; t++)
 
1444
          {
 
1445
            for (unsigned int u = 0; u < 10; u++)
 
1446
            {
 
1447
              for (unsigned int tu = 0; tu < 10; tu++)
 
1448
              {
 
1449
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
1450
              }// end loop over 'tu'
 
1451
            }// end loop over 'u'
 
1452
          }// end loop over 't'
 
1453
          }
 
1454
          
 
1455
          if (combinations[r][s] == 1)
 
1456
          {
 
1457
          for (unsigned int t = 0; t < 10; t++)
 
1458
          {
 
1459
            for (unsigned int u = 0; u < 10; u++)
 
1460
            {
 
1461
              for (unsigned int tu = 0; tu < 10; tu++)
 
1462
              {
 
1463
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
1464
              }// end loop over 'tu'
 
1465
            }// end loop over 'u'
 
1466
          }// end loop over 't'
 
1467
          }
 
1468
          
 
1469
          if (combinations[r][s] == 2)
 
1470
          {
 
1471
          for (unsigned int t = 0; t < 10; t++)
 
1472
          {
 
1473
            for (unsigned int u = 0; u < 10; u++)
 
1474
            {
 
1475
              for (unsigned int tu = 0; tu < 10; tu++)
 
1476
              {
 
1477
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
1478
              }// end loop over 'tu'
 
1479
            }// end loop over 'u'
 
1480
          }// end loop over 't'
 
1481
          }
 
1482
          
 
1483
        }// end loop over 's'
 
1484
        for (unsigned int s = 0; s < 10; s++)
 
1485
        {
 
1486
          for (unsigned int t = 0; t < 10; t++)
 
1487
          {
 
1488
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
1489
          }// end loop over 't'
 
1490
        }// end loop over 's'
 
1491
      }// end loop over 'r'
 
1492
      
 
1493
      // Transform derivatives back to physical element
 
1494
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1495
      {
 
1496
        for (unsigned int s = 0; s < num_derivatives; s++)
 
1497
        {
 
1498
          values[r] += transform[r][s]*derivatives[s];
 
1499
        }// end loop over 's'
 
1500
      }// end loop over 'r'
 
1501
      
 
1502
      // Delete pointer to array of derivatives on FIAT element
 
1503
      delete [] derivatives;
 
1504
      
 
1505
      // Delete pointer to array of combinations of derivatives and transform
 
1506
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1507
      {
 
1508
        delete [] combinations[r];
 
1509
      }// end loop over 'r'
 
1510
      delete [] combinations;
 
1511
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1512
      {
 
1513
        delete [] transform[r];
 
1514
      }// end loop over 'r'
 
1515
      delete [] transform;
 
1516
        break;
 
1517
      }
 
1518
    case 1:
 
1519
      {
 
1520
        
 
1521
      // Array of basisvalues.
 
1522
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
1523
      
 
1524
      // Declare helper variables.
 
1525
      unsigned int rr = 0;
 
1526
      unsigned int ss = 0;
 
1527
      unsigned int tt = 0;
 
1528
      double tmp5 = 0.000000000000000;
 
1529
      double tmp6 = 0.000000000000000;
 
1530
      double tmp7 = 0.000000000000000;
 
1531
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
1532
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
1533
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
1534
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
1535
      double tmp4 = tmp3*tmp3;
 
1536
      
 
1537
      // Compute basisvalues.
 
1538
      basisvalues[0] = 1.000000000000000;
 
1539
      basisvalues[1] = tmp0;
 
1540
      for (unsigned int r = 1; r < 2; r++)
 
1541
      {
 
1542
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1543
        ss = r*(r + 1)*(r + 2)/6;
 
1544
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1545
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
1546
      }// end loop over 'r'
 
1547
      for (unsigned int r = 0; r < 2; r++)
 
1548
      {
 
1549
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1550
        ss = r*(r + 1)*(r + 2)/6;
 
1551
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
1552
      }// end loop over 'r'
 
1553
      for (unsigned int r = 0; r < 1; r++)
 
1554
      {
 
1555
        for (unsigned int s = 1; s < 2 - r; s++)
 
1556
        {
 
1557
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1558
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1559
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1560
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1561
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1562
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1563
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1564
        }// end loop over 's'
 
1565
      }// end loop over 'r'
 
1566
      for (unsigned int r = 0; r < 2; r++)
 
1567
      {
 
1568
        for (unsigned int s = 0; s < 2 - r; s++)
 
1569
        {
 
1570
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1571
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1572
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
1573
        }// end loop over 's'
 
1574
      }// end loop over 'r'
 
1575
      for (unsigned int r = 0; r < 1; r++)
 
1576
      {
 
1577
        for (unsigned int s = 0; s < 1 - r; s++)
 
1578
        {
 
1579
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1580
          {
 
1581
            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;
 
1582
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1583
            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;
 
1584
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1585
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1586
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1587
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1588
          }// end loop over 't'
 
1589
        }// end loop over 's'
 
1590
      }// end loop over 'r'
 
1591
      for (unsigned int r = 0; r < 3; r++)
 
1592
      {
 
1593
        for (unsigned int s = 0; s < 3 - r; s++)
 
1594
        {
 
1595
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1596
          {
 
1597
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1598
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
1599
          }// end loop over 't'
 
1600
        }// end loop over 's'
 
1601
      }// end loop over 'r'
 
1602
      
 
1603
      // Table(s) of coefficients.
 
1604
      static const double coefficients0[10] = \
 
1605
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
1606
      
 
1607
      // Tables of derivatives of the polynomial base (transpose).
 
1608
      static const double dmats0[10][10] = \
 
1609
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1610
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1611
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1612
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1613
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1614
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1615
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1616
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1617
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1618
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1619
      
 
1620
      static const double dmats1[10][10] = \
 
1621
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1622
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1623
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1624
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1625
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1626
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1627
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1628
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1629
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1630
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1631
      
 
1632
      static const double dmats2[10][10] = \
 
1633
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1634
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1635
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1636
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1637
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1638
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1639
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1640
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1641
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1642
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1643
      
 
1644
      // Compute reference derivatives.
 
1645
      // Declare pointer to array of derivatives on FIAT element.
 
1646
      double *derivatives = new double[num_derivatives];
 
1647
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1648
      {
 
1649
        derivatives[r] = 0.000000000000000;
 
1650
      }// end loop over 'r'
 
1651
      
 
1652
      // Declare derivative matrix (of polynomial basis).
 
1653
      double dmats[10][10] = \
 
1654
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1655
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1656
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1657
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1658
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1659
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1660
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1661
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
1662
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
1663
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
1664
      
 
1665
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
1666
      double dmats_old[10][10] = \
 
1667
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1668
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1669
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1670
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1671
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1672
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1673
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1674
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
1675
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
1676
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
1677
      
 
1678
      // Loop possible derivatives.
 
1679
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1680
      {
 
1681
        // Resetting dmats values to compute next derivative.
 
1682
        for (unsigned int t = 0; t < 10; t++)
 
1683
        {
 
1684
          for (unsigned int u = 0; u < 10; u++)
 
1685
          {
 
1686
            dmats[t][u] = 0.000000000000000;
 
1687
            if (t == u)
 
1688
            {
 
1689
            dmats[t][u] = 1.000000000000000;
 
1690
            }
 
1691
            
 
1692
          }// end loop over 'u'
 
1693
        }// end loop over 't'
 
1694
        
 
1695
        // Looping derivative order to generate dmats.
 
1696
        for (unsigned int s = 0; s < n; s++)
 
1697
        {
 
1698
          // Updating dmats_old with new values and resetting dmats.
 
1699
          for (unsigned int t = 0; t < 10; t++)
 
1700
          {
 
1701
            for (unsigned int u = 0; u < 10; u++)
 
1702
            {
 
1703
              dmats_old[t][u] = dmats[t][u];
 
1704
              dmats[t][u] = 0.000000000000000;
 
1705
            }// end loop over 'u'
 
1706
          }// end loop over 't'
 
1707
          
 
1708
          // Update dmats using an inner product.
 
1709
          if (combinations[r][s] == 0)
 
1710
          {
 
1711
          for (unsigned int t = 0; t < 10; t++)
 
1712
          {
 
1713
            for (unsigned int u = 0; u < 10; u++)
 
1714
            {
 
1715
              for (unsigned int tu = 0; tu < 10; tu++)
 
1716
              {
 
1717
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
1718
              }// end loop over 'tu'
 
1719
            }// end loop over 'u'
 
1720
          }// end loop over 't'
 
1721
          }
 
1722
          
 
1723
          if (combinations[r][s] == 1)
 
1724
          {
 
1725
          for (unsigned int t = 0; t < 10; t++)
 
1726
          {
 
1727
            for (unsigned int u = 0; u < 10; u++)
 
1728
            {
 
1729
              for (unsigned int tu = 0; tu < 10; tu++)
 
1730
              {
 
1731
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
1732
              }// end loop over 'tu'
 
1733
            }// end loop over 'u'
 
1734
          }// end loop over 't'
 
1735
          }
 
1736
          
 
1737
          if (combinations[r][s] == 2)
 
1738
          {
 
1739
          for (unsigned int t = 0; t < 10; t++)
 
1740
          {
 
1741
            for (unsigned int u = 0; u < 10; u++)
 
1742
            {
 
1743
              for (unsigned int tu = 0; tu < 10; tu++)
 
1744
              {
 
1745
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
1746
              }// end loop over 'tu'
 
1747
            }// end loop over 'u'
 
1748
          }// end loop over 't'
 
1749
          }
 
1750
          
 
1751
        }// end loop over 's'
 
1752
        for (unsigned int s = 0; s < 10; s++)
 
1753
        {
 
1754
          for (unsigned int t = 0; t < 10; t++)
 
1755
          {
 
1756
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
1757
          }// end loop over 't'
 
1758
        }// end loop over 's'
 
1759
      }// end loop over 'r'
 
1760
      
 
1761
      // Transform derivatives back to physical element
 
1762
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1763
      {
 
1764
        for (unsigned int s = 0; s < num_derivatives; s++)
 
1765
        {
 
1766
          values[r] += transform[r][s]*derivatives[s];
 
1767
        }// end loop over 's'
 
1768
      }// end loop over 'r'
 
1769
      
 
1770
      // Delete pointer to array of derivatives on FIAT element
 
1771
      delete [] derivatives;
 
1772
      
 
1773
      // Delete pointer to array of combinations of derivatives and transform
 
1774
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1775
      {
 
1776
        delete [] combinations[r];
 
1777
      }// end loop over 'r'
 
1778
      delete [] combinations;
 
1779
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1780
      {
 
1781
        delete [] transform[r];
 
1782
      }// end loop over 'r'
 
1783
      delete [] transform;
 
1784
        break;
 
1785
      }
 
1786
    case 2:
 
1787
      {
 
1788
        
 
1789
      // Array of basisvalues.
 
1790
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
1791
      
 
1792
      // Declare helper variables.
 
1793
      unsigned int rr = 0;
 
1794
      unsigned int ss = 0;
 
1795
      unsigned int tt = 0;
 
1796
      double tmp5 = 0.000000000000000;
 
1797
      double tmp6 = 0.000000000000000;
 
1798
      double tmp7 = 0.000000000000000;
 
1799
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
1800
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
1801
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
1802
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
1803
      double tmp4 = tmp3*tmp3;
 
1804
      
 
1805
      // Compute basisvalues.
 
1806
      basisvalues[0] = 1.000000000000000;
 
1807
      basisvalues[1] = tmp0;
 
1808
      for (unsigned int r = 1; r < 2; r++)
 
1809
      {
 
1810
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
1811
        ss = r*(r + 1)*(r + 2)/6;
 
1812
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
1813
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
1814
      }// end loop over 'r'
 
1815
      for (unsigned int r = 0; r < 2; r++)
 
1816
      {
 
1817
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
1818
        ss = r*(r + 1)*(r + 2)/6;
 
1819
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
1820
      }// end loop over 'r'
 
1821
      for (unsigned int r = 0; r < 1; r++)
 
1822
      {
 
1823
        for (unsigned int s = 1; s < 2 - r; s++)
 
1824
        {
 
1825
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
1826
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1827
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
1828
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1829
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1830
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
1831
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
1832
        }// end loop over 's'
 
1833
      }// end loop over 'r'
 
1834
      for (unsigned int r = 0; r < 2; r++)
 
1835
      {
 
1836
        for (unsigned int s = 0; s < 2 - r; s++)
 
1837
        {
 
1838
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
1839
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
1840
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
1841
        }// end loop over 's'
 
1842
      }// end loop over 'r'
 
1843
      for (unsigned int r = 0; r < 1; r++)
 
1844
      {
 
1845
        for (unsigned int s = 0; s < 1 - r; s++)
 
1846
        {
 
1847
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
1848
          {
 
1849
            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;
 
1850
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1851
            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;
 
1852
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1853
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1854
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
1855
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
1856
          }// end loop over 't'
 
1857
        }// end loop over 's'
 
1858
      }// end loop over 'r'
 
1859
      for (unsigned int r = 0; r < 3; r++)
 
1860
      {
 
1861
        for (unsigned int s = 0; s < 3 - r; s++)
 
1862
        {
 
1863
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
1864
          {
 
1865
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
1866
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
1867
          }// end loop over 't'
 
1868
        }// end loop over 's'
 
1869
      }// end loop over 'r'
 
1870
      
 
1871
      // Table(s) of coefficients.
 
1872
      static const double coefficients0[10] = \
 
1873
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
1874
      
 
1875
      // Tables of derivatives of the polynomial base (transpose).
 
1876
      static const double dmats0[10][10] = \
 
1877
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1878
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1879
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1880
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1881
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1882
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1883
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1884
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1885
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1886
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1887
      
 
1888
      static const double dmats1[10][10] = \
 
1889
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1890
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1891
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1892
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1893
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1894
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1895
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1896
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1897
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1898
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1899
      
 
1900
      static const double dmats2[10][10] = \
 
1901
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1902
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1903
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1904
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1905
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1906
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1907
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1908
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1909
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1910
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
1911
      
 
1912
      // Compute reference derivatives.
 
1913
      // Declare pointer to array of derivatives on FIAT element.
 
1914
      double *derivatives = new double[num_derivatives];
 
1915
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1916
      {
 
1917
        derivatives[r] = 0.000000000000000;
 
1918
      }// end loop over 'r'
 
1919
      
 
1920
      // Declare derivative matrix (of polynomial basis).
 
1921
      double dmats[10][10] = \
 
1922
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1923
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1924
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1925
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1926
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1927
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1928
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1929
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
1930
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
1931
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
1932
      
 
1933
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
1934
      double dmats_old[10][10] = \
 
1935
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1936
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1937
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1938
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1939
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1940
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1941
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
1942
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
1943
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
1944
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
1945
      
 
1946
      // Loop possible derivatives.
 
1947
      for (unsigned int r = 0; r < num_derivatives; r++)
 
1948
      {
 
1949
        // Resetting dmats values to compute next derivative.
 
1950
        for (unsigned int t = 0; t < 10; t++)
 
1951
        {
 
1952
          for (unsigned int u = 0; u < 10; u++)
 
1953
          {
 
1954
            dmats[t][u] = 0.000000000000000;
 
1955
            if (t == u)
 
1956
            {
 
1957
            dmats[t][u] = 1.000000000000000;
 
1958
            }
 
1959
            
 
1960
          }// end loop over 'u'
 
1961
        }// end loop over 't'
 
1962
        
 
1963
        // Looping derivative order to generate dmats.
 
1964
        for (unsigned int s = 0; s < n; s++)
 
1965
        {
 
1966
          // Updating dmats_old with new values and resetting dmats.
 
1967
          for (unsigned int t = 0; t < 10; t++)
 
1968
          {
 
1969
            for (unsigned int u = 0; u < 10; u++)
 
1970
            {
 
1971
              dmats_old[t][u] = dmats[t][u];
 
1972
              dmats[t][u] = 0.000000000000000;
 
1973
            }// end loop over 'u'
 
1974
          }// end loop over 't'
 
1975
          
 
1976
          // Update dmats using an inner product.
 
1977
          if (combinations[r][s] == 0)
 
1978
          {
 
1979
          for (unsigned int t = 0; t < 10; t++)
 
1980
          {
 
1981
            for (unsigned int u = 0; u < 10; u++)
 
1982
            {
 
1983
              for (unsigned int tu = 0; tu < 10; tu++)
 
1984
              {
 
1985
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
1986
              }// end loop over 'tu'
 
1987
            }// end loop over 'u'
 
1988
          }// end loop over 't'
 
1989
          }
 
1990
          
 
1991
          if (combinations[r][s] == 1)
 
1992
          {
 
1993
          for (unsigned int t = 0; t < 10; t++)
 
1994
          {
 
1995
            for (unsigned int u = 0; u < 10; u++)
 
1996
            {
 
1997
              for (unsigned int tu = 0; tu < 10; tu++)
 
1998
              {
 
1999
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2000
              }// end loop over 'tu'
 
2001
            }// end loop over 'u'
 
2002
          }// end loop over 't'
 
2003
          }
 
2004
          
 
2005
          if (combinations[r][s] == 2)
 
2006
          {
 
2007
          for (unsigned int t = 0; t < 10; t++)
 
2008
          {
 
2009
            for (unsigned int u = 0; u < 10; u++)
 
2010
            {
 
2011
              for (unsigned int tu = 0; tu < 10; tu++)
 
2012
              {
 
2013
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2014
              }// end loop over 'tu'
 
2015
            }// end loop over 'u'
 
2016
          }// end loop over 't'
 
2017
          }
 
2018
          
 
2019
        }// end loop over 's'
 
2020
        for (unsigned int s = 0; s < 10; s++)
 
2021
        {
 
2022
          for (unsigned int t = 0; t < 10; t++)
 
2023
          {
 
2024
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2025
          }// end loop over 't'
 
2026
        }// end loop over 's'
 
2027
      }// end loop over 'r'
 
2028
      
 
2029
      // Transform derivatives back to physical element
 
2030
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2031
      {
 
2032
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2033
        {
 
2034
          values[r] += transform[r][s]*derivatives[s];
 
2035
        }// end loop over 's'
 
2036
      }// end loop over 'r'
 
2037
      
 
2038
      // Delete pointer to array of derivatives on FIAT element
 
2039
      delete [] derivatives;
 
2040
      
 
2041
      // Delete pointer to array of combinations of derivatives and transform
 
2042
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2043
      {
 
2044
        delete [] combinations[r];
 
2045
      }// end loop over 'r'
 
2046
      delete [] combinations;
 
2047
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2048
      {
 
2049
        delete [] transform[r];
 
2050
      }// end loop over 'r'
 
2051
      delete [] transform;
 
2052
        break;
 
2053
      }
 
2054
    case 3:
 
2055
      {
 
2056
        
 
2057
      // Array of basisvalues.
 
2058
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
2059
      
 
2060
      // Declare helper variables.
 
2061
      unsigned int rr = 0;
 
2062
      unsigned int ss = 0;
 
2063
      unsigned int tt = 0;
 
2064
      double tmp5 = 0.000000000000000;
 
2065
      double tmp6 = 0.000000000000000;
 
2066
      double tmp7 = 0.000000000000000;
 
2067
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
2068
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
2069
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
2070
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
2071
      double tmp4 = tmp3*tmp3;
 
2072
      
 
2073
      // Compute basisvalues.
 
2074
      basisvalues[0] = 1.000000000000000;
 
2075
      basisvalues[1] = tmp0;
 
2076
      for (unsigned int r = 1; r < 2; r++)
 
2077
      {
 
2078
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2079
        ss = r*(r + 1)*(r + 2)/6;
 
2080
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2081
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
2082
      }// end loop over 'r'
 
2083
      for (unsigned int r = 0; r < 2; r++)
 
2084
      {
 
2085
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2086
        ss = r*(r + 1)*(r + 2)/6;
 
2087
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
2088
      }// end loop over 'r'
 
2089
      for (unsigned int r = 0; r < 1; r++)
 
2090
      {
 
2091
        for (unsigned int s = 1; s < 2 - r; s++)
 
2092
        {
 
2093
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2094
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2095
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2096
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2097
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2098
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2099
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2100
        }// end loop over 's'
 
2101
      }// end loop over 'r'
 
2102
      for (unsigned int r = 0; r < 2; r++)
 
2103
      {
 
2104
        for (unsigned int s = 0; s < 2 - r; s++)
 
2105
        {
 
2106
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2107
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2108
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
2109
        }// end loop over 's'
 
2110
      }// end loop over 'r'
 
2111
      for (unsigned int r = 0; r < 1; r++)
 
2112
      {
 
2113
        for (unsigned int s = 0; s < 1 - r; s++)
 
2114
        {
 
2115
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2116
          {
 
2117
            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;
 
2118
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2119
            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;
 
2120
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2121
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2122
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2123
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2124
          }// end loop over 't'
 
2125
        }// end loop over 's'
 
2126
      }// end loop over 'r'
 
2127
      for (unsigned int r = 0; r < 3; r++)
 
2128
      {
 
2129
        for (unsigned int s = 0; s < 3 - r; s++)
 
2130
        {
 
2131
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2132
          {
 
2133
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2134
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
2135
          }// end loop over 't'
 
2136
        }// end loop over 's'
 
2137
      }// end loop over 'r'
 
2138
      
 
2139
      // Table(s) of coefficients.
 
2140
      static const double coefficients0[10] = \
 
2141
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
2142
      
 
2143
      // Tables of derivatives of the polynomial base (transpose).
 
2144
      static const double dmats0[10][10] = \
 
2145
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2146
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2147
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2148
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2149
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2150
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2151
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2152
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2153
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2154
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2155
      
 
2156
      static const double dmats1[10][10] = \
 
2157
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2158
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2159
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2160
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2161
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2162
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2163
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2164
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2165
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2166
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2167
      
 
2168
      static const double dmats2[10][10] = \
 
2169
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2170
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2171
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2172
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2173
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2174
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2175
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2176
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2177
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2178
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2179
      
 
2180
      // Compute reference derivatives.
 
2181
      // Declare pointer to array of derivatives on FIAT element.
 
2182
      double *derivatives = new double[num_derivatives];
 
2183
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2184
      {
 
2185
        derivatives[r] = 0.000000000000000;
 
2186
      }// end loop over 'r'
 
2187
      
 
2188
      // Declare derivative matrix (of polynomial basis).
 
2189
      double dmats[10][10] = \
 
2190
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2191
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2192
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2193
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2194
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2195
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2196
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2197
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
2198
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
2199
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
2200
      
 
2201
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2202
      double dmats_old[10][10] = \
 
2203
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2204
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2205
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2206
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2207
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2208
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2209
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2210
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
2211
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
2212
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
2213
      
 
2214
      // Loop possible derivatives.
 
2215
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2216
      {
 
2217
        // Resetting dmats values to compute next derivative.
 
2218
        for (unsigned int t = 0; t < 10; t++)
 
2219
        {
 
2220
          for (unsigned int u = 0; u < 10; u++)
 
2221
          {
 
2222
            dmats[t][u] = 0.000000000000000;
 
2223
            if (t == u)
 
2224
            {
 
2225
            dmats[t][u] = 1.000000000000000;
 
2226
            }
 
2227
            
 
2228
          }// end loop over 'u'
 
2229
        }// end loop over 't'
 
2230
        
 
2231
        // Looping derivative order to generate dmats.
 
2232
        for (unsigned int s = 0; s < n; s++)
 
2233
        {
 
2234
          // Updating dmats_old with new values and resetting dmats.
 
2235
          for (unsigned int t = 0; t < 10; t++)
 
2236
          {
 
2237
            for (unsigned int u = 0; u < 10; u++)
 
2238
            {
 
2239
              dmats_old[t][u] = dmats[t][u];
 
2240
              dmats[t][u] = 0.000000000000000;
 
2241
            }// end loop over 'u'
 
2242
          }// end loop over 't'
 
2243
          
 
2244
          // Update dmats using an inner product.
 
2245
          if (combinations[r][s] == 0)
 
2246
          {
 
2247
          for (unsigned int t = 0; t < 10; t++)
 
2248
          {
 
2249
            for (unsigned int u = 0; u < 10; u++)
 
2250
            {
 
2251
              for (unsigned int tu = 0; tu < 10; tu++)
 
2252
              {
 
2253
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
2254
              }// end loop over 'tu'
 
2255
            }// end loop over 'u'
 
2256
          }// end loop over 't'
 
2257
          }
 
2258
          
 
2259
          if (combinations[r][s] == 1)
 
2260
          {
 
2261
          for (unsigned int t = 0; t < 10; t++)
 
2262
          {
 
2263
            for (unsigned int u = 0; u < 10; u++)
 
2264
            {
 
2265
              for (unsigned int tu = 0; tu < 10; tu++)
 
2266
              {
 
2267
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2268
              }// end loop over 'tu'
 
2269
            }// end loop over 'u'
 
2270
          }// end loop over 't'
 
2271
          }
 
2272
          
 
2273
          if (combinations[r][s] == 2)
 
2274
          {
 
2275
          for (unsigned int t = 0; t < 10; t++)
 
2276
          {
 
2277
            for (unsigned int u = 0; u < 10; u++)
 
2278
            {
 
2279
              for (unsigned int tu = 0; tu < 10; tu++)
 
2280
              {
 
2281
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2282
              }// end loop over 'tu'
 
2283
            }// end loop over 'u'
 
2284
          }// end loop over 't'
 
2285
          }
 
2286
          
 
2287
        }// end loop over 's'
 
2288
        for (unsigned int s = 0; s < 10; s++)
 
2289
        {
 
2290
          for (unsigned int t = 0; t < 10; t++)
 
2291
          {
 
2292
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2293
          }// end loop over 't'
 
2294
        }// end loop over 's'
 
2295
      }// end loop over 'r'
 
2296
      
 
2297
      // Transform derivatives back to physical element
 
2298
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2299
      {
 
2300
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2301
        {
 
2302
          values[r] += transform[r][s]*derivatives[s];
 
2303
        }// end loop over 's'
 
2304
      }// end loop over 'r'
 
2305
      
 
2306
      // Delete pointer to array of derivatives on FIAT element
 
2307
      delete [] derivatives;
 
2308
      
 
2309
      // Delete pointer to array of combinations of derivatives and transform
 
2310
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2311
      {
 
2312
        delete [] combinations[r];
 
2313
      }// end loop over 'r'
 
2314
      delete [] combinations;
 
2315
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2316
      {
 
2317
        delete [] transform[r];
 
2318
      }// end loop over 'r'
 
2319
      delete [] transform;
 
2320
        break;
 
2321
      }
 
2322
    case 4:
 
2323
      {
 
2324
        
 
2325
      // Array of basisvalues.
 
2326
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
2327
      
 
2328
      // Declare helper variables.
 
2329
      unsigned int rr = 0;
 
2330
      unsigned int ss = 0;
 
2331
      unsigned int tt = 0;
 
2332
      double tmp5 = 0.000000000000000;
 
2333
      double tmp6 = 0.000000000000000;
 
2334
      double tmp7 = 0.000000000000000;
 
2335
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
2336
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
2337
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
2338
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
2339
      double tmp4 = tmp3*tmp3;
 
2340
      
 
2341
      // Compute basisvalues.
 
2342
      basisvalues[0] = 1.000000000000000;
 
2343
      basisvalues[1] = tmp0;
 
2344
      for (unsigned int r = 1; r < 2; r++)
 
2345
      {
 
2346
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2347
        ss = r*(r + 1)*(r + 2)/6;
 
2348
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2349
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
2350
      }// end loop over 'r'
 
2351
      for (unsigned int r = 0; r < 2; r++)
 
2352
      {
 
2353
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2354
        ss = r*(r + 1)*(r + 2)/6;
 
2355
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
2356
      }// end loop over 'r'
 
2357
      for (unsigned int r = 0; r < 1; r++)
 
2358
      {
 
2359
        for (unsigned int s = 1; s < 2 - r; s++)
 
2360
        {
 
2361
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2362
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2363
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2364
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2365
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2366
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2367
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2368
        }// end loop over 's'
 
2369
      }// end loop over 'r'
 
2370
      for (unsigned int r = 0; r < 2; r++)
 
2371
      {
 
2372
        for (unsigned int s = 0; s < 2 - r; s++)
 
2373
        {
 
2374
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2375
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2376
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
2377
        }// end loop over 's'
 
2378
      }// end loop over 'r'
 
2379
      for (unsigned int r = 0; r < 1; r++)
 
2380
      {
 
2381
        for (unsigned int s = 0; s < 1 - r; s++)
 
2382
        {
 
2383
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2384
          {
 
2385
            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;
 
2386
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2387
            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;
 
2388
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2389
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2390
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2391
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2392
          }// end loop over 't'
 
2393
        }// end loop over 's'
 
2394
      }// end loop over 'r'
 
2395
      for (unsigned int r = 0; r < 3; r++)
 
2396
      {
 
2397
        for (unsigned int s = 0; s < 3 - r; s++)
 
2398
        {
 
2399
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2400
          {
 
2401
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2402
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
2403
          }// end loop over 't'
 
2404
        }// end loop over 's'
 
2405
      }// end loop over 'r'
 
2406
      
 
2407
      // Table(s) of coefficients.
 
2408
      static const double coefficients0[10] = \
 
2409
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
2410
      
 
2411
      // Tables of derivatives of the polynomial base (transpose).
 
2412
      static const double dmats0[10][10] = \
 
2413
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2414
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2415
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2416
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2417
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2418
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2419
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2420
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2421
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2422
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2423
      
 
2424
      static const double dmats1[10][10] = \
 
2425
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2426
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2427
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2428
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2429
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2430
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2431
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2432
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2433
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2434
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2435
      
 
2436
      static const double dmats2[10][10] = \
 
2437
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2438
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2439
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2440
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2441
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2442
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2443
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2444
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2445
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2446
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2447
      
 
2448
      // Compute reference derivatives.
 
2449
      // Declare pointer to array of derivatives on FIAT element.
 
2450
      double *derivatives = new double[num_derivatives];
 
2451
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2452
      {
 
2453
        derivatives[r] = 0.000000000000000;
 
2454
      }// end loop over 'r'
 
2455
      
 
2456
      // Declare derivative matrix (of polynomial basis).
 
2457
      double dmats[10][10] = \
 
2458
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2459
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2460
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2461
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2462
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2463
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2464
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2465
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
2466
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
2467
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
2468
      
 
2469
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2470
      double dmats_old[10][10] = \
 
2471
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2472
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2473
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2474
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2475
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2476
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2477
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2478
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
2479
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
2480
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
2481
      
 
2482
      // Loop possible derivatives.
 
2483
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2484
      {
 
2485
        // Resetting dmats values to compute next derivative.
 
2486
        for (unsigned int t = 0; t < 10; t++)
 
2487
        {
 
2488
          for (unsigned int u = 0; u < 10; u++)
 
2489
          {
 
2490
            dmats[t][u] = 0.000000000000000;
 
2491
            if (t == u)
 
2492
            {
 
2493
            dmats[t][u] = 1.000000000000000;
 
2494
            }
 
2495
            
 
2496
          }// end loop over 'u'
 
2497
        }// end loop over 't'
 
2498
        
 
2499
        // Looping derivative order to generate dmats.
 
2500
        for (unsigned int s = 0; s < n; s++)
 
2501
        {
 
2502
          // Updating dmats_old with new values and resetting dmats.
 
2503
          for (unsigned int t = 0; t < 10; t++)
 
2504
          {
 
2505
            for (unsigned int u = 0; u < 10; u++)
 
2506
            {
 
2507
              dmats_old[t][u] = dmats[t][u];
 
2508
              dmats[t][u] = 0.000000000000000;
 
2509
            }// end loop over 'u'
 
2510
          }// end loop over 't'
 
2511
          
 
2512
          // Update dmats using an inner product.
 
2513
          if (combinations[r][s] == 0)
 
2514
          {
 
2515
          for (unsigned int t = 0; t < 10; t++)
 
2516
          {
 
2517
            for (unsigned int u = 0; u < 10; u++)
 
2518
            {
 
2519
              for (unsigned int tu = 0; tu < 10; tu++)
 
2520
              {
 
2521
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
2522
              }// end loop over 'tu'
 
2523
            }// end loop over 'u'
 
2524
          }// end loop over 't'
 
2525
          }
 
2526
          
 
2527
          if (combinations[r][s] == 1)
 
2528
          {
 
2529
          for (unsigned int t = 0; t < 10; t++)
 
2530
          {
 
2531
            for (unsigned int u = 0; u < 10; u++)
 
2532
            {
 
2533
              for (unsigned int tu = 0; tu < 10; tu++)
 
2534
              {
 
2535
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2536
              }// end loop over 'tu'
 
2537
            }// end loop over 'u'
 
2538
          }// end loop over 't'
 
2539
          }
 
2540
          
 
2541
          if (combinations[r][s] == 2)
 
2542
          {
 
2543
          for (unsigned int t = 0; t < 10; t++)
 
2544
          {
 
2545
            for (unsigned int u = 0; u < 10; u++)
 
2546
            {
 
2547
              for (unsigned int tu = 0; tu < 10; tu++)
 
2548
              {
 
2549
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2550
              }// end loop over 'tu'
 
2551
            }// end loop over 'u'
 
2552
          }// end loop over 't'
 
2553
          }
 
2554
          
 
2555
        }// end loop over 's'
 
2556
        for (unsigned int s = 0; s < 10; s++)
 
2557
        {
 
2558
          for (unsigned int t = 0; t < 10; t++)
 
2559
          {
 
2560
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2561
          }// end loop over 't'
 
2562
        }// end loop over 's'
 
2563
      }// end loop over 'r'
 
2564
      
 
2565
      // Transform derivatives back to physical element
 
2566
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2567
      {
 
2568
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2569
        {
 
2570
          values[r] += transform[r][s]*derivatives[s];
 
2571
        }// end loop over 's'
 
2572
      }// end loop over 'r'
 
2573
      
 
2574
      // Delete pointer to array of derivatives on FIAT element
 
2575
      delete [] derivatives;
 
2576
      
 
2577
      // Delete pointer to array of combinations of derivatives and transform
 
2578
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2579
      {
 
2580
        delete [] combinations[r];
 
2581
      }// end loop over 'r'
 
2582
      delete [] combinations;
 
2583
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2584
      {
 
2585
        delete [] transform[r];
 
2586
      }// end loop over 'r'
 
2587
      delete [] transform;
 
2588
        break;
 
2589
      }
 
2590
    case 5:
 
2591
      {
 
2592
        
 
2593
      // Array of basisvalues.
 
2594
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
2595
      
 
2596
      // Declare helper variables.
 
2597
      unsigned int rr = 0;
 
2598
      unsigned int ss = 0;
 
2599
      unsigned int tt = 0;
 
2600
      double tmp5 = 0.000000000000000;
 
2601
      double tmp6 = 0.000000000000000;
 
2602
      double tmp7 = 0.000000000000000;
 
2603
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
2604
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
2605
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
2606
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
2607
      double tmp4 = tmp3*tmp3;
 
2608
      
 
2609
      // Compute basisvalues.
 
2610
      basisvalues[0] = 1.000000000000000;
 
2611
      basisvalues[1] = tmp0;
 
2612
      for (unsigned int r = 1; r < 2; r++)
 
2613
      {
 
2614
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2615
        ss = r*(r + 1)*(r + 2)/6;
 
2616
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2617
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
2618
      }// end loop over 'r'
 
2619
      for (unsigned int r = 0; r < 2; r++)
 
2620
      {
 
2621
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2622
        ss = r*(r + 1)*(r + 2)/6;
 
2623
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
2624
      }// end loop over 'r'
 
2625
      for (unsigned int r = 0; r < 1; r++)
 
2626
      {
 
2627
        for (unsigned int s = 1; s < 2 - r; s++)
 
2628
        {
 
2629
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2630
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2631
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2632
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2633
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2634
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2635
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2636
        }// end loop over 's'
 
2637
      }// end loop over 'r'
 
2638
      for (unsigned int r = 0; r < 2; r++)
 
2639
      {
 
2640
        for (unsigned int s = 0; s < 2 - r; s++)
 
2641
        {
 
2642
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2643
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2644
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
2645
        }// end loop over 's'
 
2646
      }// end loop over 'r'
 
2647
      for (unsigned int r = 0; r < 1; r++)
 
2648
      {
 
2649
        for (unsigned int s = 0; s < 1 - r; s++)
 
2650
        {
 
2651
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2652
          {
 
2653
            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;
 
2654
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2655
            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;
 
2656
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2657
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2658
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2659
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2660
          }// end loop over 't'
 
2661
        }// end loop over 's'
 
2662
      }// end loop over 'r'
 
2663
      for (unsigned int r = 0; r < 3; r++)
 
2664
      {
 
2665
        for (unsigned int s = 0; s < 3 - r; s++)
 
2666
        {
 
2667
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2668
          {
 
2669
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2670
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
2671
          }// end loop over 't'
 
2672
        }// end loop over 's'
 
2673
      }// end loop over 'r'
 
2674
      
 
2675
      // Table(s) of coefficients.
 
2676
      static const double coefficients0[10] = \
 
2677
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
2678
      
 
2679
      // Tables of derivatives of the polynomial base (transpose).
 
2680
      static const double dmats0[10][10] = \
 
2681
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2682
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2683
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2684
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2685
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2686
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2687
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2688
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2689
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2690
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2691
      
 
2692
      static const double dmats1[10][10] = \
 
2693
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2694
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2695
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2696
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2697
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2698
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2699
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2700
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2701
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2702
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2703
      
 
2704
      static const double dmats2[10][10] = \
 
2705
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2706
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2707
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2708
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2709
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2710
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2711
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2712
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2713
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2714
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2715
      
 
2716
      // Compute reference derivatives.
 
2717
      // Declare pointer to array of derivatives on FIAT element.
 
2718
      double *derivatives = new double[num_derivatives];
 
2719
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2720
      {
 
2721
        derivatives[r] = 0.000000000000000;
 
2722
      }// end loop over 'r'
 
2723
      
 
2724
      // Declare derivative matrix (of polynomial basis).
 
2725
      double dmats[10][10] = \
 
2726
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2727
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2728
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2729
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2730
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2731
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2732
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2733
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
2734
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
2735
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
2736
      
 
2737
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
2738
      double dmats_old[10][10] = \
 
2739
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2740
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2741
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2742
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2743
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2744
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2745
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2746
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
2747
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
2748
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
2749
      
 
2750
      // Loop possible derivatives.
 
2751
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2752
      {
 
2753
        // Resetting dmats values to compute next derivative.
 
2754
        for (unsigned int t = 0; t < 10; t++)
 
2755
        {
 
2756
          for (unsigned int u = 0; u < 10; u++)
 
2757
          {
 
2758
            dmats[t][u] = 0.000000000000000;
 
2759
            if (t == u)
 
2760
            {
 
2761
            dmats[t][u] = 1.000000000000000;
 
2762
            }
 
2763
            
 
2764
          }// end loop over 'u'
 
2765
        }// end loop over 't'
 
2766
        
 
2767
        // Looping derivative order to generate dmats.
 
2768
        for (unsigned int s = 0; s < n; s++)
 
2769
        {
 
2770
          // Updating dmats_old with new values and resetting dmats.
 
2771
          for (unsigned int t = 0; t < 10; t++)
 
2772
          {
 
2773
            for (unsigned int u = 0; u < 10; u++)
 
2774
            {
 
2775
              dmats_old[t][u] = dmats[t][u];
 
2776
              dmats[t][u] = 0.000000000000000;
 
2777
            }// end loop over 'u'
 
2778
          }// end loop over 't'
 
2779
          
 
2780
          // Update dmats using an inner product.
 
2781
          if (combinations[r][s] == 0)
 
2782
          {
 
2783
          for (unsigned int t = 0; t < 10; t++)
 
2784
          {
 
2785
            for (unsigned int u = 0; u < 10; u++)
 
2786
            {
 
2787
              for (unsigned int tu = 0; tu < 10; tu++)
 
2788
              {
 
2789
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
2790
              }// end loop over 'tu'
 
2791
            }// end loop over 'u'
 
2792
          }// end loop over 't'
 
2793
          }
 
2794
          
 
2795
          if (combinations[r][s] == 1)
 
2796
          {
 
2797
          for (unsigned int t = 0; t < 10; t++)
 
2798
          {
 
2799
            for (unsigned int u = 0; u < 10; u++)
 
2800
            {
 
2801
              for (unsigned int tu = 0; tu < 10; tu++)
 
2802
              {
 
2803
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
2804
              }// end loop over 'tu'
 
2805
            }// end loop over 'u'
 
2806
          }// end loop over 't'
 
2807
          }
 
2808
          
 
2809
          if (combinations[r][s] == 2)
 
2810
          {
 
2811
          for (unsigned int t = 0; t < 10; t++)
 
2812
          {
 
2813
            for (unsigned int u = 0; u < 10; u++)
 
2814
            {
 
2815
              for (unsigned int tu = 0; tu < 10; tu++)
 
2816
              {
 
2817
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
2818
              }// end loop over 'tu'
 
2819
            }// end loop over 'u'
 
2820
          }// end loop over 't'
 
2821
          }
 
2822
          
 
2823
        }// end loop over 's'
 
2824
        for (unsigned int s = 0; s < 10; s++)
 
2825
        {
 
2826
          for (unsigned int t = 0; t < 10; t++)
 
2827
          {
 
2828
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
2829
          }// end loop over 't'
 
2830
        }// end loop over 's'
 
2831
      }// end loop over 'r'
 
2832
      
 
2833
      // Transform derivatives back to physical element
 
2834
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2835
      {
 
2836
        for (unsigned int s = 0; s < num_derivatives; s++)
 
2837
        {
 
2838
          values[r] += transform[r][s]*derivatives[s];
 
2839
        }// end loop over 's'
 
2840
      }// end loop over 'r'
 
2841
      
 
2842
      // Delete pointer to array of derivatives on FIAT element
 
2843
      delete [] derivatives;
 
2844
      
 
2845
      // Delete pointer to array of combinations of derivatives and transform
 
2846
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2847
      {
 
2848
        delete [] combinations[r];
 
2849
      }// end loop over 'r'
 
2850
      delete [] combinations;
 
2851
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2852
      {
 
2853
        delete [] transform[r];
 
2854
      }// end loop over 'r'
 
2855
      delete [] transform;
 
2856
        break;
 
2857
      }
 
2858
    case 6:
 
2859
      {
 
2860
        
 
2861
      // Array of basisvalues.
 
2862
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
2863
      
 
2864
      // Declare helper variables.
 
2865
      unsigned int rr = 0;
 
2866
      unsigned int ss = 0;
 
2867
      unsigned int tt = 0;
 
2868
      double tmp5 = 0.000000000000000;
 
2869
      double tmp6 = 0.000000000000000;
 
2870
      double tmp7 = 0.000000000000000;
 
2871
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
2872
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
2873
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
2874
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
2875
      double tmp4 = tmp3*tmp3;
 
2876
      
 
2877
      // Compute basisvalues.
 
2878
      basisvalues[0] = 1.000000000000000;
 
2879
      basisvalues[1] = tmp0;
 
2880
      for (unsigned int r = 1; r < 2; r++)
 
2881
      {
 
2882
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
2883
        ss = r*(r + 1)*(r + 2)/6;
 
2884
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
2885
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
2886
      }// end loop over 'r'
 
2887
      for (unsigned int r = 0; r < 2; r++)
 
2888
      {
 
2889
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
2890
        ss = r*(r + 1)*(r + 2)/6;
 
2891
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
2892
      }// end loop over 'r'
 
2893
      for (unsigned int r = 0; r < 1; r++)
 
2894
      {
 
2895
        for (unsigned int s = 1; s < 2 - r; s++)
 
2896
        {
 
2897
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
2898
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2899
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
2900
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2901
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2902
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
2903
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
2904
        }// end loop over 's'
 
2905
      }// end loop over 'r'
 
2906
      for (unsigned int r = 0; r < 2; r++)
 
2907
      {
 
2908
        for (unsigned int s = 0; s < 2 - r; s++)
 
2909
        {
 
2910
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
2911
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
2912
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
2913
        }// end loop over 's'
 
2914
      }// end loop over 'r'
 
2915
      for (unsigned int r = 0; r < 1; r++)
 
2916
      {
 
2917
        for (unsigned int s = 0; s < 1 - r; s++)
 
2918
        {
 
2919
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
2920
          {
 
2921
            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;
 
2922
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2923
            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;
 
2924
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2925
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2926
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
2927
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
2928
          }// end loop over 't'
 
2929
        }// end loop over 's'
 
2930
      }// end loop over 'r'
 
2931
      for (unsigned int r = 0; r < 3; r++)
 
2932
      {
 
2933
        for (unsigned int s = 0; s < 3 - r; s++)
 
2934
        {
 
2935
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
2936
          {
 
2937
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
2938
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
2939
          }// end loop over 't'
 
2940
        }// end loop over 's'
 
2941
      }// end loop over 'r'
 
2942
      
 
2943
      // Table(s) of coefficients.
 
2944
      static const double coefficients0[10] = \
 
2945
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
2946
      
 
2947
      // Tables of derivatives of the polynomial base (transpose).
 
2948
      static const double dmats0[10][10] = \
 
2949
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2950
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2951
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2952
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2953
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2954
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2955
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2956
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2957
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2958
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2959
      
 
2960
      static const double dmats1[10][10] = \
 
2961
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2962
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2963
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2964
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2965
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2966
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2967
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2968
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2969
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2970
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2971
      
 
2972
      static const double dmats2[10][10] = \
 
2973
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2974
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2975
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2976
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2977
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2978
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2979
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2980
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2981
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2982
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
2983
      
 
2984
      // Compute reference derivatives.
 
2985
      // Declare pointer to array of derivatives on FIAT element.
 
2986
      double *derivatives = new double[num_derivatives];
 
2987
      for (unsigned int r = 0; r < num_derivatives; r++)
 
2988
      {
 
2989
        derivatives[r] = 0.000000000000000;
 
2990
      }// end loop over 'r'
 
2991
      
 
2992
      // Declare derivative matrix (of polynomial basis).
 
2993
      double dmats[10][10] = \
 
2994
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2995
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2996
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2997
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2998
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
2999
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3000
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3001
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3002
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3003
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3004
      
 
3005
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3006
      double dmats_old[10][10] = \
 
3007
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3008
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3009
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3010
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3011
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3012
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3013
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3014
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3015
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3016
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3017
      
 
3018
      // Loop possible derivatives.
 
3019
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3020
      {
 
3021
        // Resetting dmats values to compute next derivative.
 
3022
        for (unsigned int t = 0; t < 10; t++)
 
3023
        {
 
3024
          for (unsigned int u = 0; u < 10; u++)
 
3025
          {
 
3026
            dmats[t][u] = 0.000000000000000;
 
3027
            if (t == u)
 
3028
            {
 
3029
            dmats[t][u] = 1.000000000000000;
 
3030
            }
 
3031
            
 
3032
          }// end loop over 'u'
 
3033
        }// end loop over 't'
 
3034
        
 
3035
        // Looping derivative order to generate dmats.
 
3036
        for (unsigned int s = 0; s < n; s++)
 
3037
        {
 
3038
          // Updating dmats_old with new values and resetting dmats.
 
3039
          for (unsigned int t = 0; t < 10; t++)
 
3040
          {
 
3041
            for (unsigned int u = 0; u < 10; u++)
 
3042
            {
 
3043
              dmats_old[t][u] = dmats[t][u];
 
3044
              dmats[t][u] = 0.000000000000000;
 
3045
            }// end loop over 'u'
 
3046
          }// end loop over 't'
 
3047
          
 
3048
          // Update dmats using an inner product.
 
3049
          if (combinations[r][s] == 0)
 
3050
          {
 
3051
          for (unsigned int t = 0; t < 10; t++)
 
3052
          {
 
3053
            for (unsigned int u = 0; u < 10; u++)
 
3054
            {
 
3055
              for (unsigned int tu = 0; tu < 10; tu++)
 
3056
              {
 
3057
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3058
              }// end loop over 'tu'
 
3059
            }// end loop over 'u'
 
3060
          }// end loop over 't'
 
3061
          }
 
3062
          
 
3063
          if (combinations[r][s] == 1)
 
3064
          {
 
3065
          for (unsigned int t = 0; t < 10; t++)
 
3066
          {
 
3067
            for (unsigned int u = 0; u < 10; u++)
 
3068
            {
 
3069
              for (unsigned int tu = 0; tu < 10; tu++)
 
3070
              {
 
3071
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3072
              }// end loop over 'tu'
 
3073
            }// end loop over 'u'
 
3074
          }// end loop over 't'
 
3075
          }
 
3076
          
 
3077
          if (combinations[r][s] == 2)
 
3078
          {
 
3079
          for (unsigned int t = 0; t < 10; t++)
 
3080
          {
 
3081
            for (unsigned int u = 0; u < 10; u++)
 
3082
            {
 
3083
              for (unsigned int tu = 0; tu < 10; tu++)
 
3084
              {
 
3085
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3086
              }// end loop over 'tu'
 
3087
            }// end loop over 'u'
 
3088
          }// end loop over 't'
 
3089
          }
 
3090
          
 
3091
        }// end loop over 's'
 
3092
        for (unsigned int s = 0; s < 10; s++)
 
3093
        {
 
3094
          for (unsigned int t = 0; t < 10; t++)
 
3095
          {
 
3096
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3097
          }// end loop over 't'
 
3098
        }// end loop over 's'
 
3099
      }// end loop over 'r'
 
3100
      
 
3101
      // Transform derivatives back to physical element
 
3102
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3103
      {
 
3104
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3105
        {
 
3106
          values[r] += transform[r][s]*derivatives[s];
 
3107
        }// end loop over 's'
 
3108
      }// end loop over 'r'
 
3109
      
 
3110
      // Delete pointer to array of derivatives on FIAT element
 
3111
      delete [] derivatives;
 
3112
      
 
3113
      // Delete pointer to array of combinations of derivatives and transform
 
3114
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3115
      {
 
3116
        delete [] combinations[r];
 
3117
      }// end loop over 'r'
 
3118
      delete [] combinations;
 
3119
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3120
      {
 
3121
        delete [] transform[r];
 
3122
      }// end loop over 'r'
 
3123
      delete [] transform;
 
3124
        break;
 
3125
      }
 
3126
    case 7:
 
3127
      {
 
3128
        
 
3129
      // Array of basisvalues.
 
3130
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
3131
      
 
3132
      // Declare helper variables.
 
3133
      unsigned int rr = 0;
 
3134
      unsigned int ss = 0;
 
3135
      unsigned int tt = 0;
 
3136
      double tmp5 = 0.000000000000000;
 
3137
      double tmp6 = 0.000000000000000;
 
3138
      double tmp7 = 0.000000000000000;
 
3139
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
3140
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
3141
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
3142
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
3143
      double tmp4 = tmp3*tmp3;
 
3144
      
 
3145
      // Compute basisvalues.
 
3146
      basisvalues[0] = 1.000000000000000;
 
3147
      basisvalues[1] = tmp0;
 
3148
      for (unsigned int r = 1; r < 2; r++)
 
3149
      {
 
3150
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
3151
        ss = r*(r + 1)*(r + 2)/6;
 
3152
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
3153
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
3154
      }// end loop over 'r'
 
3155
      for (unsigned int r = 0; r < 2; r++)
 
3156
      {
 
3157
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
3158
        ss = r*(r + 1)*(r + 2)/6;
 
3159
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
3160
      }// end loop over 'r'
 
3161
      for (unsigned int r = 0; r < 1; r++)
 
3162
      {
 
3163
        for (unsigned int s = 1; s < 2 - r; s++)
 
3164
        {
 
3165
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
3166
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3167
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
3168
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3169
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3170
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3171
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
3172
        }// end loop over 's'
 
3173
      }// end loop over 'r'
 
3174
      for (unsigned int r = 0; r < 2; r++)
 
3175
      {
 
3176
        for (unsigned int s = 0; s < 2 - r; s++)
 
3177
        {
 
3178
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
3179
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3180
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
3181
        }// end loop over 's'
 
3182
      }// end loop over 'r'
 
3183
      for (unsigned int r = 0; r < 1; r++)
 
3184
      {
 
3185
        for (unsigned int s = 0; s < 1 - r; s++)
 
3186
        {
 
3187
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
3188
          {
 
3189
            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;
 
3190
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3191
            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;
 
3192
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3193
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3194
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3195
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
3196
          }// end loop over 't'
 
3197
        }// end loop over 's'
 
3198
      }// end loop over 'r'
 
3199
      for (unsigned int r = 0; r < 3; r++)
 
3200
      {
 
3201
        for (unsigned int s = 0; s < 3 - r; s++)
 
3202
        {
 
3203
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
3204
          {
 
3205
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3206
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
3207
          }// end loop over 't'
 
3208
        }// end loop over 's'
 
3209
      }// end loop over 'r'
 
3210
      
 
3211
      // Table(s) of coefficients.
 
3212
      static const double coefficients0[10] = \
 
3213
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
3214
      
 
3215
      // Tables of derivatives of the polynomial base (transpose).
 
3216
      static const double dmats0[10][10] = \
 
3217
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3218
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3219
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3220
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3221
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3222
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3223
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3224
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3225
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3226
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3227
      
 
3228
      static const double dmats1[10][10] = \
 
3229
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3230
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3231
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3232
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3233
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3234
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3235
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3236
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3237
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3238
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3239
      
 
3240
      static const double dmats2[10][10] = \
 
3241
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3242
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3243
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3244
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3245
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3246
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3247
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3248
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3249
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3250
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3251
      
 
3252
      // Compute reference derivatives.
 
3253
      // Declare pointer to array of derivatives on FIAT element.
 
3254
      double *derivatives = new double[num_derivatives];
 
3255
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3256
      {
 
3257
        derivatives[r] = 0.000000000000000;
 
3258
      }// end loop over 'r'
 
3259
      
 
3260
      // Declare derivative matrix (of polynomial basis).
 
3261
      double dmats[10][10] = \
 
3262
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3263
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3264
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3265
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3266
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3267
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3268
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3269
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3270
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3271
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3272
      
 
3273
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3274
      double dmats_old[10][10] = \
 
3275
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3276
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3277
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3278
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3279
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3280
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3281
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3282
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3283
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3284
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3285
      
 
3286
      // Loop possible derivatives.
 
3287
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3288
      {
 
3289
        // Resetting dmats values to compute next derivative.
 
3290
        for (unsigned int t = 0; t < 10; t++)
 
3291
        {
 
3292
          for (unsigned int u = 0; u < 10; u++)
 
3293
          {
 
3294
            dmats[t][u] = 0.000000000000000;
 
3295
            if (t == u)
 
3296
            {
 
3297
            dmats[t][u] = 1.000000000000000;
 
3298
            }
 
3299
            
 
3300
          }// end loop over 'u'
 
3301
        }// end loop over 't'
 
3302
        
 
3303
        // Looping derivative order to generate dmats.
 
3304
        for (unsigned int s = 0; s < n; s++)
 
3305
        {
 
3306
          // Updating dmats_old with new values and resetting dmats.
 
3307
          for (unsigned int t = 0; t < 10; t++)
 
3308
          {
 
3309
            for (unsigned int u = 0; u < 10; u++)
 
3310
            {
 
3311
              dmats_old[t][u] = dmats[t][u];
 
3312
              dmats[t][u] = 0.000000000000000;
 
3313
            }// end loop over 'u'
 
3314
          }// end loop over 't'
 
3315
          
 
3316
          // Update dmats using an inner product.
 
3317
          if (combinations[r][s] == 0)
 
3318
          {
 
3319
          for (unsigned int t = 0; t < 10; t++)
 
3320
          {
 
3321
            for (unsigned int u = 0; u < 10; u++)
 
3322
            {
 
3323
              for (unsigned int tu = 0; tu < 10; tu++)
 
3324
              {
 
3325
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3326
              }// end loop over 'tu'
 
3327
            }// end loop over 'u'
 
3328
          }// end loop over 't'
 
3329
          }
 
3330
          
 
3331
          if (combinations[r][s] == 1)
 
3332
          {
 
3333
          for (unsigned int t = 0; t < 10; t++)
 
3334
          {
 
3335
            for (unsigned int u = 0; u < 10; u++)
 
3336
            {
 
3337
              for (unsigned int tu = 0; tu < 10; tu++)
 
3338
              {
 
3339
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3340
              }// end loop over 'tu'
 
3341
            }// end loop over 'u'
 
3342
          }// end loop over 't'
 
3343
          }
 
3344
          
 
3345
          if (combinations[r][s] == 2)
 
3346
          {
 
3347
          for (unsigned int t = 0; t < 10; t++)
 
3348
          {
 
3349
            for (unsigned int u = 0; u < 10; u++)
 
3350
            {
 
3351
              for (unsigned int tu = 0; tu < 10; tu++)
 
3352
              {
 
3353
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3354
              }// end loop over 'tu'
 
3355
            }// end loop over 'u'
 
3356
          }// end loop over 't'
 
3357
          }
 
3358
          
 
3359
        }// end loop over 's'
 
3360
        for (unsigned int s = 0; s < 10; s++)
 
3361
        {
 
3362
          for (unsigned int t = 0; t < 10; t++)
 
3363
          {
 
3364
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3365
          }// end loop over 't'
 
3366
        }// end loop over 's'
 
3367
      }// end loop over 'r'
 
3368
      
 
3369
      // Transform derivatives back to physical element
 
3370
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3371
      {
 
3372
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3373
        {
 
3374
          values[r] += transform[r][s]*derivatives[s];
 
3375
        }// end loop over 's'
 
3376
      }// end loop over 'r'
 
3377
      
 
3378
      // Delete pointer to array of derivatives on FIAT element
 
3379
      delete [] derivatives;
 
3380
      
 
3381
      // Delete pointer to array of combinations of derivatives and transform
 
3382
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3383
      {
 
3384
        delete [] combinations[r];
 
3385
      }// end loop over 'r'
 
3386
      delete [] combinations;
 
3387
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3388
      {
 
3389
        delete [] transform[r];
 
3390
      }// end loop over 'r'
 
3391
      delete [] transform;
 
3392
        break;
 
3393
      }
 
3394
    case 8:
 
3395
      {
 
3396
        
 
3397
      // Array of basisvalues.
 
3398
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
3399
      
 
3400
      // Declare helper variables.
 
3401
      unsigned int rr = 0;
 
3402
      unsigned int ss = 0;
 
3403
      unsigned int tt = 0;
 
3404
      double tmp5 = 0.000000000000000;
 
3405
      double tmp6 = 0.000000000000000;
 
3406
      double tmp7 = 0.000000000000000;
 
3407
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
3408
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
3409
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
3410
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
3411
      double tmp4 = tmp3*tmp3;
 
3412
      
 
3413
      // Compute basisvalues.
 
3414
      basisvalues[0] = 1.000000000000000;
 
3415
      basisvalues[1] = tmp0;
 
3416
      for (unsigned int r = 1; r < 2; r++)
 
3417
      {
 
3418
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
3419
        ss = r*(r + 1)*(r + 2)/6;
 
3420
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
3421
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
3422
      }// end loop over 'r'
 
3423
      for (unsigned int r = 0; r < 2; r++)
 
3424
      {
 
3425
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
3426
        ss = r*(r + 1)*(r + 2)/6;
 
3427
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
3428
      }// end loop over 'r'
 
3429
      for (unsigned int r = 0; r < 1; r++)
 
3430
      {
 
3431
        for (unsigned int s = 1; s < 2 - r; s++)
 
3432
        {
 
3433
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
3434
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3435
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
3436
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3437
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3438
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3439
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
3440
        }// end loop over 's'
 
3441
      }// end loop over 'r'
 
3442
      for (unsigned int r = 0; r < 2; r++)
 
3443
      {
 
3444
        for (unsigned int s = 0; s < 2 - r; s++)
 
3445
        {
 
3446
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
3447
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3448
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
3449
        }// end loop over 's'
 
3450
      }// end loop over 'r'
 
3451
      for (unsigned int r = 0; r < 1; r++)
 
3452
      {
 
3453
        for (unsigned int s = 0; s < 1 - r; s++)
 
3454
        {
 
3455
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
3456
          {
 
3457
            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;
 
3458
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3459
            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;
 
3460
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3461
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3462
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3463
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
3464
          }// end loop over 't'
 
3465
        }// end loop over 's'
 
3466
      }// end loop over 'r'
 
3467
      for (unsigned int r = 0; r < 3; r++)
 
3468
      {
 
3469
        for (unsigned int s = 0; s < 3 - r; s++)
 
3470
        {
 
3471
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
3472
          {
 
3473
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3474
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
3475
          }// end loop over 't'
 
3476
        }// end loop over 's'
 
3477
      }// end loop over 'r'
 
3478
      
 
3479
      // Table(s) of coefficients.
 
3480
      static const double coefficients0[10] = \
 
3481
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
3482
      
 
3483
      // Tables of derivatives of the polynomial base (transpose).
 
3484
      static const double dmats0[10][10] = \
 
3485
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3486
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3487
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3488
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3489
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3490
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3491
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3492
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3493
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3494
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3495
      
 
3496
      static const double dmats1[10][10] = \
 
3497
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3498
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3499
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3500
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3501
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3502
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3503
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3504
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3505
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3506
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3507
      
 
3508
      static const double dmats2[10][10] = \
 
3509
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3510
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3511
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3512
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3513
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3514
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3515
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3516
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3517
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3518
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3519
      
 
3520
      // Compute reference derivatives.
 
3521
      // Declare pointer to array of derivatives on FIAT element.
 
3522
      double *derivatives = new double[num_derivatives];
 
3523
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3524
      {
 
3525
        derivatives[r] = 0.000000000000000;
 
3526
      }// end loop over 'r'
 
3527
      
 
3528
      // Declare derivative matrix (of polynomial basis).
 
3529
      double dmats[10][10] = \
 
3530
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3531
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3532
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3533
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3534
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3535
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3536
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3537
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3538
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3539
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3540
      
 
3541
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3542
      double dmats_old[10][10] = \
 
3543
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3544
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3545
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3546
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3547
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3548
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3549
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3550
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3551
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3552
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3553
      
 
3554
      // Loop possible derivatives.
 
3555
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3556
      {
 
3557
        // Resetting dmats values to compute next derivative.
 
3558
        for (unsigned int t = 0; t < 10; t++)
 
3559
        {
 
3560
          for (unsigned int u = 0; u < 10; u++)
 
3561
          {
 
3562
            dmats[t][u] = 0.000000000000000;
 
3563
            if (t == u)
 
3564
            {
 
3565
            dmats[t][u] = 1.000000000000000;
 
3566
            }
 
3567
            
 
3568
          }// end loop over 'u'
 
3569
        }// end loop over 't'
 
3570
        
 
3571
        // Looping derivative order to generate dmats.
 
3572
        for (unsigned int s = 0; s < n; s++)
 
3573
        {
 
3574
          // Updating dmats_old with new values and resetting dmats.
 
3575
          for (unsigned int t = 0; t < 10; t++)
 
3576
          {
 
3577
            for (unsigned int u = 0; u < 10; u++)
 
3578
            {
 
3579
              dmats_old[t][u] = dmats[t][u];
 
3580
              dmats[t][u] = 0.000000000000000;
 
3581
            }// end loop over 'u'
 
3582
          }// end loop over 't'
 
3583
          
 
3584
          // Update dmats using an inner product.
 
3585
          if (combinations[r][s] == 0)
 
3586
          {
 
3587
          for (unsigned int t = 0; t < 10; t++)
 
3588
          {
 
3589
            for (unsigned int u = 0; u < 10; u++)
 
3590
            {
 
3591
              for (unsigned int tu = 0; tu < 10; tu++)
 
3592
              {
 
3593
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3594
              }// end loop over 'tu'
 
3595
            }// end loop over 'u'
 
3596
          }// end loop over 't'
 
3597
          }
 
3598
          
 
3599
          if (combinations[r][s] == 1)
 
3600
          {
 
3601
          for (unsigned int t = 0; t < 10; t++)
 
3602
          {
 
3603
            for (unsigned int u = 0; u < 10; u++)
 
3604
            {
 
3605
              for (unsigned int tu = 0; tu < 10; tu++)
 
3606
              {
 
3607
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3608
              }// end loop over 'tu'
 
3609
            }// end loop over 'u'
 
3610
          }// end loop over 't'
 
3611
          }
 
3612
          
 
3613
          if (combinations[r][s] == 2)
 
3614
          {
 
3615
          for (unsigned int t = 0; t < 10; t++)
 
3616
          {
 
3617
            for (unsigned int u = 0; u < 10; u++)
 
3618
            {
 
3619
              for (unsigned int tu = 0; tu < 10; tu++)
 
3620
              {
 
3621
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3622
              }// end loop over 'tu'
 
3623
            }// end loop over 'u'
 
3624
          }// end loop over 't'
 
3625
          }
 
3626
          
 
3627
        }// end loop over 's'
 
3628
        for (unsigned int s = 0; s < 10; s++)
 
3629
        {
 
3630
          for (unsigned int t = 0; t < 10; t++)
 
3631
          {
 
3632
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3633
          }// end loop over 't'
 
3634
        }// end loop over 's'
 
3635
      }// end loop over 'r'
 
3636
      
 
3637
      // Transform derivatives back to physical element
 
3638
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3639
      {
 
3640
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3641
        {
 
3642
          values[r] += transform[r][s]*derivatives[s];
 
3643
        }// end loop over 's'
 
3644
      }// end loop over 'r'
 
3645
      
 
3646
      // Delete pointer to array of derivatives on FIAT element
 
3647
      delete [] derivatives;
 
3648
      
 
3649
      // Delete pointer to array of combinations of derivatives and transform
 
3650
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3651
      {
 
3652
        delete [] combinations[r];
 
3653
      }// end loop over 'r'
 
3654
      delete [] combinations;
 
3655
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3656
      {
 
3657
        delete [] transform[r];
 
3658
      }// end loop over 'r'
 
3659
      delete [] transform;
 
3660
        break;
 
3661
      }
 
3662
    case 9:
 
3663
      {
 
3664
        
 
3665
      // Array of basisvalues.
 
3666
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
3667
      
 
3668
      // Declare helper variables.
 
3669
      unsigned int rr = 0;
 
3670
      unsigned int ss = 0;
 
3671
      unsigned int tt = 0;
 
3672
      double tmp5 = 0.000000000000000;
 
3673
      double tmp6 = 0.000000000000000;
 
3674
      double tmp7 = 0.000000000000000;
 
3675
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
3676
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
3677
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
3678
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
3679
      double tmp4 = tmp3*tmp3;
 
3680
      
 
3681
      // Compute basisvalues.
 
3682
      basisvalues[0] = 1.000000000000000;
 
3683
      basisvalues[1] = tmp0;
 
3684
      for (unsigned int r = 1; r < 2; r++)
 
3685
      {
 
3686
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
3687
        ss = r*(r + 1)*(r + 2)/6;
 
3688
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
3689
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
3690
      }// end loop over 'r'
 
3691
      for (unsigned int r = 0; r < 2; r++)
 
3692
      {
 
3693
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
3694
        ss = r*(r + 1)*(r + 2)/6;
 
3695
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
3696
      }// end loop over 'r'
 
3697
      for (unsigned int r = 0; r < 1; r++)
 
3698
      {
 
3699
        for (unsigned int s = 1; s < 2 - r; s++)
 
3700
        {
 
3701
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
3702
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3703
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
3704
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3705
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3706
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
3707
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
3708
        }// end loop over 's'
 
3709
      }// end loop over 'r'
 
3710
      for (unsigned int r = 0; r < 2; r++)
 
3711
      {
 
3712
        for (unsigned int s = 0; s < 2 - r; s++)
 
3713
        {
 
3714
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
3715
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
3716
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
3717
        }// end loop over 's'
 
3718
      }// end loop over 'r'
 
3719
      for (unsigned int r = 0; r < 1; r++)
 
3720
      {
 
3721
        for (unsigned int s = 0; s < 1 - r; s++)
 
3722
        {
 
3723
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
3724
          {
 
3725
            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;
 
3726
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3727
            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;
 
3728
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3729
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3730
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
3731
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
3732
          }// end loop over 't'
 
3733
        }// end loop over 's'
 
3734
      }// end loop over 'r'
 
3735
      for (unsigned int r = 0; r < 3; r++)
 
3736
      {
 
3737
        for (unsigned int s = 0; s < 3 - r; s++)
 
3738
        {
 
3739
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
3740
          {
 
3741
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
3742
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
3743
          }// end loop over 't'
 
3744
        }// end loop over 's'
 
3745
      }// end loop over 'r'
 
3746
      
 
3747
      // Table(s) of coefficients.
 
3748
      static const double coefficients0[10] = \
 
3749
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
3750
      
 
3751
      // Tables of derivatives of the polynomial base (transpose).
 
3752
      static const double dmats0[10][10] = \
 
3753
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3754
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3755
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3756
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3757
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3758
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3759
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3760
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3761
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3762
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3763
      
 
3764
      static const double dmats1[10][10] = \
 
3765
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3766
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3767
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3768
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3769
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3770
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3771
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3772
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3773
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3774
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3775
      
 
3776
      static const double dmats2[10][10] = \
 
3777
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3778
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3779
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3780
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3781
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3782
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3783
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3784
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3785
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3786
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
3787
      
 
3788
      // Compute reference derivatives.
 
3789
      // Declare pointer to array of derivatives on FIAT element.
 
3790
      double *derivatives = new double[num_derivatives];
 
3791
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3792
      {
 
3793
        derivatives[r] = 0.000000000000000;
 
3794
      }// end loop over 'r'
 
3795
      
 
3796
      // Declare derivative matrix (of polynomial basis).
 
3797
      double dmats[10][10] = \
 
3798
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3799
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3800
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3801
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3802
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3803
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3804
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3805
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3806
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3807
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3808
      
 
3809
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
3810
      double dmats_old[10][10] = \
 
3811
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3812
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3813
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3814
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3815
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3816
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3817
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
3818
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
3819
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
3820
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
3821
      
 
3822
      // Loop possible derivatives.
 
3823
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3824
      {
 
3825
        // Resetting dmats values to compute next derivative.
 
3826
        for (unsigned int t = 0; t < 10; t++)
 
3827
        {
 
3828
          for (unsigned int u = 0; u < 10; u++)
 
3829
          {
 
3830
            dmats[t][u] = 0.000000000000000;
 
3831
            if (t == u)
 
3832
            {
 
3833
            dmats[t][u] = 1.000000000000000;
 
3834
            }
 
3835
            
 
3836
          }// end loop over 'u'
 
3837
        }// end loop over 't'
 
3838
        
 
3839
        // Looping derivative order to generate dmats.
 
3840
        for (unsigned int s = 0; s < n; s++)
 
3841
        {
 
3842
          // Updating dmats_old with new values and resetting dmats.
 
3843
          for (unsigned int t = 0; t < 10; t++)
 
3844
          {
 
3845
            for (unsigned int u = 0; u < 10; u++)
 
3846
            {
 
3847
              dmats_old[t][u] = dmats[t][u];
 
3848
              dmats[t][u] = 0.000000000000000;
 
3849
            }// end loop over 'u'
 
3850
          }// end loop over 't'
 
3851
          
 
3852
          // Update dmats using an inner product.
 
3853
          if (combinations[r][s] == 0)
 
3854
          {
 
3855
          for (unsigned int t = 0; t < 10; t++)
 
3856
          {
 
3857
            for (unsigned int u = 0; u < 10; u++)
 
3858
            {
 
3859
              for (unsigned int tu = 0; tu < 10; tu++)
 
3860
              {
 
3861
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
3862
              }// end loop over 'tu'
 
3863
            }// end loop over 'u'
 
3864
          }// end loop over 't'
 
3865
          }
 
3866
          
 
3867
          if (combinations[r][s] == 1)
 
3868
          {
 
3869
          for (unsigned int t = 0; t < 10; t++)
 
3870
          {
 
3871
            for (unsigned int u = 0; u < 10; u++)
 
3872
            {
 
3873
              for (unsigned int tu = 0; tu < 10; tu++)
 
3874
              {
 
3875
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
3876
              }// end loop over 'tu'
 
3877
            }// end loop over 'u'
 
3878
          }// end loop over 't'
 
3879
          }
 
3880
          
 
3881
          if (combinations[r][s] == 2)
 
3882
          {
 
3883
          for (unsigned int t = 0; t < 10; t++)
 
3884
          {
 
3885
            for (unsigned int u = 0; u < 10; u++)
 
3886
            {
 
3887
              for (unsigned int tu = 0; tu < 10; tu++)
 
3888
              {
 
3889
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
3890
              }// end loop over 'tu'
 
3891
            }// end loop over 'u'
 
3892
          }// end loop over 't'
 
3893
          }
 
3894
          
 
3895
        }// end loop over 's'
 
3896
        for (unsigned int s = 0; s < 10; s++)
 
3897
        {
 
3898
          for (unsigned int t = 0; t < 10; t++)
 
3899
          {
 
3900
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
3901
          }// end loop over 't'
 
3902
        }// end loop over 's'
 
3903
      }// end loop over 'r'
 
3904
      
 
3905
      // Transform derivatives back to physical element
 
3906
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3907
      {
 
3908
        for (unsigned int s = 0; s < num_derivatives; s++)
 
3909
        {
 
3910
          values[r] += transform[r][s]*derivatives[s];
 
3911
        }// end loop over 's'
 
3912
      }// end loop over 'r'
 
3913
      
 
3914
      // Delete pointer to array of derivatives on FIAT element
 
3915
      delete [] derivatives;
 
3916
      
 
3917
      // Delete pointer to array of combinations of derivatives and transform
 
3918
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3919
      {
 
3920
        delete [] combinations[r];
 
3921
      }// end loop over 'r'
 
3922
      delete [] combinations;
 
3923
      for (unsigned int r = 0; r < num_derivatives; r++)
 
3924
      {
 
3925
        delete [] transform[r];
 
3926
      }// end loop over 'r'
 
3927
      delete [] transform;
 
3928
        break;
 
3929
      }
 
3930
    }
 
3931
    
 
3932
  }
 
3933
 
 
3934
  /// Evaluate order n derivatives of all basis functions at given point in cell
 
3935
  virtual void evaluate_basis_derivatives_all(unsigned int n,
 
3936
                                              double* values,
 
3937
                                              const double* coordinates,
 
3938
                                              const ufc::cell& c) const
 
3939
  {
 
3940
    // Compute number of derivatives.
 
3941
    unsigned int num_derivatives = 1;
 
3942
    for (unsigned int r = 0; r < n; r++)
 
3943
    {
 
3944
      num_derivatives *= 3;
 
3945
    }// end loop over 'r'
 
3946
    
 
3947
    // Helper variable to hold values of a single dof.
 
3948
    double *dof_values = new double[num_derivatives];
 
3949
    for (unsigned int r = 0; r < num_derivatives; r++)
 
3950
    {
 
3951
      dof_values[r] = 0.000000000000000;
 
3952
    }// end loop over 'r'
 
3953
    
 
3954
    // Loop dofs and call evaluate_basis_derivatives.
 
3955
    for (unsigned int r = 0; r < 10; r++)
 
3956
    {
 
3957
      evaluate_basis_derivatives(r, n, dof_values, coordinates, c);
 
3958
      for (unsigned int s = 0; s < num_derivatives; s++)
 
3959
      {
 
3960
        values[r*num_derivatives + s] = dof_values[s];
 
3961
      }// end loop over 's'
 
3962
    }// end loop over 'r'
 
3963
    
 
3964
    // Delete pointer.
 
3965
    delete [] dof_values;
 
3966
  }
 
3967
 
 
3968
  /// Evaluate linear functional for dof i on the function f
 
3969
  virtual double evaluate_dof(unsigned int i,
 
3970
                              const ufc::function& f,
 
3971
                              const ufc::cell& c) const
 
3972
  {
 
3973
    // Declare variables for result of evaluation.
 
3974
    double vals[1];
 
3975
    
 
3976
    // Declare variable for physical coordinates.
 
3977
    double y[3];
 
3978
    const double * const * x = c.coordinates;
 
3979
    switch (i)
 
3980
    {
 
3981
    case 0:
 
3982
      {
 
3983
        y[0] = x[0][0];
 
3984
      y[1] = x[0][1];
 
3985
      y[2] = x[0][2];
 
3986
      f.evaluate(vals, y, c);
 
3987
      return vals[0];
 
3988
        break;
 
3989
      }
 
3990
    case 1:
 
3991
      {
 
3992
        y[0] = x[1][0];
 
3993
      y[1] = x[1][1];
 
3994
      y[2] = x[1][2];
 
3995
      f.evaluate(vals, y, c);
 
3996
      return vals[0];
 
3997
        break;
 
3998
      }
 
3999
    case 2:
 
4000
      {
 
4001
        y[0] = x[2][0];
 
4002
      y[1] = x[2][1];
 
4003
      y[2] = x[2][2];
 
4004
      f.evaluate(vals, y, c);
 
4005
      return vals[0];
 
4006
        break;
 
4007
      }
 
4008
    case 3:
 
4009
      {
 
4010
        y[0] = x[3][0];
 
4011
      y[1] = x[3][1];
 
4012
      y[2] = x[3][2];
 
4013
      f.evaluate(vals, y, c);
 
4014
      return vals[0];
 
4015
        break;
 
4016
      }
 
4017
    case 4:
 
4018
      {
 
4019
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
4020
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
4021
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
4022
      f.evaluate(vals, y, c);
 
4023
      return vals[0];
 
4024
        break;
 
4025
      }
 
4026
    case 5:
 
4027
      {
 
4028
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
4029
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
4030
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
4031
      f.evaluate(vals, y, c);
 
4032
      return vals[0];
 
4033
        break;
 
4034
      }
 
4035
    case 6:
 
4036
      {
 
4037
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
4038
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
4039
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
4040
      f.evaluate(vals, y, c);
 
4041
      return vals[0];
 
4042
        break;
 
4043
      }
 
4044
    case 7:
 
4045
      {
 
4046
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
4047
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
4048
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
4049
      f.evaluate(vals, y, c);
 
4050
      return vals[0];
 
4051
        break;
 
4052
      }
 
4053
    case 8:
 
4054
      {
 
4055
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
4056
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
4057
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
4058
      f.evaluate(vals, y, c);
 
4059
      return vals[0];
 
4060
        break;
 
4061
      }
 
4062
    case 9:
 
4063
      {
 
4064
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
4065
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
4066
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
4067
      f.evaluate(vals, y, c);
 
4068
      return vals[0];
 
4069
        break;
 
4070
      }
 
4071
    }
 
4072
    
 
4073
    return 0.000000000000000;
 
4074
  }
 
4075
 
 
4076
  /// Evaluate linear functionals for all dofs on the function f
 
4077
  virtual void evaluate_dofs(double* values,
 
4078
                             const ufc::function& f,
 
4079
                             const ufc::cell& c) const
 
4080
  {
 
4081
    // Declare variables for result of evaluation.
 
4082
    double vals[1];
 
4083
    
 
4084
    // Declare variable for physical coordinates.
 
4085
    double y[3];
 
4086
    const double * const * x = c.coordinates;
 
4087
    y[0] = x[0][0];
 
4088
    y[1] = x[0][1];
 
4089
    y[2] = x[0][2];
 
4090
    f.evaluate(vals, y, c);
 
4091
    values[0] = vals[0];
 
4092
    y[0] = x[1][0];
 
4093
    y[1] = x[1][1];
 
4094
    y[2] = x[1][2];
 
4095
    f.evaluate(vals, y, c);
 
4096
    values[1] = vals[0];
 
4097
    y[0] = x[2][0];
 
4098
    y[1] = x[2][1];
 
4099
    y[2] = x[2][2];
 
4100
    f.evaluate(vals, y, c);
 
4101
    values[2] = vals[0];
 
4102
    y[0] = x[3][0];
 
4103
    y[1] = x[3][1];
 
4104
    y[2] = x[3][2];
 
4105
    f.evaluate(vals, y, c);
 
4106
    values[3] = vals[0];
 
4107
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
4108
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
4109
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
4110
    f.evaluate(vals, y, c);
 
4111
    values[4] = vals[0];
 
4112
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
4113
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
4114
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
4115
    f.evaluate(vals, y, c);
 
4116
    values[5] = vals[0];
 
4117
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
4118
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
4119
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
4120
    f.evaluate(vals, y, c);
 
4121
    values[6] = vals[0];
 
4122
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
4123
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
4124
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
4125
    f.evaluate(vals, y, c);
 
4126
    values[7] = vals[0];
 
4127
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
4128
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
4129
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
4130
    f.evaluate(vals, y, c);
 
4131
    values[8] = vals[0];
 
4132
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
4133
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
4134
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
4135
    f.evaluate(vals, y, c);
 
4136
    values[9] = vals[0];
 
4137
  }
 
4138
 
 
4139
  /// Interpolate vertex values from dof values
 
4140
  virtual void interpolate_vertex_values(double* vertex_values,
 
4141
                                         const double* dof_values,
 
4142
                                         const ufc::cell& c) const
 
4143
  {
 
4144
    // Evaluate function and change variables
 
4145
    vertex_values[0] = dof_values[0];
 
4146
    vertex_values[1] = dof_values[1];
 
4147
    vertex_values[2] = dof_values[2];
 
4148
    vertex_values[3] = dof_values[3];
 
4149
  }
 
4150
 
 
4151
  /// Map coordinate xhat from reference cell to coordinate x in cell
 
4152
  virtual void map_from_reference_cell(double* x,
 
4153
                                       const double* xhat,
 
4154
                                       const ufc::cell& c)
 
4155
  {
 
4156
    throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0).");
 
4157
  }
 
4158
 
 
4159
  /// Map from coordinate x in cell to coordinate xhat in reference cell
 
4160
  virtual void map_to_reference_cell(double* xhat,
 
4161
                                     const double* x,
 
4162
                                     const ufc::cell& c)
 
4163
  {
 
4164
    throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0).");
 
4165
  }
 
4166
 
 
4167
  /// Return the number of sub elements (for a mixed element)
 
4168
  virtual unsigned int num_sub_elements() const
 
4169
  {
 
4170
    return 0;
 
4171
  }
 
4172
 
 
4173
  /// Create a new finite element for sub element i (for a mixed element)
 
4174
  virtual ufc::finite_element* create_sub_element(unsigned int i) const
 
4175
  {
 
4176
    return 0;
 
4177
  }
 
4178
 
 
4179
  /// Create a new class instance
 
4180
  virtual ufc::finite_element* create() const
 
4181
  {
 
4182
    return new stokes_finite_element_0();
 
4183
  }
 
4184
 
 
4185
};
 
4186
 
 
4187
/// This class defines the interface for a finite element.
 
4188
 
 
4189
class stokes_finite_element_1: public ufc::finite_element
 
4190
{
 
4191
public:
 
4192
 
 
4193
  /// Constructor
 
4194
  stokes_finite_element_1() : ufc::finite_element()
 
4195
  {
 
4196
    // Do nothing
 
4197
  }
 
4198
 
 
4199
  /// Destructor
 
4200
  virtual ~stokes_finite_element_1()
 
4201
  {
 
4202
    // Do nothing
 
4203
  }
 
4204
 
 
4205
  /// Return a string identifying the finite element
 
4206
  virtual const char* signature() const
 
4207
  {
 
4208
    return "VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3)";
 
4209
  }
 
4210
 
 
4211
  /// Return the cell shape
 
4212
  virtual ufc::shape cell_shape() const
 
4213
  {
 
4214
    return ufc::tetrahedron;
 
4215
  }
 
4216
 
 
4217
  /// Return the topological dimension of the cell shape
 
4218
  virtual unsigned int topological_dimension() const
 
4219
  {
 
4220
    return 3;
 
4221
  }
 
4222
 
 
4223
  /// Return the geometric dimension of the cell shape
 
4224
  virtual unsigned int geometric_dimension() const
 
4225
  {
 
4226
    return 3;
 
4227
  }
 
4228
 
 
4229
  /// Return the dimension of the finite element function space
 
4230
  virtual unsigned int space_dimension() const
 
4231
  {
 
4232
    return 30;
 
4233
  }
 
4234
 
 
4235
  /// Return the rank of the value space
 
4236
  virtual unsigned int value_rank() const
 
4237
  {
 
4238
    return 1;
 
4239
  }
 
4240
 
 
4241
  /// Return the dimension of the value space for axis i
 
4242
  virtual unsigned int value_dimension(unsigned int i) const
 
4243
  {
 
4244
    switch (i)
 
4245
    {
 
4246
    case 0:
 
4247
      {
 
4248
        return 3;
 
4249
        break;
 
4250
      }
 
4251
    }
 
4252
    
 
4253
    return 0;
 
4254
  }
 
4255
 
 
4256
  /// Evaluate basis function i at given point in cell
 
4257
  virtual void evaluate_basis(unsigned int i,
 
4258
                              double* values,
 
4259
                              const double* coordinates,
 
4260
                              const ufc::cell& c) const
 
4261
  {
 
4262
    // Extract vertex coordinates
 
4263
    const double * const * x = c.coordinates;
 
4264
    
 
4265
    // Compute Jacobian of affine map from reference cell
 
4266
    const double J_00 = x[1][0] - x[0][0];
 
4267
    const double J_01 = x[2][0] - x[0][0];
 
4268
    const double J_02 = x[3][0] - x[0][0];
 
4269
    const double J_10 = x[1][1] - x[0][1];
 
4270
    const double J_11 = x[2][1] - x[0][1];
 
4271
    const double J_12 = x[3][1] - x[0][1];
 
4272
    const double J_20 = x[1][2] - x[0][2];
 
4273
    const double J_21 = x[2][2] - x[0][2];
 
4274
    const double J_22 = x[3][2] - x[0][2];
 
4275
    
 
4276
    // Compute sub determinants
 
4277
    const double d_00 = J_11*J_22 - J_12*J_21;
 
4278
    const double d_01 = J_12*J_20 - J_10*J_22;
 
4279
    const double d_02 = J_10*J_21 - J_11*J_20;
 
4280
    const double d_10 = J_02*J_21 - J_01*J_22;
 
4281
    const double d_11 = J_00*J_22 - J_02*J_20;
 
4282
    const double d_12 = J_01*J_20 - J_00*J_21;
 
4283
    const double d_20 = J_01*J_12 - J_02*J_11;
 
4284
    const double d_21 = J_02*J_10 - J_00*J_12;
 
4285
    const double d_22 = J_00*J_11 - J_01*J_10;
 
4286
    
 
4287
    // Compute determinant of Jacobian
 
4288
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
4289
    
 
4290
    // Compute inverse of Jacobian
 
4291
    
 
4292
    // Compute constants
 
4293
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
4294
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
4295
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
4296
    
 
4297
    // Get coordinates and map to the reference (FIAT) element
 
4298
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
4299
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
4300
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
4301
    
 
4302
    
 
4303
    // Reset values.
 
4304
    values[0] = 0.000000000000000;
 
4305
    values[1] = 0.000000000000000;
 
4306
    values[2] = 0.000000000000000;
 
4307
    switch (i)
 
4308
    {
 
4309
    case 0:
 
4310
      {
 
4311
        
 
4312
      // Array of basisvalues.
 
4313
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4314
      
 
4315
      // Declare helper variables.
 
4316
      unsigned int rr = 0;
 
4317
      unsigned int ss = 0;
 
4318
      unsigned int tt = 0;
 
4319
      double tmp5 = 0.000000000000000;
 
4320
      double tmp6 = 0.000000000000000;
 
4321
      double tmp7 = 0.000000000000000;
 
4322
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4323
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4324
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4325
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4326
      double tmp4 = tmp3*tmp3;
 
4327
      
 
4328
      // Compute basisvalues.
 
4329
      basisvalues[0] = 1.000000000000000;
 
4330
      basisvalues[1] = tmp0;
 
4331
      for (unsigned int r = 1; r < 2; r++)
 
4332
      {
 
4333
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4334
        ss = r*(r + 1)*(r + 2)/6;
 
4335
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4336
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4337
      }// end loop over 'r'
 
4338
      for (unsigned int r = 0; r < 2; r++)
 
4339
      {
 
4340
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4341
        ss = r*(r + 1)*(r + 2)/6;
 
4342
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4343
      }// end loop over 'r'
 
4344
      for (unsigned int r = 0; r < 1; r++)
 
4345
      {
 
4346
        for (unsigned int s = 1; s < 2 - r; s++)
 
4347
        {
 
4348
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4349
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4350
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4351
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4352
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4353
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4354
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4355
        }// end loop over 's'
 
4356
      }// end loop over 'r'
 
4357
      for (unsigned int r = 0; r < 2; r++)
 
4358
      {
 
4359
        for (unsigned int s = 0; s < 2 - r; s++)
 
4360
        {
 
4361
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4362
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4363
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4364
        }// end loop over 's'
 
4365
      }// end loop over 'r'
 
4366
      for (unsigned int r = 0; r < 1; r++)
 
4367
      {
 
4368
        for (unsigned int s = 0; s < 1 - r; s++)
 
4369
        {
 
4370
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4371
          {
 
4372
            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;
 
4373
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4374
            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;
 
4375
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4376
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4377
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4378
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4379
          }// end loop over 't'
 
4380
        }// end loop over 's'
 
4381
      }// end loop over 'r'
 
4382
      for (unsigned int r = 0; r < 3; r++)
 
4383
      {
 
4384
        for (unsigned int s = 0; s < 3 - r; s++)
 
4385
        {
 
4386
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4387
          {
 
4388
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4389
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4390
          }// end loop over 't'
 
4391
        }// end loop over 's'
 
4392
      }// end loop over 'r'
 
4393
      
 
4394
      // Table(s) of coefficients.
 
4395
      static const double coefficients0[10] = \
 
4396
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
4397
      
 
4398
      // Compute value(s).
 
4399
      for (unsigned int r = 0; r < 10; r++)
 
4400
      {
 
4401
        values[0] += coefficients0[r]*basisvalues[r];
 
4402
      }// end loop over 'r'
 
4403
        break;
 
4404
      }
 
4405
    case 1:
 
4406
      {
 
4407
        
 
4408
      // Array of basisvalues.
 
4409
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4410
      
 
4411
      // Declare helper variables.
 
4412
      unsigned int rr = 0;
 
4413
      unsigned int ss = 0;
 
4414
      unsigned int tt = 0;
 
4415
      double tmp5 = 0.000000000000000;
 
4416
      double tmp6 = 0.000000000000000;
 
4417
      double tmp7 = 0.000000000000000;
 
4418
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4419
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4420
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4421
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4422
      double tmp4 = tmp3*tmp3;
 
4423
      
 
4424
      // Compute basisvalues.
 
4425
      basisvalues[0] = 1.000000000000000;
 
4426
      basisvalues[1] = tmp0;
 
4427
      for (unsigned int r = 1; r < 2; r++)
 
4428
      {
 
4429
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4430
        ss = r*(r + 1)*(r + 2)/6;
 
4431
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4432
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4433
      }// end loop over 'r'
 
4434
      for (unsigned int r = 0; r < 2; r++)
 
4435
      {
 
4436
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4437
        ss = r*(r + 1)*(r + 2)/6;
 
4438
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4439
      }// end loop over 'r'
 
4440
      for (unsigned int r = 0; r < 1; r++)
 
4441
      {
 
4442
        for (unsigned int s = 1; s < 2 - r; s++)
 
4443
        {
 
4444
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4445
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4446
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4447
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4448
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4449
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4450
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4451
        }// end loop over 's'
 
4452
      }// end loop over 'r'
 
4453
      for (unsigned int r = 0; r < 2; r++)
 
4454
      {
 
4455
        for (unsigned int s = 0; s < 2 - r; s++)
 
4456
        {
 
4457
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4458
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4459
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4460
        }// end loop over 's'
 
4461
      }// end loop over 'r'
 
4462
      for (unsigned int r = 0; r < 1; r++)
 
4463
      {
 
4464
        for (unsigned int s = 0; s < 1 - r; s++)
 
4465
        {
 
4466
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4467
          {
 
4468
            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;
 
4469
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4470
            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;
 
4471
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4472
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4473
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4474
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4475
          }// end loop over 't'
 
4476
        }// end loop over 's'
 
4477
      }// end loop over 'r'
 
4478
      for (unsigned int r = 0; r < 3; r++)
 
4479
      {
 
4480
        for (unsigned int s = 0; s < 3 - r; s++)
 
4481
        {
 
4482
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4483
          {
 
4484
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4485
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4486
          }// end loop over 't'
 
4487
        }// end loop over 's'
 
4488
      }// end loop over 'r'
 
4489
      
 
4490
      // Table(s) of coefficients.
 
4491
      static const double coefficients0[10] = \
 
4492
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
4493
      
 
4494
      // Compute value(s).
 
4495
      for (unsigned int r = 0; r < 10; r++)
 
4496
      {
 
4497
        values[0] += coefficients0[r]*basisvalues[r];
 
4498
      }// end loop over 'r'
 
4499
        break;
 
4500
      }
 
4501
    case 2:
 
4502
      {
 
4503
        
 
4504
      // Array of basisvalues.
 
4505
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4506
      
 
4507
      // Declare helper variables.
 
4508
      unsigned int rr = 0;
 
4509
      unsigned int ss = 0;
 
4510
      unsigned int tt = 0;
 
4511
      double tmp5 = 0.000000000000000;
 
4512
      double tmp6 = 0.000000000000000;
 
4513
      double tmp7 = 0.000000000000000;
 
4514
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4515
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4516
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4517
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4518
      double tmp4 = tmp3*tmp3;
 
4519
      
 
4520
      // Compute basisvalues.
 
4521
      basisvalues[0] = 1.000000000000000;
 
4522
      basisvalues[1] = tmp0;
 
4523
      for (unsigned int r = 1; r < 2; r++)
 
4524
      {
 
4525
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4526
        ss = r*(r + 1)*(r + 2)/6;
 
4527
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4528
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4529
      }// end loop over 'r'
 
4530
      for (unsigned int r = 0; r < 2; r++)
 
4531
      {
 
4532
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4533
        ss = r*(r + 1)*(r + 2)/6;
 
4534
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4535
      }// end loop over 'r'
 
4536
      for (unsigned int r = 0; r < 1; r++)
 
4537
      {
 
4538
        for (unsigned int s = 1; s < 2 - r; s++)
 
4539
        {
 
4540
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4541
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4542
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4543
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4544
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4545
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4546
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4547
        }// end loop over 's'
 
4548
      }// end loop over 'r'
 
4549
      for (unsigned int r = 0; r < 2; r++)
 
4550
      {
 
4551
        for (unsigned int s = 0; s < 2 - r; s++)
 
4552
        {
 
4553
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4554
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4555
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4556
        }// end loop over 's'
 
4557
      }// end loop over 'r'
 
4558
      for (unsigned int r = 0; r < 1; r++)
 
4559
      {
 
4560
        for (unsigned int s = 0; s < 1 - r; s++)
 
4561
        {
 
4562
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4563
          {
 
4564
            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;
 
4565
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4566
            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;
 
4567
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4568
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4569
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4570
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4571
          }// end loop over 't'
 
4572
        }// end loop over 's'
 
4573
      }// end loop over 'r'
 
4574
      for (unsigned int r = 0; r < 3; r++)
 
4575
      {
 
4576
        for (unsigned int s = 0; s < 3 - r; s++)
 
4577
        {
 
4578
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4579
          {
 
4580
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4581
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4582
          }// end loop over 't'
 
4583
        }// end loop over 's'
 
4584
      }// end loop over 'r'
 
4585
      
 
4586
      // Table(s) of coefficients.
 
4587
      static const double coefficients0[10] = \
 
4588
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
4589
      
 
4590
      // Compute value(s).
 
4591
      for (unsigned int r = 0; r < 10; r++)
 
4592
      {
 
4593
        values[0] += coefficients0[r]*basisvalues[r];
 
4594
      }// end loop over 'r'
 
4595
        break;
 
4596
      }
 
4597
    case 3:
 
4598
      {
 
4599
        
 
4600
      // Array of basisvalues.
 
4601
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4602
      
 
4603
      // Declare helper variables.
 
4604
      unsigned int rr = 0;
 
4605
      unsigned int ss = 0;
 
4606
      unsigned int tt = 0;
 
4607
      double tmp5 = 0.000000000000000;
 
4608
      double tmp6 = 0.000000000000000;
 
4609
      double tmp7 = 0.000000000000000;
 
4610
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4611
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4612
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4613
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4614
      double tmp4 = tmp3*tmp3;
 
4615
      
 
4616
      // Compute basisvalues.
 
4617
      basisvalues[0] = 1.000000000000000;
 
4618
      basisvalues[1] = tmp0;
 
4619
      for (unsigned int r = 1; r < 2; r++)
 
4620
      {
 
4621
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4622
        ss = r*(r + 1)*(r + 2)/6;
 
4623
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4624
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4625
      }// end loop over 'r'
 
4626
      for (unsigned int r = 0; r < 2; r++)
 
4627
      {
 
4628
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4629
        ss = r*(r + 1)*(r + 2)/6;
 
4630
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4631
      }// end loop over 'r'
 
4632
      for (unsigned int r = 0; r < 1; r++)
 
4633
      {
 
4634
        for (unsigned int s = 1; s < 2 - r; s++)
 
4635
        {
 
4636
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4637
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4638
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4639
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4640
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4641
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4642
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4643
        }// end loop over 's'
 
4644
      }// end loop over 'r'
 
4645
      for (unsigned int r = 0; r < 2; r++)
 
4646
      {
 
4647
        for (unsigned int s = 0; s < 2 - r; s++)
 
4648
        {
 
4649
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4650
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4651
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4652
        }// end loop over 's'
 
4653
      }// end loop over 'r'
 
4654
      for (unsigned int r = 0; r < 1; r++)
 
4655
      {
 
4656
        for (unsigned int s = 0; s < 1 - r; s++)
 
4657
        {
 
4658
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4659
          {
 
4660
            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;
 
4661
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4662
            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;
 
4663
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4664
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4665
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4666
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4667
          }// end loop over 't'
 
4668
        }// end loop over 's'
 
4669
      }// end loop over 'r'
 
4670
      for (unsigned int r = 0; r < 3; r++)
 
4671
      {
 
4672
        for (unsigned int s = 0; s < 3 - r; s++)
 
4673
        {
 
4674
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4675
          {
 
4676
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4677
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4678
          }// end loop over 't'
 
4679
        }// end loop over 's'
 
4680
      }// end loop over 'r'
 
4681
      
 
4682
      // Table(s) of coefficients.
 
4683
      static const double coefficients0[10] = \
 
4684
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
4685
      
 
4686
      // Compute value(s).
 
4687
      for (unsigned int r = 0; r < 10; r++)
 
4688
      {
 
4689
        values[0] += coefficients0[r]*basisvalues[r];
 
4690
      }// end loop over 'r'
 
4691
        break;
 
4692
      }
 
4693
    case 4:
 
4694
      {
 
4695
        
 
4696
      // Array of basisvalues.
 
4697
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4698
      
 
4699
      // Declare helper variables.
 
4700
      unsigned int rr = 0;
 
4701
      unsigned int ss = 0;
 
4702
      unsigned int tt = 0;
 
4703
      double tmp5 = 0.000000000000000;
 
4704
      double tmp6 = 0.000000000000000;
 
4705
      double tmp7 = 0.000000000000000;
 
4706
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4707
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4708
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4709
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4710
      double tmp4 = tmp3*tmp3;
 
4711
      
 
4712
      // Compute basisvalues.
 
4713
      basisvalues[0] = 1.000000000000000;
 
4714
      basisvalues[1] = tmp0;
 
4715
      for (unsigned int r = 1; r < 2; r++)
 
4716
      {
 
4717
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4718
        ss = r*(r + 1)*(r + 2)/6;
 
4719
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4720
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4721
      }// end loop over 'r'
 
4722
      for (unsigned int r = 0; r < 2; r++)
 
4723
      {
 
4724
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4725
        ss = r*(r + 1)*(r + 2)/6;
 
4726
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4727
      }// end loop over 'r'
 
4728
      for (unsigned int r = 0; r < 1; r++)
 
4729
      {
 
4730
        for (unsigned int s = 1; s < 2 - r; s++)
 
4731
        {
 
4732
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4733
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4734
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4735
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4736
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4737
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4738
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4739
        }// end loop over 's'
 
4740
      }// end loop over 'r'
 
4741
      for (unsigned int r = 0; r < 2; r++)
 
4742
      {
 
4743
        for (unsigned int s = 0; s < 2 - r; s++)
 
4744
        {
 
4745
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4746
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4747
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4748
        }// end loop over 's'
 
4749
      }// end loop over 'r'
 
4750
      for (unsigned int r = 0; r < 1; r++)
 
4751
      {
 
4752
        for (unsigned int s = 0; s < 1 - r; s++)
 
4753
        {
 
4754
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4755
          {
 
4756
            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;
 
4757
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4758
            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;
 
4759
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4760
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4761
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4762
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4763
          }// end loop over 't'
 
4764
        }// end loop over 's'
 
4765
      }// end loop over 'r'
 
4766
      for (unsigned int r = 0; r < 3; r++)
 
4767
      {
 
4768
        for (unsigned int s = 0; s < 3 - r; s++)
 
4769
        {
 
4770
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4771
          {
 
4772
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4773
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4774
          }// end loop over 't'
 
4775
        }// end loop over 's'
 
4776
      }// end loop over 'r'
 
4777
      
 
4778
      // Table(s) of coefficients.
 
4779
      static const double coefficients0[10] = \
 
4780
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
4781
      
 
4782
      // Compute value(s).
 
4783
      for (unsigned int r = 0; r < 10; r++)
 
4784
      {
 
4785
        values[0] += coefficients0[r]*basisvalues[r];
 
4786
      }// end loop over 'r'
 
4787
        break;
 
4788
      }
 
4789
    case 5:
 
4790
      {
 
4791
        
 
4792
      // Array of basisvalues.
 
4793
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4794
      
 
4795
      // Declare helper variables.
 
4796
      unsigned int rr = 0;
 
4797
      unsigned int ss = 0;
 
4798
      unsigned int tt = 0;
 
4799
      double tmp5 = 0.000000000000000;
 
4800
      double tmp6 = 0.000000000000000;
 
4801
      double tmp7 = 0.000000000000000;
 
4802
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4803
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4804
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4805
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4806
      double tmp4 = tmp3*tmp3;
 
4807
      
 
4808
      // Compute basisvalues.
 
4809
      basisvalues[0] = 1.000000000000000;
 
4810
      basisvalues[1] = tmp0;
 
4811
      for (unsigned int r = 1; r < 2; r++)
 
4812
      {
 
4813
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4814
        ss = r*(r + 1)*(r + 2)/6;
 
4815
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4816
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4817
      }// end loop over 'r'
 
4818
      for (unsigned int r = 0; r < 2; r++)
 
4819
      {
 
4820
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4821
        ss = r*(r + 1)*(r + 2)/6;
 
4822
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4823
      }// end loop over 'r'
 
4824
      for (unsigned int r = 0; r < 1; r++)
 
4825
      {
 
4826
        for (unsigned int s = 1; s < 2 - r; s++)
 
4827
        {
 
4828
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4829
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4830
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4831
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4832
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4833
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4834
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4835
        }// end loop over 's'
 
4836
      }// end loop over 'r'
 
4837
      for (unsigned int r = 0; r < 2; r++)
 
4838
      {
 
4839
        for (unsigned int s = 0; s < 2 - r; s++)
 
4840
        {
 
4841
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4842
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4843
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4844
        }// end loop over 's'
 
4845
      }// end loop over 'r'
 
4846
      for (unsigned int r = 0; r < 1; r++)
 
4847
      {
 
4848
        for (unsigned int s = 0; s < 1 - r; s++)
 
4849
        {
 
4850
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4851
          {
 
4852
            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;
 
4853
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4854
            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;
 
4855
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4856
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4857
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4858
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4859
          }// end loop over 't'
 
4860
        }// end loop over 's'
 
4861
      }// end loop over 'r'
 
4862
      for (unsigned int r = 0; r < 3; r++)
 
4863
      {
 
4864
        for (unsigned int s = 0; s < 3 - r; s++)
 
4865
        {
 
4866
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4867
          {
 
4868
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4869
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4870
          }// end loop over 't'
 
4871
        }// end loop over 's'
 
4872
      }// end loop over 'r'
 
4873
      
 
4874
      // Table(s) of coefficients.
 
4875
      static const double coefficients0[10] = \
 
4876
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
4877
      
 
4878
      // Compute value(s).
 
4879
      for (unsigned int r = 0; r < 10; r++)
 
4880
      {
 
4881
        values[0] += coefficients0[r]*basisvalues[r];
 
4882
      }// end loop over 'r'
 
4883
        break;
 
4884
      }
 
4885
    case 6:
 
4886
      {
 
4887
        
 
4888
      // Array of basisvalues.
 
4889
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4890
      
 
4891
      // Declare helper variables.
 
4892
      unsigned int rr = 0;
 
4893
      unsigned int ss = 0;
 
4894
      unsigned int tt = 0;
 
4895
      double tmp5 = 0.000000000000000;
 
4896
      double tmp6 = 0.000000000000000;
 
4897
      double tmp7 = 0.000000000000000;
 
4898
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4899
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4900
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4901
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4902
      double tmp4 = tmp3*tmp3;
 
4903
      
 
4904
      // Compute basisvalues.
 
4905
      basisvalues[0] = 1.000000000000000;
 
4906
      basisvalues[1] = tmp0;
 
4907
      for (unsigned int r = 1; r < 2; r++)
 
4908
      {
 
4909
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
4910
        ss = r*(r + 1)*(r + 2)/6;
 
4911
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
4912
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
4913
      }// end loop over 'r'
 
4914
      for (unsigned int r = 0; r < 2; r++)
 
4915
      {
 
4916
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
4917
        ss = r*(r + 1)*(r + 2)/6;
 
4918
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
4919
      }// end loop over 'r'
 
4920
      for (unsigned int r = 0; r < 1; r++)
 
4921
      {
 
4922
        for (unsigned int s = 1; s < 2 - r; s++)
 
4923
        {
 
4924
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
4925
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4926
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
4927
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4928
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4929
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
4930
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
4931
        }// end loop over 's'
 
4932
      }// end loop over 'r'
 
4933
      for (unsigned int r = 0; r < 2; r++)
 
4934
      {
 
4935
        for (unsigned int s = 0; s < 2 - r; s++)
 
4936
        {
 
4937
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
4938
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
4939
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
4940
        }// end loop over 's'
 
4941
      }// end loop over 'r'
 
4942
      for (unsigned int r = 0; r < 1; r++)
 
4943
      {
 
4944
        for (unsigned int s = 0; s < 1 - r; s++)
 
4945
        {
 
4946
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
4947
          {
 
4948
            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;
 
4949
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4950
            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;
 
4951
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4952
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4953
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
4954
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
4955
          }// end loop over 't'
 
4956
        }// end loop over 's'
 
4957
      }// end loop over 'r'
 
4958
      for (unsigned int r = 0; r < 3; r++)
 
4959
      {
 
4960
        for (unsigned int s = 0; s < 3 - r; s++)
 
4961
        {
 
4962
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
4963
          {
 
4964
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
4965
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
4966
          }// end loop over 't'
 
4967
        }// end loop over 's'
 
4968
      }// end loop over 'r'
 
4969
      
 
4970
      // Table(s) of coefficients.
 
4971
      static const double coefficients0[10] = \
 
4972
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
4973
      
 
4974
      // Compute value(s).
 
4975
      for (unsigned int r = 0; r < 10; r++)
 
4976
      {
 
4977
        values[0] += coefficients0[r]*basisvalues[r];
 
4978
      }// end loop over 'r'
 
4979
        break;
 
4980
      }
 
4981
    case 7:
 
4982
      {
 
4983
        
 
4984
      // Array of basisvalues.
 
4985
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
4986
      
 
4987
      // Declare helper variables.
 
4988
      unsigned int rr = 0;
 
4989
      unsigned int ss = 0;
 
4990
      unsigned int tt = 0;
 
4991
      double tmp5 = 0.000000000000000;
 
4992
      double tmp6 = 0.000000000000000;
 
4993
      double tmp7 = 0.000000000000000;
 
4994
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
4995
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
4996
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
4997
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
4998
      double tmp4 = tmp3*tmp3;
 
4999
      
 
5000
      // Compute basisvalues.
 
5001
      basisvalues[0] = 1.000000000000000;
 
5002
      basisvalues[1] = tmp0;
 
5003
      for (unsigned int r = 1; r < 2; r++)
 
5004
      {
 
5005
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5006
        ss = r*(r + 1)*(r + 2)/6;
 
5007
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5008
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5009
      }// end loop over 'r'
 
5010
      for (unsigned int r = 0; r < 2; r++)
 
5011
      {
 
5012
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5013
        ss = r*(r + 1)*(r + 2)/6;
 
5014
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5015
      }// end loop over 'r'
 
5016
      for (unsigned int r = 0; r < 1; r++)
 
5017
      {
 
5018
        for (unsigned int s = 1; s < 2 - r; s++)
 
5019
        {
 
5020
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5021
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5022
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5023
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5024
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5025
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5026
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5027
        }// end loop over 's'
 
5028
      }// end loop over 'r'
 
5029
      for (unsigned int r = 0; r < 2; r++)
 
5030
      {
 
5031
        for (unsigned int s = 0; s < 2 - r; s++)
 
5032
        {
 
5033
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5034
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5035
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5036
        }// end loop over 's'
 
5037
      }// end loop over 'r'
 
5038
      for (unsigned int r = 0; r < 1; r++)
 
5039
      {
 
5040
        for (unsigned int s = 0; s < 1 - r; s++)
 
5041
        {
 
5042
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5043
          {
 
5044
            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;
 
5045
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5046
            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;
 
5047
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5048
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5049
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5050
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5051
          }// end loop over 't'
 
5052
        }// end loop over 's'
 
5053
      }// end loop over 'r'
 
5054
      for (unsigned int r = 0; r < 3; r++)
 
5055
      {
 
5056
        for (unsigned int s = 0; s < 3 - r; s++)
 
5057
        {
 
5058
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5059
          {
 
5060
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5061
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5062
          }// end loop over 't'
 
5063
        }// end loop over 's'
 
5064
      }// end loop over 'r'
 
5065
      
 
5066
      // Table(s) of coefficients.
 
5067
      static const double coefficients0[10] = \
 
5068
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
5069
      
 
5070
      // Compute value(s).
 
5071
      for (unsigned int r = 0; r < 10; r++)
 
5072
      {
 
5073
        values[0] += coefficients0[r]*basisvalues[r];
 
5074
      }// end loop over 'r'
 
5075
        break;
 
5076
      }
 
5077
    case 8:
 
5078
      {
 
5079
        
 
5080
      // Array of basisvalues.
 
5081
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5082
      
 
5083
      // Declare helper variables.
 
5084
      unsigned int rr = 0;
 
5085
      unsigned int ss = 0;
 
5086
      unsigned int tt = 0;
 
5087
      double tmp5 = 0.000000000000000;
 
5088
      double tmp6 = 0.000000000000000;
 
5089
      double tmp7 = 0.000000000000000;
 
5090
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5091
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5092
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5093
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5094
      double tmp4 = tmp3*tmp3;
 
5095
      
 
5096
      // Compute basisvalues.
 
5097
      basisvalues[0] = 1.000000000000000;
 
5098
      basisvalues[1] = tmp0;
 
5099
      for (unsigned int r = 1; r < 2; r++)
 
5100
      {
 
5101
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5102
        ss = r*(r + 1)*(r + 2)/6;
 
5103
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5104
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5105
      }// end loop over 'r'
 
5106
      for (unsigned int r = 0; r < 2; r++)
 
5107
      {
 
5108
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5109
        ss = r*(r + 1)*(r + 2)/6;
 
5110
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5111
      }// end loop over 'r'
 
5112
      for (unsigned int r = 0; r < 1; r++)
 
5113
      {
 
5114
        for (unsigned int s = 1; s < 2 - r; s++)
 
5115
        {
 
5116
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5117
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5118
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5119
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5120
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5121
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5122
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5123
        }// end loop over 's'
 
5124
      }// end loop over 'r'
 
5125
      for (unsigned int r = 0; r < 2; r++)
 
5126
      {
 
5127
        for (unsigned int s = 0; s < 2 - r; s++)
 
5128
        {
 
5129
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5130
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5131
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5132
        }// end loop over 's'
 
5133
      }// end loop over 'r'
 
5134
      for (unsigned int r = 0; r < 1; r++)
 
5135
      {
 
5136
        for (unsigned int s = 0; s < 1 - r; s++)
 
5137
        {
 
5138
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5139
          {
 
5140
            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;
 
5141
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5142
            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;
 
5143
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5144
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5145
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5146
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5147
          }// end loop over 't'
 
5148
        }// end loop over 's'
 
5149
      }// end loop over 'r'
 
5150
      for (unsigned int r = 0; r < 3; r++)
 
5151
      {
 
5152
        for (unsigned int s = 0; s < 3 - r; s++)
 
5153
        {
 
5154
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5155
          {
 
5156
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5157
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5158
          }// end loop over 't'
 
5159
        }// end loop over 's'
 
5160
      }// end loop over 'r'
 
5161
      
 
5162
      // Table(s) of coefficients.
 
5163
      static const double coefficients0[10] = \
 
5164
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
5165
      
 
5166
      // Compute value(s).
 
5167
      for (unsigned int r = 0; r < 10; r++)
 
5168
      {
 
5169
        values[0] += coefficients0[r]*basisvalues[r];
 
5170
      }// end loop over 'r'
 
5171
        break;
 
5172
      }
 
5173
    case 9:
 
5174
      {
 
5175
        
 
5176
      // Array of basisvalues.
 
5177
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5178
      
 
5179
      // Declare helper variables.
 
5180
      unsigned int rr = 0;
 
5181
      unsigned int ss = 0;
 
5182
      unsigned int tt = 0;
 
5183
      double tmp5 = 0.000000000000000;
 
5184
      double tmp6 = 0.000000000000000;
 
5185
      double tmp7 = 0.000000000000000;
 
5186
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5187
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5188
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5189
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5190
      double tmp4 = tmp3*tmp3;
 
5191
      
 
5192
      // Compute basisvalues.
 
5193
      basisvalues[0] = 1.000000000000000;
 
5194
      basisvalues[1] = tmp0;
 
5195
      for (unsigned int r = 1; r < 2; r++)
 
5196
      {
 
5197
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5198
        ss = r*(r + 1)*(r + 2)/6;
 
5199
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5200
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5201
      }// end loop over 'r'
 
5202
      for (unsigned int r = 0; r < 2; r++)
 
5203
      {
 
5204
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5205
        ss = r*(r + 1)*(r + 2)/6;
 
5206
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5207
      }// end loop over 'r'
 
5208
      for (unsigned int r = 0; r < 1; r++)
 
5209
      {
 
5210
        for (unsigned int s = 1; s < 2 - r; s++)
 
5211
        {
 
5212
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5213
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5214
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5215
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5216
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5217
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5218
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5219
        }// end loop over 's'
 
5220
      }// end loop over 'r'
 
5221
      for (unsigned int r = 0; r < 2; r++)
 
5222
      {
 
5223
        for (unsigned int s = 0; s < 2 - r; s++)
 
5224
        {
 
5225
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5226
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5227
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5228
        }// end loop over 's'
 
5229
      }// end loop over 'r'
 
5230
      for (unsigned int r = 0; r < 1; r++)
 
5231
      {
 
5232
        for (unsigned int s = 0; s < 1 - r; s++)
 
5233
        {
 
5234
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5235
          {
 
5236
            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;
 
5237
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5238
            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;
 
5239
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5240
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5241
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5242
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5243
          }// end loop over 't'
 
5244
        }// end loop over 's'
 
5245
      }// end loop over 'r'
 
5246
      for (unsigned int r = 0; r < 3; r++)
 
5247
      {
 
5248
        for (unsigned int s = 0; s < 3 - r; s++)
 
5249
        {
 
5250
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5251
          {
 
5252
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5253
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5254
          }// end loop over 't'
 
5255
        }// end loop over 's'
 
5256
      }// end loop over 'r'
 
5257
      
 
5258
      // Table(s) of coefficients.
 
5259
      static const double coefficients0[10] = \
 
5260
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
5261
      
 
5262
      // Compute value(s).
 
5263
      for (unsigned int r = 0; r < 10; r++)
 
5264
      {
 
5265
        values[0] += coefficients0[r]*basisvalues[r];
 
5266
      }// end loop over 'r'
 
5267
        break;
 
5268
      }
 
5269
    case 10:
 
5270
      {
 
5271
        
 
5272
      // Array of basisvalues.
 
5273
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5274
      
 
5275
      // Declare helper variables.
 
5276
      unsigned int rr = 0;
 
5277
      unsigned int ss = 0;
 
5278
      unsigned int tt = 0;
 
5279
      double tmp5 = 0.000000000000000;
 
5280
      double tmp6 = 0.000000000000000;
 
5281
      double tmp7 = 0.000000000000000;
 
5282
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5283
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5284
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5285
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5286
      double tmp4 = tmp3*tmp3;
 
5287
      
 
5288
      // Compute basisvalues.
 
5289
      basisvalues[0] = 1.000000000000000;
 
5290
      basisvalues[1] = tmp0;
 
5291
      for (unsigned int r = 1; r < 2; r++)
 
5292
      {
 
5293
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5294
        ss = r*(r + 1)*(r + 2)/6;
 
5295
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5296
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5297
      }// end loop over 'r'
 
5298
      for (unsigned int r = 0; r < 2; r++)
 
5299
      {
 
5300
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5301
        ss = r*(r + 1)*(r + 2)/6;
 
5302
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5303
      }// end loop over 'r'
 
5304
      for (unsigned int r = 0; r < 1; r++)
 
5305
      {
 
5306
        for (unsigned int s = 1; s < 2 - r; s++)
 
5307
        {
 
5308
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5309
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5310
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5311
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5312
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5313
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5314
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5315
        }// end loop over 's'
 
5316
      }// end loop over 'r'
 
5317
      for (unsigned int r = 0; r < 2; r++)
 
5318
      {
 
5319
        for (unsigned int s = 0; s < 2 - r; s++)
 
5320
        {
 
5321
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5322
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5323
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5324
        }// end loop over 's'
 
5325
      }// end loop over 'r'
 
5326
      for (unsigned int r = 0; r < 1; r++)
 
5327
      {
 
5328
        for (unsigned int s = 0; s < 1 - r; s++)
 
5329
        {
 
5330
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5331
          {
 
5332
            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;
 
5333
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5334
            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;
 
5335
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5336
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5337
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5338
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5339
          }// end loop over 't'
 
5340
        }// end loop over 's'
 
5341
      }// end loop over 'r'
 
5342
      for (unsigned int r = 0; r < 3; r++)
 
5343
      {
 
5344
        for (unsigned int s = 0; s < 3 - r; s++)
 
5345
        {
 
5346
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5347
          {
 
5348
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5349
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5350
          }// end loop over 't'
 
5351
        }// end loop over 's'
 
5352
      }// end loop over 'r'
 
5353
      
 
5354
      // Table(s) of coefficients.
 
5355
      static const double coefficients0[10] = \
 
5356
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
5357
      
 
5358
      // Compute value(s).
 
5359
      for (unsigned int r = 0; r < 10; r++)
 
5360
      {
 
5361
        values[1] += coefficients0[r]*basisvalues[r];
 
5362
      }// end loop over 'r'
 
5363
        break;
 
5364
      }
 
5365
    case 11:
 
5366
      {
 
5367
        
 
5368
      // Array of basisvalues.
 
5369
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5370
      
 
5371
      // Declare helper variables.
 
5372
      unsigned int rr = 0;
 
5373
      unsigned int ss = 0;
 
5374
      unsigned int tt = 0;
 
5375
      double tmp5 = 0.000000000000000;
 
5376
      double tmp6 = 0.000000000000000;
 
5377
      double tmp7 = 0.000000000000000;
 
5378
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5379
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5380
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5381
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5382
      double tmp4 = tmp3*tmp3;
 
5383
      
 
5384
      // Compute basisvalues.
 
5385
      basisvalues[0] = 1.000000000000000;
 
5386
      basisvalues[1] = tmp0;
 
5387
      for (unsigned int r = 1; r < 2; r++)
 
5388
      {
 
5389
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5390
        ss = r*(r + 1)*(r + 2)/6;
 
5391
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5392
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5393
      }// end loop over 'r'
 
5394
      for (unsigned int r = 0; r < 2; r++)
 
5395
      {
 
5396
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5397
        ss = r*(r + 1)*(r + 2)/6;
 
5398
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5399
      }// end loop over 'r'
 
5400
      for (unsigned int r = 0; r < 1; r++)
 
5401
      {
 
5402
        for (unsigned int s = 1; s < 2 - r; s++)
 
5403
        {
 
5404
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5405
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5406
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5407
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5408
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5409
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5410
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5411
        }// end loop over 's'
 
5412
      }// end loop over 'r'
 
5413
      for (unsigned int r = 0; r < 2; r++)
 
5414
      {
 
5415
        for (unsigned int s = 0; s < 2 - r; s++)
 
5416
        {
 
5417
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5418
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5419
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5420
        }// end loop over 's'
 
5421
      }// end loop over 'r'
 
5422
      for (unsigned int r = 0; r < 1; r++)
 
5423
      {
 
5424
        for (unsigned int s = 0; s < 1 - r; s++)
 
5425
        {
 
5426
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5427
          {
 
5428
            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;
 
5429
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5430
            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;
 
5431
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5432
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5433
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5434
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5435
          }// end loop over 't'
 
5436
        }// end loop over 's'
 
5437
      }// end loop over 'r'
 
5438
      for (unsigned int r = 0; r < 3; r++)
 
5439
      {
 
5440
        for (unsigned int s = 0; s < 3 - r; s++)
 
5441
        {
 
5442
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5443
          {
 
5444
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5445
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5446
          }// end loop over 't'
 
5447
        }// end loop over 's'
 
5448
      }// end loop over 'r'
 
5449
      
 
5450
      // Table(s) of coefficients.
 
5451
      static const double coefficients0[10] = \
 
5452
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
5453
      
 
5454
      // Compute value(s).
 
5455
      for (unsigned int r = 0; r < 10; r++)
 
5456
      {
 
5457
        values[1] += coefficients0[r]*basisvalues[r];
 
5458
      }// end loop over 'r'
 
5459
        break;
 
5460
      }
 
5461
    case 12:
 
5462
      {
 
5463
        
 
5464
      // Array of basisvalues.
 
5465
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5466
      
 
5467
      // Declare helper variables.
 
5468
      unsigned int rr = 0;
 
5469
      unsigned int ss = 0;
 
5470
      unsigned int tt = 0;
 
5471
      double tmp5 = 0.000000000000000;
 
5472
      double tmp6 = 0.000000000000000;
 
5473
      double tmp7 = 0.000000000000000;
 
5474
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5475
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5476
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5477
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5478
      double tmp4 = tmp3*tmp3;
 
5479
      
 
5480
      // Compute basisvalues.
 
5481
      basisvalues[0] = 1.000000000000000;
 
5482
      basisvalues[1] = tmp0;
 
5483
      for (unsigned int r = 1; r < 2; r++)
 
5484
      {
 
5485
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5486
        ss = r*(r + 1)*(r + 2)/6;
 
5487
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5488
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5489
      }// end loop over 'r'
 
5490
      for (unsigned int r = 0; r < 2; r++)
 
5491
      {
 
5492
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5493
        ss = r*(r + 1)*(r + 2)/6;
 
5494
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5495
      }// end loop over 'r'
 
5496
      for (unsigned int r = 0; r < 1; r++)
 
5497
      {
 
5498
        for (unsigned int s = 1; s < 2 - r; s++)
 
5499
        {
 
5500
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5501
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5502
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5503
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5504
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5505
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5506
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5507
        }// end loop over 's'
 
5508
      }// end loop over 'r'
 
5509
      for (unsigned int r = 0; r < 2; r++)
 
5510
      {
 
5511
        for (unsigned int s = 0; s < 2 - r; s++)
 
5512
        {
 
5513
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5514
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5515
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5516
        }// end loop over 's'
 
5517
      }// end loop over 'r'
 
5518
      for (unsigned int r = 0; r < 1; r++)
 
5519
      {
 
5520
        for (unsigned int s = 0; s < 1 - r; s++)
 
5521
        {
 
5522
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5523
          {
 
5524
            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;
 
5525
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5526
            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;
 
5527
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5528
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5529
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5530
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5531
          }// end loop over 't'
 
5532
        }// end loop over 's'
 
5533
      }// end loop over 'r'
 
5534
      for (unsigned int r = 0; r < 3; r++)
 
5535
      {
 
5536
        for (unsigned int s = 0; s < 3 - r; s++)
 
5537
        {
 
5538
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5539
          {
 
5540
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5541
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5542
          }// end loop over 't'
 
5543
        }// end loop over 's'
 
5544
      }// end loop over 'r'
 
5545
      
 
5546
      // Table(s) of coefficients.
 
5547
      static const double coefficients0[10] = \
 
5548
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
5549
      
 
5550
      // Compute value(s).
 
5551
      for (unsigned int r = 0; r < 10; r++)
 
5552
      {
 
5553
        values[1] += coefficients0[r]*basisvalues[r];
 
5554
      }// end loop over 'r'
 
5555
        break;
 
5556
      }
 
5557
    case 13:
 
5558
      {
 
5559
        
 
5560
      // Array of basisvalues.
 
5561
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5562
      
 
5563
      // Declare helper variables.
 
5564
      unsigned int rr = 0;
 
5565
      unsigned int ss = 0;
 
5566
      unsigned int tt = 0;
 
5567
      double tmp5 = 0.000000000000000;
 
5568
      double tmp6 = 0.000000000000000;
 
5569
      double tmp7 = 0.000000000000000;
 
5570
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5571
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5572
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5573
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5574
      double tmp4 = tmp3*tmp3;
 
5575
      
 
5576
      // Compute basisvalues.
 
5577
      basisvalues[0] = 1.000000000000000;
 
5578
      basisvalues[1] = tmp0;
 
5579
      for (unsigned int r = 1; r < 2; r++)
 
5580
      {
 
5581
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5582
        ss = r*(r + 1)*(r + 2)/6;
 
5583
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5584
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5585
      }// end loop over 'r'
 
5586
      for (unsigned int r = 0; r < 2; r++)
 
5587
      {
 
5588
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5589
        ss = r*(r + 1)*(r + 2)/6;
 
5590
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5591
      }// end loop over 'r'
 
5592
      for (unsigned int r = 0; r < 1; r++)
 
5593
      {
 
5594
        for (unsigned int s = 1; s < 2 - r; s++)
 
5595
        {
 
5596
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5597
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5598
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5599
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5600
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5601
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5602
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5603
        }// end loop over 's'
 
5604
      }// end loop over 'r'
 
5605
      for (unsigned int r = 0; r < 2; r++)
 
5606
      {
 
5607
        for (unsigned int s = 0; s < 2 - r; s++)
 
5608
        {
 
5609
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5610
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5611
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5612
        }// end loop over 's'
 
5613
      }// end loop over 'r'
 
5614
      for (unsigned int r = 0; r < 1; r++)
 
5615
      {
 
5616
        for (unsigned int s = 0; s < 1 - r; s++)
 
5617
        {
 
5618
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5619
          {
 
5620
            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;
 
5621
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5622
            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;
 
5623
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5624
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5625
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5626
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5627
          }// end loop over 't'
 
5628
        }// end loop over 's'
 
5629
      }// end loop over 'r'
 
5630
      for (unsigned int r = 0; r < 3; r++)
 
5631
      {
 
5632
        for (unsigned int s = 0; s < 3 - r; s++)
 
5633
        {
 
5634
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5635
          {
 
5636
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5637
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5638
          }// end loop over 't'
 
5639
        }// end loop over 's'
 
5640
      }// end loop over 'r'
 
5641
      
 
5642
      // Table(s) of coefficients.
 
5643
      static const double coefficients0[10] = \
 
5644
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
5645
      
 
5646
      // Compute value(s).
 
5647
      for (unsigned int r = 0; r < 10; r++)
 
5648
      {
 
5649
        values[1] += coefficients0[r]*basisvalues[r];
 
5650
      }// end loop over 'r'
 
5651
        break;
 
5652
      }
 
5653
    case 14:
 
5654
      {
 
5655
        
 
5656
      // Array of basisvalues.
 
5657
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5658
      
 
5659
      // Declare helper variables.
 
5660
      unsigned int rr = 0;
 
5661
      unsigned int ss = 0;
 
5662
      unsigned int tt = 0;
 
5663
      double tmp5 = 0.000000000000000;
 
5664
      double tmp6 = 0.000000000000000;
 
5665
      double tmp7 = 0.000000000000000;
 
5666
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5667
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5668
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5669
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5670
      double tmp4 = tmp3*tmp3;
 
5671
      
 
5672
      // Compute basisvalues.
 
5673
      basisvalues[0] = 1.000000000000000;
 
5674
      basisvalues[1] = tmp0;
 
5675
      for (unsigned int r = 1; r < 2; r++)
 
5676
      {
 
5677
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5678
        ss = r*(r + 1)*(r + 2)/6;
 
5679
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5680
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5681
      }// end loop over 'r'
 
5682
      for (unsigned int r = 0; r < 2; r++)
 
5683
      {
 
5684
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5685
        ss = r*(r + 1)*(r + 2)/6;
 
5686
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5687
      }// end loop over 'r'
 
5688
      for (unsigned int r = 0; r < 1; r++)
 
5689
      {
 
5690
        for (unsigned int s = 1; s < 2 - r; s++)
 
5691
        {
 
5692
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5693
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5694
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5695
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5696
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5697
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5698
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5699
        }// end loop over 's'
 
5700
      }// end loop over 'r'
 
5701
      for (unsigned int r = 0; r < 2; r++)
 
5702
      {
 
5703
        for (unsigned int s = 0; s < 2 - r; s++)
 
5704
        {
 
5705
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5706
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5707
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5708
        }// end loop over 's'
 
5709
      }// end loop over 'r'
 
5710
      for (unsigned int r = 0; r < 1; r++)
 
5711
      {
 
5712
        for (unsigned int s = 0; s < 1 - r; s++)
 
5713
        {
 
5714
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5715
          {
 
5716
            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;
 
5717
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5718
            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;
 
5719
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5720
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5721
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5722
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5723
          }// end loop over 't'
 
5724
        }// end loop over 's'
 
5725
      }// end loop over 'r'
 
5726
      for (unsigned int r = 0; r < 3; r++)
 
5727
      {
 
5728
        for (unsigned int s = 0; s < 3 - r; s++)
 
5729
        {
 
5730
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5731
          {
 
5732
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5733
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5734
          }// end loop over 't'
 
5735
        }// end loop over 's'
 
5736
      }// end loop over 'r'
 
5737
      
 
5738
      // Table(s) of coefficients.
 
5739
      static const double coefficients0[10] = \
 
5740
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
5741
      
 
5742
      // Compute value(s).
 
5743
      for (unsigned int r = 0; r < 10; r++)
 
5744
      {
 
5745
        values[1] += coefficients0[r]*basisvalues[r];
 
5746
      }// end loop over 'r'
 
5747
        break;
 
5748
      }
 
5749
    case 15:
 
5750
      {
 
5751
        
 
5752
      // Array of basisvalues.
 
5753
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5754
      
 
5755
      // Declare helper variables.
 
5756
      unsigned int rr = 0;
 
5757
      unsigned int ss = 0;
 
5758
      unsigned int tt = 0;
 
5759
      double tmp5 = 0.000000000000000;
 
5760
      double tmp6 = 0.000000000000000;
 
5761
      double tmp7 = 0.000000000000000;
 
5762
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5763
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5764
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5765
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5766
      double tmp4 = tmp3*tmp3;
 
5767
      
 
5768
      // Compute basisvalues.
 
5769
      basisvalues[0] = 1.000000000000000;
 
5770
      basisvalues[1] = tmp0;
 
5771
      for (unsigned int r = 1; r < 2; r++)
 
5772
      {
 
5773
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5774
        ss = r*(r + 1)*(r + 2)/6;
 
5775
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5776
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5777
      }// end loop over 'r'
 
5778
      for (unsigned int r = 0; r < 2; r++)
 
5779
      {
 
5780
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5781
        ss = r*(r + 1)*(r + 2)/6;
 
5782
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5783
      }// end loop over 'r'
 
5784
      for (unsigned int r = 0; r < 1; r++)
 
5785
      {
 
5786
        for (unsigned int s = 1; s < 2 - r; s++)
 
5787
        {
 
5788
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5789
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5790
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5791
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5792
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5793
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5794
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5795
        }// end loop over 's'
 
5796
      }// end loop over 'r'
 
5797
      for (unsigned int r = 0; r < 2; r++)
 
5798
      {
 
5799
        for (unsigned int s = 0; s < 2 - r; s++)
 
5800
        {
 
5801
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5802
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5803
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5804
        }// end loop over 's'
 
5805
      }// end loop over 'r'
 
5806
      for (unsigned int r = 0; r < 1; r++)
 
5807
      {
 
5808
        for (unsigned int s = 0; s < 1 - r; s++)
 
5809
        {
 
5810
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5811
          {
 
5812
            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;
 
5813
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5814
            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;
 
5815
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5816
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5817
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5818
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5819
          }// end loop over 't'
 
5820
        }// end loop over 's'
 
5821
      }// end loop over 'r'
 
5822
      for (unsigned int r = 0; r < 3; r++)
 
5823
      {
 
5824
        for (unsigned int s = 0; s < 3 - r; s++)
 
5825
        {
 
5826
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5827
          {
 
5828
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5829
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5830
          }// end loop over 't'
 
5831
        }// end loop over 's'
 
5832
      }// end loop over 'r'
 
5833
      
 
5834
      // Table(s) of coefficients.
 
5835
      static const double coefficients0[10] = \
 
5836
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
5837
      
 
5838
      // Compute value(s).
 
5839
      for (unsigned int r = 0; r < 10; r++)
 
5840
      {
 
5841
        values[1] += coefficients0[r]*basisvalues[r];
 
5842
      }// end loop over 'r'
 
5843
        break;
 
5844
      }
 
5845
    case 16:
 
5846
      {
 
5847
        
 
5848
      // Array of basisvalues.
 
5849
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5850
      
 
5851
      // Declare helper variables.
 
5852
      unsigned int rr = 0;
 
5853
      unsigned int ss = 0;
 
5854
      unsigned int tt = 0;
 
5855
      double tmp5 = 0.000000000000000;
 
5856
      double tmp6 = 0.000000000000000;
 
5857
      double tmp7 = 0.000000000000000;
 
5858
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5859
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5860
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5861
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5862
      double tmp4 = tmp3*tmp3;
 
5863
      
 
5864
      // Compute basisvalues.
 
5865
      basisvalues[0] = 1.000000000000000;
 
5866
      basisvalues[1] = tmp0;
 
5867
      for (unsigned int r = 1; r < 2; r++)
 
5868
      {
 
5869
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5870
        ss = r*(r + 1)*(r + 2)/6;
 
5871
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5872
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5873
      }// end loop over 'r'
 
5874
      for (unsigned int r = 0; r < 2; r++)
 
5875
      {
 
5876
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5877
        ss = r*(r + 1)*(r + 2)/6;
 
5878
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5879
      }// end loop over 'r'
 
5880
      for (unsigned int r = 0; r < 1; r++)
 
5881
      {
 
5882
        for (unsigned int s = 1; s < 2 - r; s++)
 
5883
        {
 
5884
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5885
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5886
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5887
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5888
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5889
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5890
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5891
        }// end loop over 's'
 
5892
      }// end loop over 'r'
 
5893
      for (unsigned int r = 0; r < 2; r++)
 
5894
      {
 
5895
        for (unsigned int s = 0; s < 2 - r; s++)
 
5896
        {
 
5897
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5898
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5899
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5900
        }// end loop over 's'
 
5901
      }// end loop over 'r'
 
5902
      for (unsigned int r = 0; r < 1; r++)
 
5903
      {
 
5904
        for (unsigned int s = 0; s < 1 - r; s++)
 
5905
        {
 
5906
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
5907
          {
 
5908
            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;
 
5909
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5910
            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;
 
5911
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5912
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5913
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
5914
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
5915
          }// end loop over 't'
 
5916
        }// end loop over 's'
 
5917
      }// end loop over 'r'
 
5918
      for (unsigned int r = 0; r < 3; r++)
 
5919
      {
 
5920
        for (unsigned int s = 0; s < 3 - r; s++)
 
5921
        {
 
5922
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
5923
          {
 
5924
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
5925
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
5926
          }// end loop over 't'
 
5927
        }// end loop over 's'
 
5928
      }// end loop over 'r'
 
5929
      
 
5930
      // Table(s) of coefficients.
 
5931
      static const double coefficients0[10] = \
 
5932
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
5933
      
 
5934
      // Compute value(s).
 
5935
      for (unsigned int r = 0; r < 10; r++)
 
5936
      {
 
5937
        values[1] += coefficients0[r]*basisvalues[r];
 
5938
      }// end loop over 'r'
 
5939
        break;
 
5940
      }
 
5941
    case 17:
 
5942
      {
 
5943
        
 
5944
      // Array of basisvalues.
 
5945
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
5946
      
 
5947
      // Declare helper variables.
 
5948
      unsigned int rr = 0;
 
5949
      unsigned int ss = 0;
 
5950
      unsigned int tt = 0;
 
5951
      double tmp5 = 0.000000000000000;
 
5952
      double tmp6 = 0.000000000000000;
 
5953
      double tmp7 = 0.000000000000000;
 
5954
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
5955
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
5956
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
5957
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
5958
      double tmp4 = tmp3*tmp3;
 
5959
      
 
5960
      // Compute basisvalues.
 
5961
      basisvalues[0] = 1.000000000000000;
 
5962
      basisvalues[1] = tmp0;
 
5963
      for (unsigned int r = 1; r < 2; r++)
 
5964
      {
 
5965
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
5966
        ss = r*(r + 1)*(r + 2)/6;
 
5967
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
5968
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
5969
      }// end loop over 'r'
 
5970
      for (unsigned int r = 0; r < 2; r++)
 
5971
      {
 
5972
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
5973
        ss = r*(r + 1)*(r + 2)/6;
 
5974
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
5975
      }// end loop over 'r'
 
5976
      for (unsigned int r = 0; r < 1; r++)
 
5977
      {
 
5978
        for (unsigned int s = 1; s < 2 - r; s++)
 
5979
        {
 
5980
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
5981
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5982
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
5983
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5984
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5985
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
5986
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
5987
        }// end loop over 's'
 
5988
      }// end loop over 'r'
 
5989
      for (unsigned int r = 0; r < 2; r++)
 
5990
      {
 
5991
        for (unsigned int s = 0; s < 2 - r; s++)
 
5992
        {
 
5993
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
5994
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
5995
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
5996
        }// end loop over 's'
 
5997
      }// end loop over 'r'
 
5998
      for (unsigned int r = 0; r < 1; r++)
 
5999
      {
 
6000
        for (unsigned int s = 0; s < 1 - r; s++)
 
6001
        {
 
6002
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6003
          {
 
6004
            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;
 
6005
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6006
            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;
 
6007
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6008
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6009
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6010
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6011
          }// end loop over 't'
 
6012
        }// end loop over 's'
 
6013
      }// end loop over 'r'
 
6014
      for (unsigned int r = 0; r < 3; r++)
 
6015
      {
 
6016
        for (unsigned int s = 0; s < 3 - r; s++)
 
6017
        {
 
6018
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6019
          {
 
6020
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6021
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6022
          }// end loop over 't'
 
6023
        }// end loop over 's'
 
6024
      }// end loop over 'r'
 
6025
      
 
6026
      // Table(s) of coefficients.
 
6027
      static const double coefficients0[10] = \
 
6028
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
6029
      
 
6030
      // Compute value(s).
 
6031
      for (unsigned int r = 0; r < 10; r++)
 
6032
      {
 
6033
        values[1] += coefficients0[r]*basisvalues[r];
 
6034
      }// end loop over 'r'
 
6035
        break;
 
6036
      }
 
6037
    case 18:
 
6038
      {
 
6039
        
 
6040
      // Array of basisvalues.
 
6041
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6042
      
 
6043
      // Declare helper variables.
 
6044
      unsigned int rr = 0;
 
6045
      unsigned int ss = 0;
 
6046
      unsigned int tt = 0;
 
6047
      double tmp5 = 0.000000000000000;
 
6048
      double tmp6 = 0.000000000000000;
 
6049
      double tmp7 = 0.000000000000000;
 
6050
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6051
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6052
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6053
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6054
      double tmp4 = tmp3*tmp3;
 
6055
      
 
6056
      // Compute basisvalues.
 
6057
      basisvalues[0] = 1.000000000000000;
 
6058
      basisvalues[1] = tmp0;
 
6059
      for (unsigned int r = 1; r < 2; r++)
 
6060
      {
 
6061
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6062
        ss = r*(r + 1)*(r + 2)/6;
 
6063
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6064
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6065
      }// end loop over 'r'
 
6066
      for (unsigned int r = 0; r < 2; r++)
 
6067
      {
 
6068
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6069
        ss = r*(r + 1)*(r + 2)/6;
 
6070
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6071
      }// end loop over 'r'
 
6072
      for (unsigned int r = 0; r < 1; r++)
 
6073
      {
 
6074
        for (unsigned int s = 1; s < 2 - r; s++)
 
6075
        {
 
6076
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6077
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6078
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6079
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6080
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6081
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6082
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6083
        }// end loop over 's'
 
6084
      }// end loop over 'r'
 
6085
      for (unsigned int r = 0; r < 2; r++)
 
6086
      {
 
6087
        for (unsigned int s = 0; s < 2 - r; s++)
 
6088
        {
 
6089
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6090
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6091
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6092
        }// end loop over 's'
 
6093
      }// end loop over 'r'
 
6094
      for (unsigned int r = 0; r < 1; r++)
 
6095
      {
 
6096
        for (unsigned int s = 0; s < 1 - r; s++)
 
6097
        {
 
6098
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6099
          {
 
6100
            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;
 
6101
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6102
            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;
 
6103
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6104
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6105
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6106
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6107
          }// end loop over 't'
 
6108
        }// end loop over 's'
 
6109
      }// end loop over 'r'
 
6110
      for (unsigned int r = 0; r < 3; r++)
 
6111
      {
 
6112
        for (unsigned int s = 0; s < 3 - r; s++)
 
6113
        {
 
6114
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6115
          {
 
6116
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6117
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6118
          }// end loop over 't'
 
6119
        }// end loop over 's'
 
6120
      }// end loop over 'r'
 
6121
      
 
6122
      // Table(s) of coefficients.
 
6123
      static const double coefficients0[10] = \
 
6124
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
6125
      
 
6126
      // Compute value(s).
 
6127
      for (unsigned int r = 0; r < 10; r++)
 
6128
      {
 
6129
        values[1] += coefficients0[r]*basisvalues[r];
 
6130
      }// end loop over 'r'
 
6131
        break;
 
6132
      }
 
6133
    case 19:
 
6134
      {
 
6135
        
 
6136
      // Array of basisvalues.
 
6137
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6138
      
 
6139
      // Declare helper variables.
 
6140
      unsigned int rr = 0;
 
6141
      unsigned int ss = 0;
 
6142
      unsigned int tt = 0;
 
6143
      double tmp5 = 0.000000000000000;
 
6144
      double tmp6 = 0.000000000000000;
 
6145
      double tmp7 = 0.000000000000000;
 
6146
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6147
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6148
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6149
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6150
      double tmp4 = tmp3*tmp3;
 
6151
      
 
6152
      // Compute basisvalues.
 
6153
      basisvalues[0] = 1.000000000000000;
 
6154
      basisvalues[1] = tmp0;
 
6155
      for (unsigned int r = 1; r < 2; r++)
 
6156
      {
 
6157
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6158
        ss = r*(r + 1)*(r + 2)/6;
 
6159
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6160
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6161
      }// end loop over 'r'
 
6162
      for (unsigned int r = 0; r < 2; r++)
 
6163
      {
 
6164
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6165
        ss = r*(r + 1)*(r + 2)/6;
 
6166
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6167
      }// end loop over 'r'
 
6168
      for (unsigned int r = 0; r < 1; r++)
 
6169
      {
 
6170
        for (unsigned int s = 1; s < 2 - r; s++)
 
6171
        {
 
6172
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6173
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6174
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6175
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6176
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6177
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6178
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6179
        }// end loop over 's'
 
6180
      }// end loop over 'r'
 
6181
      for (unsigned int r = 0; r < 2; r++)
 
6182
      {
 
6183
        for (unsigned int s = 0; s < 2 - r; s++)
 
6184
        {
 
6185
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6186
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6187
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6188
        }// end loop over 's'
 
6189
      }// end loop over 'r'
 
6190
      for (unsigned int r = 0; r < 1; r++)
 
6191
      {
 
6192
        for (unsigned int s = 0; s < 1 - r; s++)
 
6193
        {
 
6194
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6195
          {
 
6196
            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;
 
6197
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6198
            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;
 
6199
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6200
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6201
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6202
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6203
          }// end loop over 't'
 
6204
        }// end loop over 's'
 
6205
      }// end loop over 'r'
 
6206
      for (unsigned int r = 0; r < 3; r++)
 
6207
      {
 
6208
        for (unsigned int s = 0; s < 3 - r; s++)
 
6209
        {
 
6210
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6211
          {
 
6212
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6213
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6214
          }// end loop over 't'
 
6215
        }// end loop over 's'
 
6216
      }// end loop over 'r'
 
6217
      
 
6218
      // Table(s) of coefficients.
 
6219
      static const double coefficients0[10] = \
 
6220
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
6221
      
 
6222
      // Compute value(s).
 
6223
      for (unsigned int r = 0; r < 10; r++)
 
6224
      {
 
6225
        values[1] += coefficients0[r]*basisvalues[r];
 
6226
      }// end loop over 'r'
 
6227
        break;
 
6228
      }
 
6229
    case 20:
 
6230
      {
 
6231
        
 
6232
      // Array of basisvalues.
 
6233
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6234
      
 
6235
      // Declare helper variables.
 
6236
      unsigned int rr = 0;
 
6237
      unsigned int ss = 0;
 
6238
      unsigned int tt = 0;
 
6239
      double tmp5 = 0.000000000000000;
 
6240
      double tmp6 = 0.000000000000000;
 
6241
      double tmp7 = 0.000000000000000;
 
6242
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6243
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6244
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6245
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6246
      double tmp4 = tmp3*tmp3;
 
6247
      
 
6248
      // Compute basisvalues.
 
6249
      basisvalues[0] = 1.000000000000000;
 
6250
      basisvalues[1] = tmp0;
 
6251
      for (unsigned int r = 1; r < 2; r++)
 
6252
      {
 
6253
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6254
        ss = r*(r + 1)*(r + 2)/6;
 
6255
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6256
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6257
      }// end loop over 'r'
 
6258
      for (unsigned int r = 0; r < 2; r++)
 
6259
      {
 
6260
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6261
        ss = r*(r + 1)*(r + 2)/6;
 
6262
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6263
      }// end loop over 'r'
 
6264
      for (unsigned int r = 0; r < 1; r++)
 
6265
      {
 
6266
        for (unsigned int s = 1; s < 2 - r; s++)
 
6267
        {
 
6268
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6269
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6270
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6271
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6272
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6273
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6274
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6275
        }// end loop over 's'
 
6276
      }// end loop over 'r'
 
6277
      for (unsigned int r = 0; r < 2; r++)
 
6278
      {
 
6279
        for (unsigned int s = 0; s < 2 - r; s++)
 
6280
        {
 
6281
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6282
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6283
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6284
        }// end loop over 's'
 
6285
      }// end loop over 'r'
 
6286
      for (unsigned int r = 0; r < 1; r++)
 
6287
      {
 
6288
        for (unsigned int s = 0; s < 1 - r; s++)
 
6289
        {
 
6290
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6291
          {
 
6292
            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;
 
6293
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6294
            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;
 
6295
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6296
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6297
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6298
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6299
          }// end loop over 't'
 
6300
        }// end loop over 's'
 
6301
      }// end loop over 'r'
 
6302
      for (unsigned int r = 0; r < 3; r++)
 
6303
      {
 
6304
        for (unsigned int s = 0; s < 3 - r; s++)
 
6305
        {
 
6306
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6307
          {
 
6308
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6309
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6310
          }// end loop over 't'
 
6311
        }// end loop over 's'
 
6312
      }// end loop over 'r'
 
6313
      
 
6314
      // Table(s) of coefficients.
 
6315
      static const double coefficients0[10] = \
 
6316
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
6317
      
 
6318
      // Compute value(s).
 
6319
      for (unsigned int r = 0; r < 10; r++)
 
6320
      {
 
6321
        values[2] += coefficients0[r]*basisvalues[r];
 
6322
      }// end loop over 'r'
 
6323
        break;
 
6324
      }
 
6325
    case 21:
 
6326
      {
 
6327
        
 
6328
      // Array of basisvalues.
 
6329
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6330
      
 
6331
      // Declare helper variables.
 
6332
      unsigned int rr = 0;
 
6333
      unsigned int ss = 0;
 
6334
      unsigned int tt = 0;
 
6335
      double tmp5 = 0.000000000000000;
 
6336
      double tmp6 = 0.000000000000000;
 
6337
      double tmp7 = 0.000000000000000;
 
6338
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6339
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6340
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6341
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6342
      double tmp4 = tmp3*tmp3;
 
6343
      
 
6344
      // Compute basisvalues.
 
6345
      basisvalues[0] = 1.000000000000000;
 
6346
      basisvalues[1] = tmp0;
 
6347
      for (unsigned int r = 1; r < 2; r++)
 
6348
      {
 
6349
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6350
        ss = r*(r + 1)*(r + 2)/6;
 
6351
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6352
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6353
      }// end loop over 'r'
 
6354
      for (unsigned int r = 0; r < 2; r++)
 
6355
      {
 
6356
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6357
        ss = r*(r + 1)*(r + 2)/6;
 
6358
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6359
      }// end loop over 'r'
 
6360
      for (unsigned int r = 0; r < 1; r++)
 
6361
      {
 
6362
        for (unsigned int s = 1; s < 2 - r; s++)
 
6363
        {
 
6364
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6365
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6366
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6367
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6368
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6369
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6370
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6371
        }// end loop over 's'
 
6372
      }// end loop over 'r'
 
6373
      for (unsigned int r = 0; r < 2; r++)
 
6374
      {
 
6375
        for (unsigned int s = 0; s < 2 - r; s++)
 
6376
        {
 
6377
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6378
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6379
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6380
        }// end loop over 's'
 
6381
      }// end loop over 'r'
 
6382
      for (unsigned int r = 0; r < 1; r++)
 
6383
      {
 
6384
        for (unsigned int s = 0; s < 1 - r; s++)
 
6385
        {
 
6386
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6387
          {
 
6388
            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;
 
6389
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6390
            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;
 
6391
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6392
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6393
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6394
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6395
          }// end loop over 't'
 
6396
        }// end loop over 's'
 
6397
      }// end loop over 'r'
 
6398
      for (unsigned int r = 0; r < 3; r++)
 
6399
      {
 
6400
        for (unsigned int s = 0; s < 3 - r; s++)
 
6401
        {
 
6402
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6403
          {
 
6404
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6405
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6406
          }// end loop over 't'
 
6407
        }// end loop over 's'
 
6408
      }// end loop over 'r'
 
6409
      
 
6410
      // Table(s) of coefficients.
 
6411
      static const double coefficients0[10] = \
 
6412
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
6413
      
 
6414
      // Compute value(s).
 
6415
      for (unsigned int r = 0; r < 10; r++)
 
6416
      {
 
6417
        values[2] += coefficients0[r]*basisvalues[r];
 
6418
      }// end loop over 'r'
 
6419
        break;
 
6420
      }
 
6421
    case 22:
 
6422
      {
 
6423
        
 
6424
      // Array of basisvalues.
 
6425
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6426
      
 
6427
      // Declare helper variables.
 
6428
      unsigned int rr = 0;
 
6429
      unsigned int ss = 0;
 
6430
      unsigned int tt = 0;
 
6431
      double tmp5 = 0.000000000000000;
 
6432
      double tmp6 = 0.000000000000000;
 
6433
      double tmp7 = 0.000000000000000;
 
6434
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6435
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6436
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6437
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6438
      double tmp4 = tmp3*tmp3;
 
6439
      
 
6440
      // Compute basisvalues.
 
6441
      basisvalues[0] = 1.000000000000000;
 
6442
      basisvalues[1] = tmp0;
 
6443
      for (unsigned int r = 1; r < 2; r++)
 
6444
      {
 
6445
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6446
        ss = r*(r + 1)*(r + 2)/6;
 
6447
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6448
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6449
      }// end loop over 'r'
 
6450
      for (unsigned int r = 0; r < 2; r++)
 
6451
      {
 
6452
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6453
        ss = r*(r + 1)*(r + 2)/6;
 
6454
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6455
      }// end loop over 'r'
 
6456
      for (unsigned int r = 0; r < 1; r++)
 
6457
      {
 
6458
        for (unsigned int s = 1; s < 2 - r; s++)
 
6459
        {
 
6460
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6461
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6462
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6463
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6464
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6465
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6466
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6467
        }// end loop over 's'
 
6468
      }// end loop over 'r'
 
6469
      for (unsigned int r = 0; r < 2; r++)
 
6470
      {
 
6471
        for (unsigned int s = 0; s < 2 - r; s++)
 
6472
        {
 
6473
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6474
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6475
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6476
        }// end loop over 's'
 
6477
      }// end loop over 'r'
 
6478
      for (unsigned int r = 0; r < 1; r++)
 
6479
      {
 
6480
        for (unsigned int s = 0; s < 1 - r; s++)
 
6481
        {
 
6482
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6483
          {
 
6484
            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;
 
6485
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6486
            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;
 
6487
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6488
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6489
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6490
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6491
          }// end loop over 't'
 
6492
        }// end loop over 's'
 
6493
      }// end loop over 'r'
 
6494
      for (unsigned int r = 0; r < 3; r++)
 
6495
      {
 
6496
        for (unsigned int s = 0; s < 3 - r; s++)
 
6497
        {
 
6498
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6499
          {
 
6500
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6501
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6502
          }// end loop over 't'
 
6503
        }// end loop over 's'
 
6504
      }// end loop over 'r'
 
6505
      
 
6506
      // Table(s) of coefficients.
 
6507
      static const double coefficients0[10] = \
 
6508
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
6509
      
 
6510
      // Compute value(s).
 
6511
      for (unsigned int r = 0; r < 10; r++)
 
6512
      {
 
6513
        values[2] += coefficients0[r]*basisvalues[r];
 
6514
      }// end loop over 'r'
 
6515
        break;
 
6516
      }
 
6517
    case 23:
 
6518
      {
 
6519
        
 
6520
      // Array of basisvalues.
 
6521
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6522
      
 
6523
      // Declare helper variables.
 
6524
      unsigned int rr = 0;
 
6525
      unsigned int ss = 0;
 
6526
      unsigned int tt = 0;
 
6527
      double tmp5 = 0.000000000000000;
 
6528
      double tmp6 = 0.000000000000000;
 
6529
      double tmp7 = 0.000000000000000;
 
6530
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6531
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6532
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6533
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6534
      double tmp4 = tmp3*tmp3;
 
6535
      
 
6536
      // Compute basisvalues.
 
6537
      basisvalues[0] = 1.000000000000000;
 
6538
      basisvalues[1] = tmp0;
 
6539
      for (unsigned int r = 1; r < 2; r++)
 
6540
      {
 
6541
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6542
        ss = r*(r + 1)*(r + 2)/6;
 
6543
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6544
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6545
      }// end loop over 'r'
 
6546
      for (unsigned int r = 0; r < 2; r++)
 
6547
      {
 
6548
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6549
        ss = r*(r + 1)*(r + 2)/6;
 
6550
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6551
      }// end loop over 'r'
 
6552
      for (unsigned int r = 0; r < 1; r++)
 
6553
      {
 
6554
        for (unsigned int s = 1; s < 2 - r; s++)
 
6555
        {
 
6556
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6557
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6558
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6559
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6560
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6561
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6562
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6563
        }// end loop over 's'
 
6564
      }// end loop over 'r'
 
6565
      for (unsigned int r = 0; r < 2; r++)
 
6566
      {
 
6567
        for (unsigned int s = 0; s < 2 - r; s++)
 
6568
        {
 
6569
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6570
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6571
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6572
        }// end loop over 's'
 
6573
      }// end loop over 'r'
 
6574
      for (unsigned int r = 0; r < 1; r++)
 
6575
      {
 
6576
        for (unsigned int s = 0; s < 1 - r; s++)
 
6577
        {
 
6578
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6579
          {
 
6580
            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;
 
6581
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6582
            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;
 
6583
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6584
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6585
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6586
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6587
          }// end loop over 't'
 
6588
        }// end loop over 's'
 
6589
      }// end loop over 'r'
 
6590
      for (unsigned int r = 0; r < 3; r++)
 
6591
      {
 
6592
        for (unsigned int s = 0; s < 3 - r; s++)
 
6593
        {
 
6594
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6595
          {
 
6596
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6597
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6598
          }// end loop over 't'
 
6599
        }// end loop over 's'
 
6600
      }// end loop over 'r'
 
6601
      
 
6602
      // Table(s) of coefficients.
 
6603
      static const double coefficients0[10] = \
 
6604
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
6605
      
 
6606
      // Compute value(s).
 
6607
      for (unsigned int r = 0; r < 10; r++)
 
6608
      {
 
6609
        values[2] += coefficients0[r]*basisvalues[r];
 
6610
      }// end loop over 'r'
 
6611
        break;
 
6612
      }
 
6613
    case 24:
 
6614
      {
 
6615
        
 
6616
      // Array of basisvalues.
 
6617
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6618
      
 
6619
      // Declare helper variables.
 
6620
      unsigned int rr = 0;
 
6621
      unsigned int ss = 0;
 
6622
      unsigned int tt = 0;
 
6623
      double tmp5 = 0.000000000000000;
 
6624
      double tmp6 = 0.000000000000000;
 
6625
      double tmp7 = 0.000000000000000;
 
6626
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6627
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6628
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6629
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6630
      double tmp4 = tmp3*tmp3;
 
6631
      
 
6632
      // Compute basisvalues.
 
6633
      basisvalues[0] = 1.000000000000000;
 
6634
      basisvalues[1] = tmp0;
 
6635
      for (unsigned int r = 1; r < 2; r++)
 
6636
      {
 
6637
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6638
        ss = r*(r + 1)*(r + 2)/6;
 
6639
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6640
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6641
      }// end loop over 'r'
 
6642
      for (unsigned int r = 0; r < 2; r++)
 
6643
      {
 
6644
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6645
        ss = r*(r + 1)*(r + 2)/6;
 
6646
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6647
      }// end loop over 'r'
 
6648
      for (unsigned int r = 0; r < 1; r++)
 
6649
      {
 
6650
        for (unsigned int s = 1; s < 2 - r; s++)
 
6651
        {
 
6652
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6653
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6654
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6655
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6656
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6657
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6658
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6659
        }// end loop over 's'
 
6660
      }// end loop over 'r'
 
6661
      for (unsigned int r = 0; r < 2; r++)
 
6662
      {
 
6663
        for (unsigned int s = 0; s < 2 - r; s++)
 
6664
        {
 
6665
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6666
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6667
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6668
        }// end loop over 's'
 
6669
      }// end loop over 'r'
 
6670
      for (unsigned int r = 0; r < 1; r++)
 
6671
      {
 
6672
        for (unsigned int s = 0; s < 1 - r; s++)
 
6673
        {
 
6674
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6675
          {
 
6676
            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;
 
6677
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6678
            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;
 
6679
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6680
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6681
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6682
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6683
          }// end loop over 't'
 
6684
        }// end loop over 's'
 
6685
      }// end loop over 'r'
 
6686
      for (unsigned int r = 0; r < 3; r++)
 
6687
      {
 
6688
        for (unsigned int s = 0; s < 3 - r; s++)
 
6689
        {
 
6690
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6691
          {
 
6692
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6693
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6694
          }// end loop over 't'
 
6695
        }// end loop over 's'
 
6696
      }// end loop over 'r'
 
6697
      
 
6698
      // Table(s) of coefficients.
 
6699
      static const double coefficients0[10] = \
 
6700
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
6701
      
 
6702
      // Compute value(s).
 
6703
      for (unsigned int r = 0; r < 10; r++)
 
6704
      {
 
6705
        values[2] += coefficients0[r]*basisvalues[r];
 
6706
      }// end loop over 'r'
 
6707
        break;
 
6708
      }
 
6709
    case 25:
 
6710
      {
 
6711
        
 
6712
      // Array of basisvalues.
 
6713
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6714
      
 
6715
      // Declare helper variables.
 
6716
      unsigned int rr = 0;
 
6717
      unsigned int ss = 0;
 
6718
      unsigned int tt = 0;
 
6719
      double tmp5 = 0.000000000000000;
 
6720
      double tmp6 = 0.000000000000000;
 
6721
      double tmp7 = 0.000000000000000;
 
6722
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6723
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6724
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6725
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6726
      double tmp4 = tmp3*tmp3;
 
6727
      
 
6728
      // Compute basisvalues.
 
6729
      basisvalues[0] = 1.000000000000000;
 
6730
      basisvalues[1] = tmp0;
 
6731
      for (unsigned int r = 1; r < 2; r++)
 
6732
      {
 
6733
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6734
        ss = r*(r + 1)*(r + 2)/6;
 
6735
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6736
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6737
      }// end loop over 'r'
 
6738
      for (unsigned int r = 0; r < 2; r++)
 
6739
      {
 
6740
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6741
        ss = r*(r + 1)*(r + 2)/6;
 
6742
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6743
      }// end loop over 'r'
 
6744
      for (unsigned int r = 0; r < 1; r++)
 
6745
      {
 
6746
        for (unsigned int s = 1; s < 2 - r; s++)
 
6747
        {
 
6748
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6749
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6750
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6751
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6752
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6753
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6754
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6755
        }// end loop over 's'
 
6756
      }// end loop over 'r'
 
6757
      for (unsigned int r = 0; r < 2; r++)
 
6758
      {
 
6759
        for (unsigned int s = 0; s < 2 - r; s++)
 
6760
        {
 
6761
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6762
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6763
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6764
        }// end loop over 's'
 
6765
      }// end loop over 'r'
 
6766
      for (unsigned int r = 0; r < 1; r++)
 
6767
      {
 
6768
        for (unsigned int s = 0; s < 1 - r; s++)
 
6769
        {
 
6770
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6771
          {
 
6772
            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;
 
6773
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6774
            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;
 
6775
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6776
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6777
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6778
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6779
          }// end loop over 't'
 
6780
        }// end loop over 's'
 
6781
      }// end loop over 'r'
 
6782
      for (unsigned int r = 0; r < 3; r++)
 
6783
      {
 
6784
        for (unsigned int s = 0; s < 3 - r; s++)
 
6785
        {
 
6786
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6787
          {
 
6788
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6789
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6790
          }// end loop over 't'
 
6791
        }// end loop over 's'
 
6792
      }// end loop over 'r'
 
6793
      
 
6794
      // Table(s) of coefficients.
 
6795
      static const double coefficients0[10] = \
 
6796
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
6797
      
 
6798
      // Compute value(s).
 
6799
      for (unsigned int r = 0; r < 10; r++)
 
6800
      {
 
6801
        values[2] += coefficients0[r]*basisvalues[r];
 
6802
      }// end loop over 'r'
 
6803
        break;
 
6804
      }
 
6805
    case 26:
 
6806
      {
 
6807
        
 
6808
      // Array of basisvalues.
 
6809
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6810
      
 
6811
      // Declare helper variables.
 
6812
      unsigned int rr = 0;
 
6813
      unsigned int ss = 0;
 
6814
      unsigned int tt = 0;
 
6815
      double tmp5 = 0.000000000000000;
 
6816
      double tmp6 = 0.000000000000000;
 
6817
      double tmp7 = 0.000000000000000;
 
6818
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6819
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6820
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6821
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6822
      double tmp4 = tmp3*tmp3;
 
6823
      
 
6824
      // Compute basisvalues.
 
6825
      basisvalues[0] = 1.000000000000000;
 
6826
      basisvalues[1] = tmp0;
 
6827
      for (unsigned int r = 1; r < 2; r++)
 
6828
      {
 
6829
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6830
        ss = r*(r + 1)*(r + 2)/6;
 
6831
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6832
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6833
      }// end loop over 'r'
 
6834
      for (unsigned int r = 0; r < 2; r++)
 
6835
      {
 
6836
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6837
        ss = r*(r + 1)*(r + 2)/6;
 
6838
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6839
      }// end loop over 'r'
 
6840
      for (unsigned int r = 0; r < 1; r++)
 
6841
      {
 
6842
        for (unsigned int s = 1; s < 2 - r; s++)
 
6843
        {
 
6844
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6845
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6846
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6847
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6848
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6849
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6850
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6851
        }// end loop over 's'
 
6852
      }// end loop over 'r'
 
6853
      for (unsigned int r = 0; r < 2; r++)
 
6854
      {
 
6855
        for (unsigned int s = 0; s < 2 - r; s++)
 
6856
        {
 
6857
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6858
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6859
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6860
        }// end loop over 's'
 
6861
      }// end loop over 'r'
 
6862
      for (unsigned int r = 0; r < 1; r++)
 
6863
      {
 
6864
        for (unsigned int s = 0; s < 1 - r; s++)
 
6865
        {
 
6866
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6867
          {
 
6868
            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;
 
6869
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6870
            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;
 
6871
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6872
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6873
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6874
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6875
          }// end loop over 't'
 
6876
        }// end loop over 's'
 
6877
      }// end loop over 'r'
 
6878
      for (unsigned int r = 0; r < 3; r++)
 
6879
      {
 
6880
        for (unsigned int s = 0; s < 3 - r; s++)
 
6881
        {
 
6882
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6883
          {
 
6884
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6885
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6886
          }// end loop over 't'
 
6887
        }// end loop over 's'
 
6888
      }// end loop over 'r'
 
6889
      
 
6890
      // Table(s) of coefficients.
 
6891
      static const double coefficients0[10] = \
 
6892
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
6893
      
 
6894
      // Compute value(s).
 
6895
      for (unsigned int r = 0; r < 10; r++)
 
6896
      {
 
6897
        values[2] += coefficients0[r]*basisvalues[r];
 
6898
      }// end loop over 'r'
 
6899
        break;
 
6900
      }
 
6901
    case 27:
 
6902
      {
 
6903
        
 
6904
      // Array of basisvalues.
 
6905
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
6906
      
 
6907
      // Declare helper variables.
 
6908
      unsigned int rr = 0;
 
6909
      unsigned int ss = 0;
 
6910
      unsigned int tt = 0;
 
6911
      double tmp5 = 0.000000000000000;
 
6912
      double tmp6 = 0.000000000000000;
 
6913
      double tmp7 = 0.000000000000000;
 
6914
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
6915
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
6916
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
6917
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
6918
      double tmp4 = tmp3*tmp3;
 
6919
      
 
6920
      // Compute basisvalues.
 
6921
      basisvalues[0] = 1.000000000000000;
 
6922
      basisvalues[1] = tmp0;
 
6923
      for (unsigned int r = 1; r < 2; r++)
 
6924
      {
 
6925
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
6926
        ss = r*(r + 1)*(r + 2)/6;
 
6927
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
6928
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
6929
      }// end loop over 'r'
 
6930
      for (unsigned int r = 0; r < 2; r++)
 
6931
      {
 
6932
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
6933
        ss = r*(r + 1)*(r + 2)/6;
 
6934
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
6935
      }// end loop over 'r'
 
6936
      for (unsigned int r = 0; r < 1; r++)
 
6937
      {
 
6938
        for (unsigned int s = 1; s < 2 - r; s++)
 
6939
        {
 
6940
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
6941
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6942
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
6943
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6944
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6945
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
6946
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
6947
        }// end loop over 's'
 
6948
      }// end loop over 'r'
 
6949
      for (unsigned int r = 0; r < 2; r++)
 
6950
      {
 
6951
        for (unsigned int s = 0; s < 2 - r; s++)
 
6952
        {
 
6953
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
6954
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
6955
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
6956
        }// end loop over 's'
 
6957
      }// end loop over 'r'
 
6958
      for (unsigned int r = 0; r < 1; r++)
 
6959
      {
 
6960
        for (unsigned int s = 0; s < 1 - r; s++)
 
6961
        {
 
6962
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
6963
          {
 
6964
            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;
 
6965
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6966
            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;
 
6967
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6968
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6969
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
6970
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
6971
          }// end loop over 't'
 
6972
        }// end loop over 's'
 
6973
      }// end loop over 'r'
 
6974
      for (unsigned int r = 0; r < 3; r++)
 
6975
      {
 
6976
        for (unsigned int s = 0; s < 3 - r; s++)
 
6977
        {
 
6978
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
6979
          {
 
6980
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
6981
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
6982
          }// end loop over 't'
 
6983
        }// end loop over 's'
 
6984
      }// end loop over 'r'
 
6985
      
 
6986
      // Table(s) of coefficients.
 
6987
      static const double coefficients0[10] = \
 
6988
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
6989
      
 
6990
      // Compute value(s).
 
6991
      for (unsigned int r = 0; r < 10; r++)
 
6992
      {
 
6993
        values[2] += coefficients0[r]*basisvalues[r];
 
6994
      }// end loop over 'r'
 
6995
        break;
 
6996
      }
 
6997
    case 28:
 
6998
      {
 
6999
        
 
7000
      // Array of basisvalues.
 
7001
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
7002
      
 
7003
      // Declare helper variables.
 
7004
      unsigned int rr = 0;
 
7005
      unsigned int ss = 0;
 
7006
      unsigned int tt = 0;
 
7007
      double tmp5 = 0.000000000000000;
 
7008
      double tmp6 = 0.000000000000000;
 
7009
      double tmp7 = 0.000000000000000;
 
7010
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
7011
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
7012
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
7013
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
7014
      double tmp4 = tmp3*tmp3;
 
7015
      
 
7016
      // Compute basisvalues.
 
7017
      basisvalues[0] = 1.000000000000000;
 
7018
      basisvalues[1] = tmp0;
 
7019
      for (unsigned int r = 1; r < 2; r++)
 
7020
      {
 
7021
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7022
        ss = r*(r + 1)*(r + 2)/6;
 
7023
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7024
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
7025
      }// end loop over 'r'
 
7026
      for (unsigned int r = 0; r < 2; r++)
 
7027
      {
 
7028
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7029
        ss = r*(r + 1)*(r + 2)/6;
 
7030
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
7031
      }// end loop over 'r'
 
7032
      for (unsigned int r = 0; r < 1; r++)
 
7033
      {
 
7034
        for (unsigned int s = 1; s < 2 - r; s++)
 
7035
        {
 
7036
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7037
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7038
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7039
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7040
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7041
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7042
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7043
        }// end loop over 's'
 
7044
      }// end loop over 'r'
 
7045
      for (unsigned int r = 0; r < 2; r++)
 
7046
      {
 
7047
        for (unsigned int s = 0; s < 2 - r; s++)
 
7048
        {
 
7049
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7050
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7051
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
7052
        }// end loop over 's'
 
7053
      }// end loop over 'r'
 
7054
      for (unsigned int r = 0; r < 1; r++)
 
7055
      {
 
7056
        for (unsigned int s = 0; s < 1 - r; s++)
 
7057
        {
 
7058
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7059
          {
 
7060
            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;
 
7061
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7062
            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;
 
7063
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7064
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7065
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7066
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7067
          }// end loop over 't'
 
7068
        }// end loop over 's'
 
7069
      }// end loop over 'r'
 
7070
      for (unsigned int r = 0; r < 3; r++)
 
7071
      {
 
7072
        for (unsigned int s = 0; s < 3 - r; s++)
 
7073
        {
 
7074
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7075
          {
 
7076
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7077
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
7078
          }// end loop over 't'
 
7079
        }// end loop over 's'
 
7080
      }// end loop over 'r'
 
7081
      
 
7082
      // Table(s) of coefficients.
 
7083
      static const double coefficients0[10] = \
 
7084
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
7085
      
 
7086
      // Compute value(s).
 
7087
      for (unsigned int r = 0; r < 10; r++)
 
7088
      {
 
7089
        values[2] += coefficients0[r]*basisvalues[r];
 
7090
      }// end loop over 'r'
 
7091
        break;
 
7092
      }
 
7093
    case 29:
 
7094
      {
 
7095
        
 
7096
      // Array of basisvalues.
 
7097
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
7098
      
 
7099
      // Declare helper variables.
 
7100
      unsigned int rr = 0;
 
7101
      unsigned int ss = 0;
 
7102
      unsigned int tt = 0;
 
7103
      double tmp5 = 0.000000000000000;
 
7104
      double tmp6 = 0.000000000000000;
 
7105
      double tmp7 = 0.000000000000000;
 
7106
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
7107
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
7108
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
7109
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
7110
      double tmp4 = tmp3*tmp3;
 
7111
      
 
7112
      // Compute basisvalues.
 
7113
      basisvalues[0] = 1.000000000000000;
 
7114
      basisvalues[1] = tmp0;
 
7115
      for (unsigned int r = 1; r < 2; r++)
 
7116
      {
 
7117
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7118
        ss = r*(r + 1)*(r + 2)/6;
 
7119
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7120
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
7121
      }// end loop over 'r'
 
7122
      for (unsigned int r = 0; r < 2; r++)
 
7123
      {
 
7124
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7125
        ss = r*(r + 1)*(r + 2)/6;
 
7126
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
7127
      }// end loop over 'r'
 
7128
      for (unsigned int r = 0; r < 1; r++)
 
7129
      {
 
7130
        for (unsigned int s = 1; s < 2 - r; s++)
 
7131
        {
 
7132
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7133
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7134
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7135
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7136
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7137
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7138
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7139
        }// end loop over 's'
 
7140
      }// end loop over 'r'
 
7141
      for (unsigned int r = 0; r < 2; r++)
 
7142
      {
 
7143
        for (unsigned int s = 0; s < 2 - r; s++)
 
7144
        {
 
7145
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7146
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7147
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
7148
        }// end loop over 's'
 
7149
      }// end loop over 'r'
 
7150
      for (unsigned int r = 0; r < 1; r++)
 
7151
      {
 
7152
        for (unsigned int s = 0; s < 1 - r; s++)
 
7153
        {
 
7154
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7155
          {
 
7156
            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;
 
7157
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7158
            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;
 
7159
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7160
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7161
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7162
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7163
          }// end loop over 't'
 
7164
        }// end loop over 's'
 
7165
      }// end loop over 'r'
 
7166
      for (unsigned int r = 0; r < 3; r++)
 
7167
      {
 
7168
        for (unsigned int s = 0; s < 3 - r; s++)
 
7169
        {
 
7170
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7171
          {
 
7172
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7173
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
7174
          }// end loop over 't'
 
7175
        }// end loop over 's'
 
7176
      }// end loop over 'r'
 
7177
      
 
7178
      // Table(s) of coefficients.
 
7179
      static const double coefficients0[10] = \
 
7180
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
7181
      
 
7182
      // Compute value(s).
 
7183
      for (unsigned int r = 0; r < 10; r++)
 
7184
      {
 
7185
        values[2] += coefficients0[r]*basisvalues[r];
 
7186
      }// end loop over 'r'
 
7187
        break;
 
7188
      }
 
7189
    }
 
7190
    
 
7191
  }
 
7192
 
 
7193
  /// Evaluate all basis functions at given point in cell
 
7194
  virtual void evaluate_basis_all(double* values,
 
7195
                                  const double* coordinates,
 
7196
                                  const ufc::cell& c) const
 
7197
  {
 
7198
    // Helper variable to hold values of a single dof.
 
7199
    double dof_values[3] = {0.000000000000000, 0.000000000000000, 0.000000000000000};
 
7200
    
 
7201
    // Loop dofs and call evaluate_basis.
 
7202
    for (unsigned int r = 0; r < 30; r++)
 
7203
    {
 
7204
      evaluate_basis(r, dof_values, coordinates, c);
 
7205
      for (unsigned int s = 0; s < 3; s++)
 
7206
      {
 
7207
        values[r*3 + s] = dof_values[s];
 
7208
      }// end loop over 's'
 
7209
    }// end loop over 'r'
 
7210
  }
 
7211
 
 
7212
  /// Evaluate order n derivatives of basis function i at given point in cell
 
7213
  virtual void evaluate_basis_derivatives(unsigned int i,
 
7214
                                          unsigned int n,
 
7215
                                          double* values,
 
7216
                                          const double* coordinates,
 
7217
                                          const ufc::cell& c) const
 
7218
  {
 
7219
    // Extract vertex coordinates
 
7220
    const double * const * x = c.coordinates;
 
7221
    
 
7222
    // Compute Jacobian of affine map from reference cell
 
7223
    const double J_00 = x[1][0] - x[0][0];
 
7224
    const double J_01 = x[2][0] - x[0][0];
 
7225
    const double J_02 = x[3][0] - x[0][0];
 
7226
    const double J_10 = x[1][1] - x[0][1];
 
7227
    const double J_11 = x[2][1] - x[0][1];
 
7228
    const double J_12 = x[3][1] - x[0][1];
 
7229
    const double J_20 = x[1][2] - x[0][2];
 
7230
    const double J_21 = x[2][2] - x[0][2];
 
7231
    const double J_22 = x[3][2] - x[0][2];
 
7232
    
 
7233
    // Compute sub determinants
 
7234
    const double d_00 = J_11*J_22 - J_12*J_21;
 
7235
    const double d_01 = J_12*J_20 - J_10*J_22;
 
7236
    const double d_02 = J_10*J_21 - J_11*J_20;
 
7237
    const double d_10 = J_02*J_21 - J_01*J_22;
 
7238
    const double d_11 = J_00*J_22 - J_02*J_20;
 
7239
    const double d_12 = J_01*J_20 - J_00*J_21;
 
7240
    const double d_20 = J_01*J_12 - J_02*J_11;
 
7241
    const double d_21 = J_02*J_10 - J_00*J_12;
 
7242
    const double d_22 = J_00*J_11 - J_01*J_10;
 
7243
    
 
7244
    // Compute determinant of Jacobian
 
7245
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
7246
    
 
7247
    // Compute inverse of Jacobian
 
7248
    const double K_00 = d_00 / detJ;
 
7249
    const double K_01 = d_10 / detJ;
 
7250
    const double K_02 = d_20 / detJ;
 
7251
    const double K_10 = d_01 / detJ;
 
7252
    const double K_11 = d_11 / detJ;
 
7253
    const double K_12 = d_21 / detJ;
 
7254
    const double K_20 = d_02 / detJ;
 
7255
    const double K_21 = d_12 / detJ;
 
7256
    const double K_22 = d_22 / detJ;
 
7257
    
 
7258
    // Compute constants
 
7259
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
7260
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
7261
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
7262
    
 
7263
    // Get coordinates and map to the reference (FIAT) element
 
7264
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
7265
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
7266
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
7267
    
 
7268
    
 
7269
    // Compute number of derivatives.
 
7270
    unsigned int num_derivatives = 1;
 
7271
    for (unsigned int r = 0; r < n; r++)
 
7272
    {
 
7273
      num_derivatives *= 3;
 
7274
    }// end loop over 'r'
 
7275
    
 
7276
    // Declare pointer to two dimensional array that holds combinations of derivatives and initialise
 
7277
    unsigned int **combinations = new unsigned int *[num_derivatives];
 
7278
    for (unsigned int row = 0; row < num_derivatives; row++)
 
7279
    {
 
7280
      combinations[row] = new unsigned int [n];
 
7281
      for (unsigned int col = 0; col < n; col++)
 
7282
        combinations[row][col] = 0;
 
7283
    }
 
7284
    
 
7285
    // Generate combinations of derivatives
 
7286
    for (unsigned int row = 1; row < num_derivatives; row++)
 
7287
    {
 
7288
      for (unsigned int num = 0; num < row; num++)
 
7289
      {
 
7290
        for (unsigned int col = n-1; col+1 > 0; col--)
 
7291
        {
 
7292
          if (combinations[row][col] + 1 > 2)
 
7293
            combinations[row][col] = 0;
 
7294
          else
 
7295
          {
 
7296
            combinations[row][col] += 1;
 
7297
            break;
 
7298
          }
 
7299
        }
 
7300
      }
 
7301
    }
 
7302
    
 
7303
    // Compute inverse of Jacobian
 
7304
    const double Jinv[3][3] = {{K_00, K_01, K_02}, {K_10, K_11, K_12}, {K_20, K_21, K_22}};
 
7305
    
 
7306
    // Declare transformation matrix
 
7307
    // Declare pointer to two dimensional array and initialise
 
7308
    double **transform = new double *[num_derivatives];
 
7309
    
 
7310
    for (unsigned int j = 0; j < num_derivatives; j++)
 
7311
    {
 
7312
      transform[j] = new double [num_derivatives];
 
7313
      for (unsigned int k = 0; k < num_derivatives; k++)
 
7314
        transform[j][k] = 1;
 
7315
    }
 
7316
    
 
7317
    // Construct transformation matrix
 
7318
    for (unsigned int row = 0; row < num_derivatives; row++)
 
7319
    {
 
7320
      for (unsigned int col = 0; col < num_derivatives; col++)
 
7321
      {
 
7322
        for (unsigned int k = 0; k < n; k++)
 
7323
          transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
 
7324
      }
 
7325
    }
 
7326
    
 
7327
    // Reset values. Assuming that values is always an array.
 
7328
    for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
7329
    {
 
7330
      values[r] = 0.000000000000000;
 
7331
    }// end loop over 'r'
 
7332
    
 
7333
    switch (i)
 
7334
    {
 
7335
    case 0:
 
7336
      {
 
7337
        
 
7338
      // Array of basisvalues.
 
7339
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
7340
      
 
7341
      // Declare helper variables.
 
7342
      unsigned int rr = 0;
 
7343
      unsigned int ss = 0;
 
7344
      unsigned int tt = 0;
 
7345
      double tmp5 = 0.000000000000000;
 
7346
      double tmp6 = 0.000000000000000;
 
7347
      double tmp7 = 0.000000000000000;
 
7348
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
7349
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
7350
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
7351
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
7352
      double tmp4 = tmp3*tmp3;
 
7353
      
 
7354
      // Compute basisvalues.
 
7355
      basisvalues[0] = 1.000000000000000;
 
7356
      basisvalues[1] = tmp0;
 
7357
      for (unsigned int r = 1; r < 2; r++)
 
7358
      {
 
7359
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7360
        ss = r*(r + 1)*(r + 2)/6;
 
7361
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7362
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
7363
      }// end loop over 'r'
 
7364
      for (unsigned int r = 0; r < 2; r++)
 
7365
      {
 
7366
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7367
        ss = r*(r + 1)*(r + 2)/6;
 
7368
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
7369
      }// end loop over 'r'
 
7370
      for (unsigned int r = 0; r < 1; r++)
 
7371
      {
 
7372
        for (unsigned int s = 1; s < 2 - r; s++)
 
7373
        {
 
7374
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7375
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7376
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7377
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7378
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7379
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7380
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7381
        }// end loop over 's'
 
7382
      }// end loop over 'r'
 
7383
      for (unsigned int r = 0; r < 2; r++)
 
7384
      {
 
7385
        for (unsigned int s = 0; s < 2 - r; s++)
 
7386
        {
 
7387
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7388
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7389
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
7390
        }// end loop over 's'
 
7391
      }// end loop over 'r'
 
7392
      for (unsigned int r = 0; r < 1; r++)
 
7393
      {
 
7394
        for (unsigned int s = 0; s < 1 - r; s++)
 
7395
        {
 
7396
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7397
          {
 
7398
            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;
 
7399
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7400
            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;
 
7401
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7402
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7403
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7404
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7405
          }// end loop over 't'
 
7406
        }// end loop over 's'
 
7407
      }// end loop over 'r'
 
7408
      for (unsigned int r = 0; r < 3; r++)
 
7409
      {
 
7410
        for (unsigned int s = 0; s < 3 - r; s++)
 
7411
        {
 
7412
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7413
          {
 
7414
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7415
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
7416
          }// end loop over 't'
 
7417
        }// end loop over 's'
 
7418
      }// end loop over 'r'
 
7419
      
 
7420
      // Table(s) of coefficients.
 
7421
      static const double coefficients0[10] = \
 
7422
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
7423
      
 
7424
      // Tables of derivatives of the polynomial base (transpose).
 
7425
      static const double dmats0[10][10] = \
 
7426
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7427
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7428
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7429
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7430
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7431
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7432
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7433
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7434
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7435
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7436
      
 
7437
      static const double dmats1[10][10] = \
 
7438
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7439
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7440
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7441
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7442
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7443
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7444
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7445
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7446
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7447
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7448
      
 
7449
      static const double dmats2[10][10] = \
 
7450
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7451
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7452
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7453
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7454
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7455
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7456
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7457
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7458
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7459
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7460
      
 
7461
      // Compute reference derivatives.
 
7462
      // Declare pointer to array of derivatives on FIAT element.
 
7463
      double *derivatives = new double[num_derivatives];
 
7464
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7465
      {
 
7466
        derivatives[r] = 0.000000000000000;
 
7467
      }// end loop over 'r'
 
7468
      
 
7469
      // Declare derivative matrix (of polynomial basis).
 
7470
      double dmats[10][10] = \
 
7471
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7472
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7473
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7474
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7475
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7476
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7477
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7478
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
7479
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
7480
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
7481
      
 
7482
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
7483
      double dmats_old[10][10] = \
 
7484
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7485
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7486
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7487
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7488
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7489
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7490
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7491
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
7492
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
7493
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
7494
      
 
7495
      // Loop possible derivatives.
 
7496
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7497
      {
 
7498
        // Resetting dmats values to compute next derivative.
 
7499
        for (unsigned int t = 0; t < 10; t++)
 
7500
        {
 
7501
          for (unsigned int u = 0; u < 10; u++)
 
7502
          {
 
7503
            dmats[t][u] = 0.000000000000000;
 
7504
            if (t == u)
 
7505
            {
 
7506
            dmats[t][u] = 1.000000000000000;
 
7507
            }
 
7508
            
 
7509
          }// end loop over 'u'
 
7510
        }// end loop over 't'
 
7511
        
 
7512
        // Looping derivative order to generate dmats.
 
7513
        for (unsigned int s = 0; s < n; s++)
 
7514
        {
 
7515
          // Updating dmats_old with new values and resetting dmats.
 
7516
          for (unsigned int t = 0; t < 10; t++)
 
7517
          {
 
7518
            for (unsigned int u = 0; u < 10; u++)
 
7519
            {
 
7520
              dmats_old[t][u] = dmats[t][u];
 
7521
              dmats[t][u] = 0.000000000000000;
 
7522
            }// end loop over 'u'
 
7523
          }// end loop over 't'
 
7524
          
 
7525
          // Update dmats using an inner product.
 
7526
          if (combinations[r][s] == 0)
 
7527
          {
 
7528
          for (unsigned int t = 0; t < 10; t++)
 
7529
          {
 
7530
            for (unsigned int u = 0; u < 10; u++)
 
7531
            {
 
7532
              for (unsigned int tu = 0; tu < 10; tu++)
 
7533
              {
 
7534
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
7535
              }// end loop over 'tu'
 
7536
            }// end loop over 'u'
 
7537
          }// end loop over 't'
 
7538
          }
 
7539
          
 
7540
          if (combinations[r][s] == 1)
 
7541
          {
 
7542
          for (unsigned int t = 0; t < 10; t++)
 
7543
          {
 
7544
            for (unsigned int u = 0; u < 10; u++)
 
7545
            {
 
7546
              for (unsigned int tu = 0; tu < 10; tu++)
 
7547
              {
 
7548
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
7549
              }// end loop over 'tu'
 
7550
            }// end loop over 'u'
 
7551
          }// end loop over 't'
 
7552
          }
 
7553
          
 
7554
          if (combinations[r][s] == 2)
 
7555
          {
 
7556
          for (unsigned int t = 0; t < 10; t++)
 
7557
          {
 
7558
            for (unsigned int u = 0; u < 10; u++)
 
7559
            {
 
7560
              for (unsigned int tu = 0; tu < 10; tu++)
 
7561
              {
 
7562
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
7563
              }// end loop over 'tu'
 
7564
            }// end loop over 'u'
 
7565
          }// end loop over 't'
 
7566
          }
 
7567
          
 
7568
        }// end loop over 's'
 
7569
        for (unsigned int s = 0; s < 10; s++)
 
7570
        {
 
7571
          for (unsigned int t = 0; t < 10; t++)
 
7572
          {
 
7573
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
7574
          }// end loop over 't'
 
7575
        }// end loop over 's'
 
7576
      }// end loop over 'r'
 
7577
      
 
7578
      // Transform derivatives back to physical element
 
7579
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7580
      {
 
7581
        for (unsigned int s = 0; s < num_derivatives; s++)
 
7582
        {
 
7583
          values[r] += transform[r][s]*derivatives[s];
 
7584
        }// end loop over 's'
 
7585
      }// end loop over 'r'
 
7586
      
 
7587
      // Delete pointer to array of derivatives on FIAT element
 
7588
      delete [] derivatives;
 
7589
      
 
7590
      // Delete pointer to array of combinations of derivatives and transform
 
7591
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7592
      {
 
7593
        delete [] combinations[r];
 
7594
      }// end loop over 'r'
 
7595
      delete [] combinations;
 
7596
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7597
      {
 
7598
        delete [] transform[r];
 
7599
      }// end loop over 'r'
 
7600
      delete [] transform;
 
7601
        break;
 
7602
      }
 
7603
    case 1:
 
7604
      {
 
7605
        
 
7606
      // Array of basisvalues.
 
7607
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
7608
      
 
7609
      // Declare helper variables.
 
7610
      unsigned int rr = 0;
 
7611
      unsigned int ss = 0;
 
7612
      unsigned int tt = 0;
 
7613
      double tmp5 = 0.000000000000000;
 
7614
      double tmp6 = 0.000000000000000;
 
7615
      double tmp7 = 0.000000000000000;
 
7616
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
7617
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
7618
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
7619
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
7620
      double tmp4 = tmp3*tmp3;
 
7621
      
 
7622
      // Compute basisvalues.
 
7623
      basisvalues[0] = 1.000000000000000;
 
7624
      basisvalues[1] = tmp0;
 
7625
      for (unsigned int r = 1; r < 2; r++)
 
7626
      {
 
7627
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7628
        ss = r*(r + 1)*(r + 2)/6;
 
7629
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7630
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
7631
      }// end loop over 'r'
 
7632
      for (unsigned int r = 0; r < 2; r++)
 
7633
      {
 
7634
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7635
        ss = r*(r + 1)*(r + 2)/6;
 
7636
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
7637
      }// end loop over 'r'
 
7638
      for (unsigned int r = 0; r < 1; r++)
 
7639
      {
 
7640
        for (unsigned int s = 1; s < 2 - r; s++)
 
7641
        {
 
7642
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7643
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7644
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7645
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7646
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7647
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7648
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7649
        }// end loop over 's'
 
7650
      }// end loop over 'r'
 
7651
      for (unsigned int r = 0; r < 2; r++)
 
7652
      {
 
7653
        for (unsigned int s = 0; s < 2 - r; s++)
 
7654
        {
 
7655
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7656
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7657
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
7658
        }// end loop over 's'
 
7659
      }// end loop over 'r'
 
7660
      for (unsigned int r = 0; r < 1; r++)
 
7661
      {
 
7662
        for (unsigned int s = 0; s < 1 - r; s++)
 
7663
        {
 
7664
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7665
          {
 
7666
            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;
 
7667
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7668
            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;
 
7669
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7670
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7671
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7672
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7673
          }// end loop over 't'
 
7674
        }// end loop over 's'
 
7675
      }// end loop over 'r'
 
7676
      for (unsigned int r = 0; r < 3; r++)
 
7677
      {
 
7678
        for (unsigned int s = 0; s < 3 - r; s++)
 
7679
        {
 
7680
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7681
          {
 
7682
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7683
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
7684
          }// end loop over 't'
 
7685
        }// end loop over 's'
 
7686
      }// end loop over 'r'
 
7687
      
 
7688
      // Table(s) of coefficients.
 
7689
      static const double coefficients0[10] = \
 
7690
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
7691
      
 
7692
      // Tables of derivatives of the polynomial base (transpose).
 
7693
      static const double dmats0[10][10] = \
 
7694
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7695
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7696
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7697
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7698
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7699
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7700
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7701
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7702
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7703
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7704
      
 
7705
      static const double dmats1[10][10] = \
 
7706
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7707
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7708
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7709
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7710
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7711
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7712
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7713
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7714
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7715
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7716
      
 
7717
      static const double dmats2[10][10] = \
 
7718
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7719
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7720
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7721
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7722
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7723
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7724
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7725
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7726
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7727
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7728
      
 
7729
      // Compute reference derivatives.
 
7730
      // Declare pointer to array of derivatives on FIAT element.
 
7731
      double *derivatives = new double[num_derivatives];
 
7732
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7733
      {
 
7734
        derivatives[r] = 0.000000000000000;
 
7735
      }// end loop over 'r'
 
7736
      
 
7737
      // Declare derivative matrix (of polynomial basis).
 
7738
      double dmats[10][10] = \
 
7739
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7740
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7741
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7742
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7743
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7744
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7745
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7746
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
7747
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
7748
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
7749
      
 
7750
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
7751
      double dmats_old[10][10] = \
 
7752
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7753
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7754
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7755
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7756
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7757
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7758
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7759
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
7760
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
7761
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
7762
      
 
7763
      // Loop possible derivatives.
 
7764
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7765
      {
 
7766
        // Resetting dmats values to compute next derivative.
 
7767
        for (unsigned int t = 0; t < 10; t++)
 
7768
        {
 
7769
          for (unsigned int u = 0; u < 10; u++)
 
7770
          {
 
7771
            dmats[t][u] = 0.000000000000000;
 
7772
            if (t == u)
 
7773
            {
 
7774
            dmats[t][u] = 1.000000000000000;
 
7775
            }
 
7776
            
 
7777
          }// end loop over 'u'
 
7778
        }// end loop over 't'
 
7779
        
 
7780
        // Looping derivative order to generate dmats.
 
7781
        for (unsigned int s = 0; s < n; s++)
 
7782
        {
 
7783
          // Updating dmats_old with new values and resetting dmats.
 
7784
          for (unsigned int t = 0; t < 10; t++)
 
7785
          {
 
7786
            for (unsigned int u = 0; u < 10; u++)
 
7787
            {
 
7788
              dmats_old[t][u] = dmats[t][u];
 
7789
              dmats[t][u] = 0.000000000000000;
 
7790
            }// end loop over 'u'
 
7791
          }// end loop over 't'
 
7792
          
 
7793
          // Update dmats using an inner product.
 
7794
          if (combinations[r][s] == 0)
 
7795
          {
 
7796
          for (unsigned int t = 0; t < 10; t++)
 
7797
          {
 
7798
            for (unsigned int u = 0; u < 10; u++)
 
7799
            {
 
7800
              for (unsigned int tu = 0; tu < 10; tu++)
 
7801
              {
 
7802
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
7803
              }// end loop over 'tu'
 
7804
            }// end loop over 'u'
 
7805
          }// end loop over 't'
 
7806
          }
 
7807
          
 
7808
          if (combinations[r][s] == 1)
 
7809
          {
 
7810
          for (unsigned int t = 0; t < 10; t++)
 
7811
          {
 
7812
            for (unsigned int u = 0; u < 10; u++)
 
7813
            {
 
7814
              for (unsigned int tu = 0; tu < 10; tu++)
 
7815
              {
 
7816
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
7817
              }// end loop over 'tu'
 
7818
            }// end loop over 'u'
 
7819
          }// end loop over 't'
 
7820
          }
 
7821
          
 
7822
          if (combinations[r][s] == 2)
 
7823
          {
 
7824
          for (unsigned int t = 0; t < 10; t++)
 
7825
          {
 
7826
            for (unsigned int u = 0; u < 10; u++)
 
7827
            {
 
7828
              for (unsigned int tu = 0; tu < 10; tu++)
 
7829
              {
 
7830
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
7831
              }// end loop over 'tu'
 
7832
            }// end loop over 'u'
 
7833
          }// end loop over 't'
 
7834
          }
 
7835
          
 
7836
        }// end loop over 's'
 
7837
        for (unsigned int s = 0; s < 10; s++)
 
7838
        {
 
7839
          for (unsigned int t = 0; t < 10; t++)
 
7840
          {
 
7841
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
7842
          }// end loop over 't'
 
7843
        }// end loop over 's'
 
7844
      }// end loop over 'r'
 
7845
      
 
7846
      // Transform derivatives back to physical element
 
7847
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7848
      {
 
7849
        for (unsigned int s = 0; s < num_derivatives; s++)
 
7850
        {
 
7851
          values[r] += transform[r][s]*derivatives[s];
 
7852
        }// end loop over 's'
 
7853
      }// end loop over 'r'
 
7854
      
 
7855
      // Delete pointer to array of derivatives on FIAT element
 
7856
      delete [] derivatives;
 
7857
      
 
7858
      // Delete pointer to array of combinations of derivatives and transform
 
7859
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7860
      {
 
7861
        delete [] combinations[r];
 
7862
      }// end loop over 'r'
 
7863
      delete [] combinations;
 
7864
      for (unsigned int r = 0; r < num_derivatives; r++)
 
7865
      {
 
7866
        delete [] transform[r];
 
7867
      }// end loop over 'r'
 
7868
      delete [] transform;
 
7869
        break;
 
7870
      }
 
7871
    case 2:
 
7872
      {
 
7873
        
 
7874
      // Array of basisvalues.
 
7875
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
7876
      
 
7877
      // Declare helper variables.
 
7878
      unsigned int rr = 0;
 
7879
      unsigned int ss = 0;
 
7880
      unsigned int tt = 0;
 
7881
      double tmp5 = 0.000000000000000;
 
7882
      double tmp6 = 0.000000000000000;
 
7883
      double tmp7 = 0.000000000000000;
 
7884
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
7885
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
7886
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
7887
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
7888
      double tmp4 = tmp3*tmp3;
 
7889
      
 
7890
      // Compute basisvalues.
 
7891
      basisvalues[0] = 1.000000000000000;
 
7892
      basisvalues[1] = tmp0;
 
7893
      for (unsigned int r = 1; r < 2; r++)
 
7894
      {
 
7895
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
7896
        ss = r*(r + 1)*(r + 2)/6;
 
7897
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
7898
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
7899
      }// end loop over 'r'
 
7900
      for (unsigned int r = 0; r < 2; r++)
 
7901
      {
 
7902
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
7903
        ss = r*(r + 1)*(r + 2)/6;
 
7904
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
7905
      }// end loop over 'r'
 
7906
      for (unsigned int r = 0; r < 1; r++)
 
7907
      {
 
7908
        for (unsigned int s = 1; s < 2 - r; s++)
 
7909
        {
 
7910
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
7911
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7912
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
7913
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7914
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7915
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
7916
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
7917
        }// end loop over 's'
 
7918
      }// end loop over 'r'
 
7919
      for (unsigned int r = 0; r < 2; r++)
 
7920
      {
 
7921
        for (unsigned int s = 0; s < 2 - r; s++)
 
7922
        {
 
7923
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
7924
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
7925
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
7926
        }// end loop over 's'
 
7927
      }// end loop over 'r'
 
7928
      for (unsigned int r = 0; r < 1; r++)
 
7929
      {
 
7930
        for (unsigned int s = 0; s < 1 - r; s++)
 
7931
        {
 
7932
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
7933
          {
 
7934
            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;
 
7935
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7936
            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;
 
7937
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7938
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7939
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
7940
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
7941
          }// end loop over 't'
 
7942
        }// end loop over 's'
 
7943
      }// end loop over 'r'
 
7944
      for (unsigned int r = 0; r < 3; r++)
 
7945
      {
 
7946
        for (unsigned int s = 0; s < 3 - r; s++)
 
7947
        {
 
7948
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
7949
          {
 
7950
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
7951
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
7952
          }// end loop over 't'
 
7953
        }// end loop over 's'
 
7954
      }// end loop over 'r'
 
7955
      
 
7956
      // Table(s) of coefficients.
 
7957
      static const double coefficients0[10] = \
 
7958
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
7959
      
 
7960
      // Tables of derivatives of the polynomial base (transpose).
 
7961
      static const double dmats0[10][10] = \
 
7962
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7963
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7964
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7965
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7966
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7967
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7968
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7969
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7970
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7971
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7972
      
 
7973
      static const double dmats1[10][10] = \
 
7974
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7975
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7976
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7977
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7978
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7979
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7980
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7981
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7982
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7983
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7984
      
 
7985
      static const double dmats2[10][10] = \
 
7986
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7987
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7988
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7989
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7990
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7991
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7992
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7993
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7994
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
7995
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
7996
      
 
7997
      // Compute reference derivatives.
 
7998
      // Declare pointer to array of derivatives on FIAT element.
 
7999
      double *derivatives = new double[num_derivatives];
 
8000
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8001
      {
 
8002
        derivatives[r] = 0.000000000000000;
 
8003
      }// end loop over 'r'
 
8004
      
 
8005
      // Declare derivative matrix (of polynomial basis).
 
8006
      double dmats[10][10] = \
 
8007
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8008
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8009
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8010
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8011
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8012
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8013
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8014
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8015
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8016
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8017
      
 
8018
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8019
      double dmats_old[10][10] = \
 
8020
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8021
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8022
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8023
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8024
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8025
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8026
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8027
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8028
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8029
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8030
      
 
8031
      // Loop possible derivatives.
 
8032
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8033
      {
 
8034
        // Resetting dmats values to compute next derivative.
 
8035
        for (unsigned int t = 0; t < 10; t++)
 
8036
        {
 
8037
          for (unsigned int u = 0; u < 10; u++)
 
8038
          {
 
8039
            dmats[t][u] = 0.000000000000000;
 
8040
            if (t == u)
 
8041
            {
 
8042
            dmats[t][u] = 1.000000000000000;
 
8043
            }
 
8044
            
 
8045
          }// end loop over 'u'
 
8046
        }// end loop over 't'
 
8047
        
 
8048
        // Looping derivative order to generate dmats.
 
8049
        for (unsigned int s = 0; s < n; s++)
 
8050
        {
 
8051
          // Updating dmats_old with new values and resetting dmats.
 
8052
          for (unsigned int t = 0; t < 10; t++)
 
8053
          {
 
8054
            for (unsigned int u = 0; u < 10; u++)
 
8055
            {
 
8056
              dmats_old[t][u] = dmats[t][u];
 
8057
              dmats[t][u] = 0.000000000000000;
 
8058
            }// end loop over 'u'
 
8059
          }// end loop over 't'
 
8060
          
 
8061
          // Update dmats using an inner product.
 
8062
          if (combinations[r][s] == 0)
 
8063
          {
 
8064
          for (unsigned int t = 0; t < 10; t++)
 
8065
          {
 
8066
            for (unsigned int u = 0; u < 10; u++)
 
8067
            {
 
8068
              for (unsigned int tu = 0; tu < 10; tu++)
 
8069
              {
 
8070
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8071
              }// end loop over 'tu'
 
8072
            }// end loop over 'u'
 
8073
          }// end loop over 't'
 
8074
          }
 
8075
          
 
8076
          if (combinations[r][s] == 1)
 
8077
          {
 
8078
          for (unsigned int t = 0; t < 10; t++)
 
8079
          {
 
8080
            for (unsigned int u = 0; u < 10; u++)
 
8081
            {
 
8082
              for (unsigned int tu = 0; tu < 10; tu++)
 
8083
              {
 
8084
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8085
              }// end loop over 'tu'
 
8086
            }// end loop over 'u'
 
8087
          }// end loop over 't'
 
8088
          }
 
8089
          
 
8090
          if (combinations[r][s] == 2)
 
8091
          {
 
8092
          for (unsigned int t = 0; t < 10; t++)
 
8093
          {
 
8094
            for (unsigned int u = 0; u < 10; u++)
 
8095
            {
 
8096
              for (unsigned int tu = 0; tu < 10; tu++)
 
8097
              {
 
8098
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8099
              }// end loop over 'tu'
 
8100
            }// end loop over 'u'
 
8101
          }// end loop over 't'
 
8102
          }
 
8103
          
 
8104
        }// end loop over 's'
 
8105
        for (unsigned int s = 0; s < 10; s++)
 
8106
        {
 
8107
          for (unsigned int t = 0; t < 10; t++)
 
8108
          {
 
8109
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8110
          }// end loop over 't'
 
8111
        }// end loop over 's'
 
8112
      }// end loop over 'r'
 
8113
      
 
8114
      // Transform derivatives back to physical element
 
8115
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8116
      {
 
8117
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8118
        {
 
8119
          values[r] += transform[r][s]*derivatives[s];
 
8120
        }// end loop over 's'
 
8121
      }// end loop over 'r'
 
8122
      
 
8123
      // Delete pointer to array of derivatives on FIAT element
 
8124
      delete [] derivatives;
 
8125
      
 
8126
      // Delete pointer to array of combinations of derivatives and transform
 
8127
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8128
      {
 
8129
        delete [] combinations[r];
 
8130
      }// end loop over 'r'
 
8131
      delete [] combinations;
 
8132
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8133
      {
 
8134
        delete [] transform[r];
 
8135
      }// end loop over 'r'
 
8136
      delete [] transform;
 
8137
        break;
 
8138
      }
 
8139
    case 3:
 
8140
      {
 
8141
        
 
8142
      // Array of basisvalues.
 
8143
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
8144
      
 
8145
      // Declare helper variables.
 
8146
      unsigned int rr = 0;
 
8147
      unsigned int ss = 0;
 
8148
      unsigned int tt = 0;
 
8149
      double tmp5 = 0.000000000000000;
 
8150
      double tmp6 = 0.000000000000000;
 
8151
      double tmp7 = 0.000000000000000;
 
8152
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
8153
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
8154
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
8155
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
8156
      double tmp4 = tmp3*tmp3;
 
8157
      
 
8158
      // Compute basisvalues.
 
8159
      basisvalues[0] = 1.000000000000000;
 
8160
      basisvalues[1] = tmp0;
 
8161
      for (unsigned int r = 1; r < 2; r++)
 
8162
      {
 
8163
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8164
        ss = r*(r + 1)*(r + 2)/6;
 
8165
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8166
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
8167
      }// end loop over 'r'
 
8168
      for (unsigned int r = 0; r < 2; r++)
 
8169
      {
 
8170
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8171
        ss = r*(r + 1)*(r + 2)/6;
 
8172
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
8173
      }// end loop over 'r'
 
8174
      for (unsigned int r = 0; r < 1; r++)
 
8175
      {
 
8176
        for (unsigned int s = 1; s < 2 - r; s++)
 
8177
        {
 
8178
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8179
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8180
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8181
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8182
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8183
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8184
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8185
        }// end loop over 's'
 
8186
      }// end loop over 'r'
 
8187
      for (unsigned int r = 0; r < 2; r++)
 
8188
      {
 
8189
        for (unsigned int s = 0; s < 2 - r; s++)
 
8190
        {
 
8191
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8192
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8193
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
8194
        }// end loop over 's'
 
8195
      }// end loop over 'r'
 
8196
      for (unsigned int r = 0; r < 1; r++)
 
8197
      {
 
8198
        for (unsigned int s = 0; s < 1 - r; s++)
 
8199
        {
 
8200
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8201
          {
 
8202
            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;
 
8203
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8204
            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;
 
8205
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8206
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8207
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8208
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8209
          }// end loop over 't'
 
8210
        }// end loop over 's'
 
8211
      }// end loop over 'r'
 
8212
      for (unsigned int r = 0; r < 3; r++)
 
8213
      {
 
8214
        for (unsigned int s = 0; s < 3 - r; s++)
 
8215
        {
 
8216
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8217
          {
 
8218
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8219
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
8220
          }// end loop over 't'
 
8221
        }// end loop over 's'
 
8222
      }// end loop over 'r'
 
8223
      
 
8224
      // Table(s) of coefficients.
 
8225
      static const double coefficients0[10] = \
 
8226
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
8227
      
 
8228
      // Tables of derivatives of the polynomial base (transpose).
 
8229
      static const double dmats0[10][10] = \
 
8230
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8231
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8232
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8233
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8234
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8235
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8236
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8237
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8238
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8239
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8240
      
 
8241
      static const double dmats1[10][10] = \
 
8242
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8243
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8244
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8245
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8246
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8247
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8248
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8249
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8250
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8251
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8252
      
 
8253
      static const double dmats2[10][10] = \
 
8254
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8255
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8256
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8257
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8258
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8259
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8260
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8261
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8262
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8263
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8264
      
 
8265
      // Compute reference derivatives.
 
8266
      // Declare pointer to array of derivatives on FIAT element.
 
8267
      double *derivatives = new double[num_derivatives];
 
8268
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8269
      {
 
8270
        derivatives[r] = 0.000000000000000;
 
8271
      }// end loop over 'r'
 
8272
      
 
8273
      // Declare derivative matrix (of polynomial basis).
 
8274
      double dmats[10][10] = \
 
8275
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8276
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8277
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8278
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8279
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8280
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8281
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8282
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8283
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8284
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8285
      
 
8286
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8287
      double dmats_old[10][10] = \
 
8288
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8289
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8290
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8291
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8292
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8293
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8294
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8295
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8296
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8297
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8298
      
 
8299
      // Loop possible derivatives.
 
8300
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8301
      {
 
8302
        // Resetting dmats values to compute next derivative.
 
8303
        for (unsigned int t = 0; t < 10; t++)
 
8304
        {
 
8305
          for (unsigned int u = 0; u < 10; u++)
 
8306
          {
 
8307
            dmats[t][u] = 0.000000000000000;
 
8308
            if (t == u)
 
8309
            {
 
8310
            dmats[t][u] = 1.000000000000000;
 
8311
            }
 
8312
            
 
8313
          }// end loop over 'u'
 
8314
        }// end loop over 't'
 
8315
        
 
8316
        // Looping derivative order to generate dmats.
 
8317
        for (unsigned int s = 0; s < n; s++)
 
8318
        {
 
8319
          // Updating dmats_old with new values and resetting dmats.
 
8320
          for (unsigned int t = 0; t < 10; t++)
 
8321
          {
 
8322
            for (unsigned int u = 0; u < 10; u++)
 
8323
            {
 
8324
              dmats_old[t][u] = dmats[t][u];
 
8325
              dmats[t][u] = 0.000000000000000;
 
8326
            }// end loop over 'u'
 
8327
          }// end loop over 't'
 
8328
          
 
8329
          // Update dmats using an inner product.
 
8330
          if (combinations[r][s] == 0)
 
8331
          {
 
8332
          for (unsigned int t = 0; t < 10; t++)
 
8333
          {
 
8334
            for (unsigned int u = 0; u < 10; u++)
 
8335
            {
 
8336
              for (unsigned int tu = 0; tu < 10; tu++)
 
8337
              {
 
8338
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8339
              }// end loop over 'tu'
 
8340
            }// end loop over 'u'
 
8341
          }// end loop over 't'
 
8342
          }
 
8343
          
 
8344
          if (combinations[r][s] == 1)
 
8345
          {
 
8346
          for (unsigned int t = 0; t < 10; t++)
 
8347
          {
 
8348
            for (unsigned int u = 0; u < 10; u++)
 
8349
            {
 
8350
              for (unsigned int tu = 0; tu < 10; tu++)
 
8351
              {
 
8352
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8353
              }// end loop over 'tu'
 
8354
            }// end loop over 'u'
 
8355
          }// end loop over 't'
 
8356
          }
 
8357
          
 
8358
          if (combinations[r][s] == 2)
 
8359
          {
 
8360
          for (unsigned int t = 0; t < 10; t++)
 
8361
          {
 
8362
            for (unsigned int u = 0; u < 10; u++)
 
8363
            {
 
8364
              for (unsigned int tu = 0; tu < 10; tu++)
 
8365
              {
 
8366
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8367
              }// end loop over 'tu'
 
8368
            }// end loop over 'u'
 
8369
          }// end loop over 't'
 
8370
          }
 
8371
          
 
8372
        }// end loop over 's'
 
8373
        for (unsigned int s = 0; s < 10; s++)
 
8374
        {
 
8375
          for (unsigned int t = 0; t < 10; t++)
 
8376
          {
 
8377
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8378
          }// end loop over 't'
 
8379
        }// end loop over 's'
 
8380
      }// end loop over 'r'
 
8381
      
 
8382
      // Transform derivatives back to physical element
 
8383
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8384
      {
 
8385
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8386
        {
 
8387
          values[r] += transform[r][s]*derivatives[s];
 
8388
        }// end loop over 's'
 
8389
      }// end loop over 'r'
 
8390
      
 
8391
      // Delete pointer to array of derivatives on FIAT element
 
8392
      delete [] derivatives;
 
8393
      
 
8394
      // Delete pointer to array of combinations of derivatives and transform
 
8395
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8396
      {
 
8397
        delete [] combinations[r];
 
8398
      }// end loop over 'r'
 
8399
      delete [] combinations;
 
8400
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8401
      {
 
8402
        delete [] transform[r];
 
8403
      }// end loop over 'r'
 
8404
      delete [] transform;
 
8405
        break;
 
8406
      }
 
8407
    case 4:
 
8408
      {
 
8409
        
 
8410
      // Array of basisvalues.
 
8411
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
8412
      
 
8413
      // Declare helper variables.
 
8414
      unsigned int rr = 0;
 
8415
      unsigned int ss = 0;
 
8416
      unsigned int tt = 0;
 
8417
      double tmp5 = 0.000000000000000;
 
8418
      double tmp6 = 0.000000000000000;
 
8419
      double tmp7 = 0.000000000000000;
 
8420
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
8421
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
8422
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
8423
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
8424
      double tmp4 = tmp3*tmp3;
 
8425
      
 
8426
      // Compute basisvalues.
 
8427
      basisvalues[0] = 1.000000000000000;
 
8428
      basisvalues[1] = tmp0;
 
8429
      for (unsigned int r = 1; r < 2; r++)
 
8430
      {
 
8431
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8432
        ss = r*(r + 1)*(r + 2)/6;
 
8433
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8434
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
8435
      }// end loop over 'r'
 
8436
      for (unsigned int r = 0; r < 2; r++)
 
8437
      {
 
8438
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8439
        ss = r*(r + 1)*(r + 2)/6;
 
8440
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
8441
      }// end loop over 'r'
 
8442
      for (unsigned int r = 0; r < 1; r++)
 
8443
      {
 
8444
        for (unsigned int s = 1; s < 2 - r; s++)
 
8445
        {
 
8446
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8447
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8448
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8449
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8450
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8451
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8452
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8453
        }// end loop over 's'
 
8454
      }// end loop over 'r'
 
8455
      for (unsigned int r = 0; r < 2; r++)
 
8456
      {
 
8457
        for (unsigned int s = 0; s < 2 - r; s++)
 
8458
        {
 
8459
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8460
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8461
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
8462
        }// end loop over 's'
 
8463
      }// end loop over 'r'
 
8464
      for (unsigned int r = 0; r < 1; r++)
 
8465
      {
 
8466
        for (unsigned int s = 0; s < 1 - r; s++)
 
8467
        {
 
8468
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8469
          {
 
8470
            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;
 
8471
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8472
            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;
 
8473
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8474
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8475
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8476
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8477
          }// end loop over 't'
 
8478
        }// end loop over 's'
 
8479
      }// end loop over 'r'
 
8480
      for (unsigned int r = 0; r < 3; r++)
 
8481
      {
 
8482
        for (unsigned int s = 0; s < 3 - r; s++)
 
8483
        {
 
8484
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8485
          {
 
8486
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8487
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
8488
          }// end loop over 't'
 
8489
        }// end loop over 's'
 
8490
      }// end loop over 'r'
 
8491
      
 
8492
      // Table(s) of coefficients.
 
8493
      static const double coefficients0[10] = \
 
8494
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
8495
      
 
8496
      // Tables of derivatives of the polynomial base (transpose).
 
8497
      static const double dmats0[10][10] = \
 
8498
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8499
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8500
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8501
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8502
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8503
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8504
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8505
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8506
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8507
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8508
      
 
8509
      static const double dmats1[10][10] = \
 
8510
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8511
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8512
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8513
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8514
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8515
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8516
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8517
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8518
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8519
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8520
      
 
8521
      static const double dmats2[10][10] = \
 
8522
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8523
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8524
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8525
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8526
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8527
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8528
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8529
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8530
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8531
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8532
      
 
8533
      // Compute reference derivatives.
 
8534
      // Declare pointer to array of derivatives on FIAT element.
 
8535
      double *derivatives = new double[num_derivatives];
 
8536
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8537
      {
 
8538
        derivatives[r] = 0.000000000000000;
 
8539
      }// end loop over 'r'
 
8540
      
 
8541
      // Declare derivative matrix (of polynomial basis).
 
8542
      double dmats[10][10] = \
 
8543
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8544
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8545
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8546
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8547
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8548
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8549
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8550
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8551
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8552
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8553
      
 
8554
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8555
      double dmats_old[10][10] = \
 
8556
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8557
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8558
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8559
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8560
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8561
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8562
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8563
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8564
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8565
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8566
      
 
8567
      // Loop possible derivatives.
 
8568
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8569
      {
 
8570
        // Resetting dmats values to compute next derivative.
 
8571
        for (unsigned int t = 0; t < 10; t++)
 
8572
        {
 
8573
          for (unsigned int u = 0; u < 10; u++)
 
8574
          {
 
8575
            dmats[t][u] = 0.000000000000000;
 
8576
            if (t == u)
 
8577
            {
 
8578
            dmats[t][u] = 1.000000000000000;
 
8579
            }
 
8580
            
 
8581
          }// end loop over 'u'
 
8582
        }// end loop over 't'
 
8583
        
 
8584
        // Looping derivative order to generate dmats.
 
8585
        for (unsigned int s = 0; s < n; s++)
 
8586
        {
 
8587
          // Updating dmats_old with new values and resetting dmats.
 
8588
          for (unsigned int t = 0; t < 10; t++)
 
8589
          {
 
8590
            for (unsigned int u = 0; u < 10; u++)
 
8591
            {
 
8592
              dmats_old[t][u] = dmats[t][u];
 
8593
              dmats[t][u] = 0.000000000000000;
 
8594
            }// end loop over 'u'
 
8595
          }// end loop over 't'
 
8596
          
 
8597
          // Update dmats using an inner product.
 
8598
          if (combinations[r][s] == 0)
 
8599
          {
 
8600
          for (unsigned int t = 0; t < 10; t++)
 
8601
          {
 
8602
            for (unsigned int u = 0; u < 10; u++)
 
8603
            {
 
8604
              for (unsigned int tu = 0; tu < 10; tu++)
 
8605
              {
 
8606
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8607
              }// end loop over 'tu'
 
8608
            }// end loop over 'u'
 
8609
          }// end loop over 't'
 
8610
          }
 
8611
          
 
8612
          if (combinations[r][s] == 1)
 
8613
          {
 
8614
          for (unsigned int t = 0; t < 10; t++)
 
8615
          {
 
8616
            for (unsigned int u = 0; u < 10; u++)
 
8617
            {
 
8618
              for (unsigned int tu = 0; tu < 10; tu++)
 
8619
              {
 
8620
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8621
              }// end loop over 'tu'
 
8622
            }// end loop over 'u'
 
8623
          }// end loop over 't'
 
8624
          }
 
8625
          
 
8626
          if (combinations[r][s] == 2)
 
8627
          {
 
8628
          for (unsigned int t = 0; t < 10; t++)
 
8629
          {
 
8630
            for (unsigned int u = 0; u < 10; u++)
 
8631
            {
 
8632
              for (unsigned int tu = 0; tu < 10; tu++)
 
8633
              {
 
8634
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8635
              }// end loop over 'tu'
 
8636
            }// end loop over 'u'
 
8637
          }// end loop over 't'
 
8638
          }
 
8639
          
 
8640
        }// end loop over 's'
 
8641
        for (unsigned int s = 0; s < 10; s++)
 
8642
        {
 
8643
          for (unsigned int t = 0; t < 10; t++)
 
8644
          {
 
8645
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8646
          }// end loop over 't'
 
8647
        }// end loop over 's'
 
8648
      }// end loop over 'r'
 
8649
      
 
8650
      // Transform derivatives back to physical element
 
8651
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8652
      {
 
8653
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8654
        {
 
8655
          values[r] += transform[r][s]*derivatives[s];
 
8656
        }// end loop over 's'
 
8657
      }// end loop over 'r'
 
8658
      
 
8659
      // Delete pointer to array of derivatives on FIAT element
 
8660
      delete [] derivatives;
 
8661
      
 
8662
      // Delete pointer to array of combinations of derivatives and transform
 
8663
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8664
      {
 
8665
        delete [] combinations[r];
 
8666
      }// end loop over 'r'
 
8667
      delete [] combinations;
 
8668
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8669
      {
 
8670
        delete [] transform[r];
 
8671
      }// end loop over 'r'
 
8672
      delete [] transform;
 
8673
        break;
 
8674
      }
 
8675
    case 5:
 
8676
      {
 
8677
        
 
8678
      // Array of basisvalues.
 
8679
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
8680
      
 
8681
      // Declare helper variables.
 
8682
      unsigned int rr = 0;
 
8683
      unsigned int ss = 0;
 
8684
      unsigned int tt = 0;
 
8685
      double tmp5 = 0.000000000000000;
 
8686
      double tmp6 = 0.000000000000000;
 
8687
      double tmp7 = 0.000000000000000;
 
8688
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
8689
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
8690
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
8691
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
8692
      double tmp4 = tmp3*tmp3;
 
8693
      
 
8694
      // Compute basisvalues.
 
8695
      basisvalues[0] = 1.000000000000000;
 
8696
      basisvalues[1] = tmp0;
 
8697
      for (unsigned int r = 1; r < 2; r++)
 
8698
      {
 
8699
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8700
        ss = r*(r + 1)*(r + 2)/6;
 
8701
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8702
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
8703
      }// end loop over 'r'
 
8704
      for (unsigned int r = 0; r < 2; r++)
 
8705
      {
 
8706
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8707
        ss = r*(r + 1)*(r + 2)/6;
 
8708
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
8709
      }// end loop over 'r'
 
8710
      for (unsigned int r = 0; r < 1; r++)
 
8711
      {
 
8712
        for (unsigned int s = 1; s < 2 - r; s++)
 
8713
        {
 
8714
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8715
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8716
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8717
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8718
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8719
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8720
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8721
        }// end loop over 's'
 
8722
      }// end loop over 'r'
 
8723
      for (unsigned int r = 0; r < 2; r++)
 
8724
      {
 
8725
        for (unsigned int s = 0; s < 2 - r; s++)
 
8726
        {
 
8727
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8728
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8729
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
8730
        }// end loop over 's'
 
8731
      }// end loop over 'r'
 
8732
      for (unsigned int r = 0; r < 1; r++)
 
8733
      {
 
8734
        for (unsigned int s = 0; s < 1 - r; s++)
 
8735
        {
 
8736
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
8737
          {
 
8738
            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;
 
8739
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8740
            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;
 
8741
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8742
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8743
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
8744
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
8745
          }// end loop over 't'
 
8746
        }// end loop over 's'
 
8747
      }// end loop over 'r'
 
8748
      for (unsigned int r = 0; r < 3; r++)
 
8749
      {
 
8750
        for (unsigned int s = 0; s < 3 - r; s++)
 
8751
        {
 
8752
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
8753
          {
 
8754
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
8755
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
8756
          }// end loop over 't'
 
8757
        }// end loop over 's'
 
8758
      }// end loop over 'r'
 
8759
      
 
8760
      // Table(s) of coefficients.
 
8761
      static const double coefficients0[10] = \
 
8762
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
8763
      
 
8764
      // Tables of derivatives of the polynomial base (transpose).
 
8765
      static const double dmats0[10][10] = \
 
8766
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8767
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8768
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8769
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8770
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8771
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8772
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8773
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8774
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8775
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8776
      
 
8777
      static const double dmats1[10][10] = \
 
8778
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8779
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8780
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8781
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8782
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8783
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8784
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8785
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8786
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8787
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8788
      
 
8789
      static const double dmats2[10][10] = \
 
8790
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8791
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8792
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8793
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8794
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8795
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8796
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8797
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8798
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8799
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
8800
      
 
8801
      // Compute reference derivatives.
 
8802
      // Declare pointer to array of derivatives on FIAT element.
 
8803
      double *derivatives = new double[num_derivatives];
 
8804
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8805
      {
 
8806
        derivatives[r] = 0.000000000000000;
 
8807
      }// end loop over 'r'
 
8808
      
 
8809
      // Declare derivative matrix (of polynomial basis).
 
8810
      double dmats[10][10] = \
 
8811
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8812
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8813
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8814
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8815
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8816
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8817
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8818
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8819
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8820
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8821
      
 
8822
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
8823
      double dmats_old[10][10] = \
 
8824
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8825
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8826
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8827
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8828
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8829
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8830
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
8831
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
8832
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
8833
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
8834
      
 
8835
      // Loop possible derivatives.
 
8836
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8837
      {
 
8838
        // Resetting dmats values to compute next derivative.
 
8839
        for (unsigned int t = 0; t < 10; t++)
 
8840
        {
 
8841
          for (unsigned int u = 0; u < 10; u++)
 
8842
          {
 
8843
            dmats[t][u] = 0.000000000000000;
 
8844
            if (t == u)
 
8845
            {
 
8846
            dmats[t][u] = 1.000000000000000;
 
8847
            }
 
8848
            
 
8849
          }// end loop over 'u'
 
8850
        }// end loop over 't'
 
8851
        
 
8852
        // Looping derivative order to generate dmats.
 
8853
        for (unsigned int s = 0; s < n; s++)
 
8854
        {
 
8855
          // Updating dmats_old with new values and resetting dmats.
 
8856
          for (unsigned int t = 0; t < 10; t++)
 
8857
          {
 
8858
            for (unsigned int u = 0; u < 10; u++)
 
8859
            {
 
8860
              dmats_old[t][u] = dmats[t][u];
 
8861
              dmats[t][u] = 0.000000000000000;
 
8862
            }// end loop over 'u'
 
8863
          }// end loop over 't'
 
8864
          
 
8865
          // Update dmats using an inner product.
 
8866
          if (combinations[r][s] == 0)
 
8867
          {
 
8868
          for (unsigned int t = 0; t < 10; t++)
 
8869
          {
 
8870
            for (unsigned int u = 0; u < 10; u++)
 
8871
            {
 
8872
              for (unsigned int tu = 0; tu < 10; tu++)
 
8873
              {
 
8874
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
8875
              }// end loop over 'tu'
 
8876
            }// end loop over 'u'
 
8877
          }// end loop over 't'
 
8878
          }
 
8879
          
 
8880
          if (combinations[r][s] == 1)
 
8881
          {
 
8882
          for (unsigned int t = 0; t < 10; t++)
 
8883
          {
 
8884
            for (unsigned int u = 0; u < 10; u++)
 
8885
            {
 
8886
              for (unsigned int tu = 0; tu < 10; tu++)
 
8887
              {
 
8888
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
8889
              }// end loop over 'tu'
 
8890
            }// end loop over 'u'
 
8891
          }// end loop over 't'
 
8892
          }
 
8893
          
 
8894
          if (combinations[r][s] == 2)
 
8895
          {
 
8896
          for (unsigned int t = 0; t < 10; t++)
 
8897
          {
 
8898
            for (unsigned int u = 0; u < 10; u++)
 
8899
            {
 
8900
              for (unsigned int tu = 0; tu < 10; tu++)
 
8901
              {
 
8902
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
8903
              }// end loop over 'tu'
 
8904
            }// end loop over 'u'
 
8905
          }// end loop over 't'
 
8906
          }
 
8907
          
 
8908
        }// end loop over 's'
 
8909
        for (unsigned int s = 0; s < 10; s++)
 
8910
        {
 
8911
          for (unsigned int t = 0; t < 10; t++)
 
8912
          {
 
8913
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
8914
          }// end loop over 't'
 
8915
        }// end loop over 's'
 
8916
      }// end loop over 'r'
 
8917
      
 
8918
      // Transform derivatives back to physical element
 
8919
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8920
      {
 
8921
        for (unsigned int s = 0; s < num_derivatives; s++)
 
8922
        {
 
8923
          values[r] += transform[r][s]*derivatives[s];
 
8924
        }// end loop over 's'
 
8925
      }// end loop over 'r'
 
8926
      
 
8927
      // Delete pointer to array of derivatives on FIAT element
 
8928
      delete [] derivatives;
 
8929
      
 
8930
      // Delete pointer to array of combinations of derivatives and transform
 
8931
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8932
      {
 
8933
        delete [] combinations[r];
 
8934
      }// end loop over 'r'
 
8935
      delete [] combinations;
 
8936
      for (unsigned int r = 0; r < num_derivatives; r++)
 
8937
      {
 
8938
        delete [] transform[r];
 
8939
      }// end loop over 'r'
 
8940
      delete [] transform;
 
8941
        break;
 
8942
      }
 
8943
    case 6:
 
8944
      {
 
8945
        
 
8946
      // Array of basisvalues.
 
8947
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
8948
      
 
8949
      // Declare helper variables.
 
8950
      unsigned int rr = 0;
 
8951
      unsigned int ss = 0;
 
8952
      unsigned int tt = 0;
 
8953
      double tmp5 = 0.000000000000000;
 
8954
      double tmp6 = 0.000000000000000;
 
8955
      double tmp7 = 0.000000000000000;
 
8956
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
8957
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
8958
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
8959
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
8960
      double tmp4 = tmp3*tmp3;
 
8961
      
 
8962
      // Compute basisvalues.
 
8963
      basisvalues[0] = 1.000000000000000;
 
8964
      basisvalues[1] = tmp0;
 
8965
      for (unsigned int r = 1; r < 2; r++)
 
8966
      {
 
8967
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
8968
        ss = r*(r + 1)*(r + 2)/6;
 
8969
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
8970
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
8971
      }// end loop over 'r'
 
8972
      for (unsigned int r = 0; r < 2; r++)
 
8973
      {
 
8974
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
8975
        ss = r*(r + 1)*(r + 2)/6;
 
8976
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
8977
      }// end loop over 'r'
 
8978
      for (unsigned int r = 0; r < 1; r++)
 
8979
      {
 
8980
        for (unsigned int s = 1; s < 2 - r; s++)
 
8981
        {
 
8982
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
8983
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8984
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
8985
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8986
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8987
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
8988
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
8989
        }// end loop over 's'
 
8990
      }// end loop over 'r'
 
8991
      for (unsigned int r = 0; r < 2; r++)
 
8992
      {
 
8993
        for (unsigned int s = 0; s < 2 - r; s++)
 
8994
        {
 
8995
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
8996
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
8997
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
8998
        }// end loop over 's'
 
8999
      }// end loop over 'r'
 
9000
      for (unsigned int r = 0; r < 1; r++)
 
9001
      {
 
9002
        for (unsigned int s = 0; s < 1 - r; s++)
 
9003
        {
 
9004
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9005
          {
 
9006
            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;
 
9007
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9008
            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;
 
9009
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9010
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9011
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9012
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9013
          }// end loop over 't'
 
9014
        }// end loop over 's'
 
9015
      }// end loop over 'r'
 
9016
      for (unsigned int r = 0; r < 3; r++)
 
9017
      {
 
9018
        for (unsigned int s = 0; s < 3 - r; s++)
 
9019
        {
 
9020
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9021
          {
 
9022
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9023
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
9024
          }// end loop over 't'
 
9025
        }// end loop over 's'
 
9026
      }// end loop over 'r'
 
9027
      
 
9028
      // Table(s) of coefficients.
 
9029
      static const double coefficients0[10] = \
 
9030
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
9031
      
 
9032
      // Tables of derivatives of the polynomial base (transpose).
 
9033
      static const double dmats0[10][10] = \
 
9034
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9035
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9036
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9037
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9038
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9039
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9040
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9041
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9042
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9043
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9044
      
 
9045
      static const double dmats1[10][10] = \
 
9046
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9047
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9048
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9049
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9050
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9051
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9052
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9053
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9054
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9055
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9056
      
 
9057
      static const double dmats2[10][10] = \
 
9058
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9059
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9060
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9061
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9062
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9063
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9064
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9065
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9066
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9067
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9068
      
 
9069
      // Compute reference derivatives.
 
9070
      // Declare pointer to array of derivatives on FIAT element.
 
9071
      double *derivatives = new double[num_derivatives];
 
9072
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9073
      {
 
9074
        derivatives[r] = 0.000000000000000;
 
9075
      }// end loop over 'r'
 
9076
      
 
9077
      // Declare derivative matrix (of polynomial basis).
 
9078
      double dmats[10][10] = \
 
9079
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9080
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9081
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9082
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9083
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9084
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9085
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9086
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9087
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9088
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9089
      
 
9090
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9091
      double dmats_old[10][10] = \
 
9092
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9093
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9094
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9095
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9096
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9097
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9098
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9099
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9100
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9101
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9102
      
 
9103
      // Loop possible derivatives.
 
9104
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9105
      {
 
9106
        // Resetting dmats values to compute next derivative.
 
9107
        for (unsigned int t = 0; t < 10; t++)
 
9108
        {
 
9109
          for (unsigned int u = 0; u < 10; u++)
 
9110
          {
 
9111
            dmats[t][u] = 0.000000000000000;
 
9112
            if (t == u)
 
9113
            {
 
9114
            dmats[t][u] = 1.000000000000000;
 
9115
            }
 
9116
            
 
9117
          }// end loop over 'u'
 
9118
        }// end loop over 't'
 
9119
        
 
9120
        // Looping derivative order to generate dmats.
 
9121
        for (unsigned int s = 0; s < n; s++)
 
9122
        {
 
9123
          // Updating dmats_old with new values and resetting dmats.
 
9124
          for (unsigned int t = 0; t < 10; t++)
 
9125
          {
 
9126
            for (unsigned int u = 0; u < 10; u++)
 
9127
            {
 
9128
              dmats_old[t][u] = dmats[t][u];
 
9129
              dmats[t][u] = 0.000000000000000;
 
9130
            }// end loop over 'u'
 
9131
          }// end loop over 't'
 
9132
          
 
9133
          // Update dmats using an inner product.
 
9134
          if (combinations[r][s] == 0)
 
9135
          {
 
9136
          for (unsigned int t = 0; t < 10; t++)
 
9137
          {
 
9138
            for (unsigned int u = 0; u < 10; u++)
 
9139
            {
 
9140
              for (unsigned int tu = 0; tu < 10; tu++)
 
9141
              {
 
9142
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9143
              }// end loop over 'tu'
 
9144
            }// end loop over 'u'
 
9145
          }// end loop over 't'
 
9146
          }
 
9147
          
 
9148
          if (combinations[r][s] == 1)
 
9149
          {
 
9150
          for (unsigned int t = 0; t < 10; t++)
 
9151
          {
 
9152
            for (unsigned int u = 0; u < 10; u++)
 
9153
            {
 
9154
              for (unsigned int tu = 0; tu < 10; tu++)
 
9155
              {
 
9156
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9157
              }// end loop over 'tu'
 
9158
            }// end loop over 'u'
 
9159
          }// end loop over 't'
 
9160
          }
 
9161
          
 
9162
          if (combinations[r][s] == 2)
 
9163
          {
 
9164
          for (unsigned int t = 0; t < 10; t++)
 
9165
          {
 
9166
            for (unsigned int u = 0; u < 10; u++)
 
9167
            {
 
9168
              for (unsigned int tu = 0; tu < 10; tu++)
 
9169
              {
 
9170
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9171
              }// end loop over 'tu'
 
9172
            }// end loop over 'u'
 
9173
          }// end loop over 't'
 
9174
          }
 
9175
          
 
9176
        }// end loop over 's'
 
9177
        for (unsigned int s = 0; s < 10; s++)
 
9178
        {
 
9179
          for (unsigned int t = 0; t < 10; t++)
 
9180
          {
 
9181
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9182
          }// end loop over 't'
 
9183
        }// end loop over 's'
 
9184
      }// end loop over 'r'
 
9185
      
 
9186
      // Transform derivatives back to physical element
 
9187
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9188
      {
 
9189
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9190
        {
 
9191
          values[r] += transform[r][s]*derivatives[s];
 
9192
        }// end loop over 's'
 
9193
      }// end loop over 'r'
 
9194
      
 
9195
      // Delete pointer to array of derivatives on FIAT element
 
9196
      delete [] derivatives;
 
9197
      
 
9198
      // Delete pointer to array of combinations of derivatives and transform
 
9199
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9200
      {
 
9201
        delete [] combinations[r];
 
9202
      }// end loop over 'r'
 
9203
      delete [] combinations;
 
9204
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9205
      {
 
9206
        delete [] transform[r];
 
9207
      }// end loop over 'r'
 
9208
      delete [] transform;
 
9209
        break;
 
9210
      }
 
9211
    case 7:
 
9212
      {
 
9213
        
 
9214
      // Array of basisvalues.
 
9215
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
9216
      
 
9217
      // Declare helper variables.
 
9218
      unsigned int rr = 0;
 
9219
      unsigned int ss = 0;
 
9220
      unsigned int tt = 0;
 
9221
      double tmp5 = 0.000000000000000;
 
9222
      double tmp6 = 0.000000000000000;
 
9223
      double tmp7 = 0.000000000000000;
 
9224
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
9225
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
9226
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
9227
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
9228
      double tmp4 = tmp3*tmp3;
 
9229
      
 
9230
      // Compute basisvalues.
 
9231
      basisvalues[0] = 1.000000000000000;
 
9232
      basisvalues[1] = tmp0;
 
9233
      for (unsigned int r = 1; r < 2; r++)
 
9234
      {
 
9235
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9236
        ss = r*(r + 1)*(r + 2)/6;
 
9237
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9238
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
9239
      }// end loop over 'r'
 
9240
      for (unsigned int r = 0; r < 2; r++)
 
9241
      {
 
9242
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9243
        ss = r*(r + 1)*(r + 2)/6;
 
9244
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
9245
      }// end loop over 'r'
 
9246
      for (unsigned int r = 0; r < 1; r++)
 
9247
      {
 
9248
        for (unsigned int s = 1; s < 2 - r; s++)
 
9249
        {
 
9250
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
9251
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9252
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
9253
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9254
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9255
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9256
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
9257
        }// end loop over 's'
 
9258
      }// end loop over 'r'
 
9259
      for (unsigned int r = 0; r < 2; r++)
 
9260
      {
 
9261
        for (unsigned int s = 0; s < 2 - r; s++)
 
9262
        {
 
9263
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
9264
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9265
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
9266
        }// end loop over 's'
 
9267
      }// end loop over 'r'
 
9268
      for (unsigned int r = 0; r < 1; r++)
 
9269
      {
 
9270
        for (unsigned int s = 0; s < 1 - r; s++)
 
9271
        {
 
9272
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9273
          {
 
9274
            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;
 
9275
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9276
            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;
 
9277
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9278
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9279
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9280
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9281
          }// end loop over 't'
 
9282
        }// end loop over 's'
 
9283
      }// end loop over 'r'
 
9284
      for (unsigned int r = 0; r < 3; r++)
 
9285
      {
 
9286
        for (unsigned int s = 0; s < 3 - r; s++)
 
9287
        {
 
9288
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9289
          {
 
9290
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9291
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
9292
          }// end loop over 't'
 
9293
        }// end loop over 's'
 
9294
      }// end loop over 'r'
 
9295
      
 
9296
      // Table(s) of coefficients.
 
9297
      static const double coefficients0[10] = \
 
9298
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
9299
      
 
9300
      // Tables of derivatives of the polynomial base (transpose).
 
9301
      static const double dmats0[10][10] = \
 
9302
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9303
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9304
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9305
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9306
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9307
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9308
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9309
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9310
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9311
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9312
      
 
9313
      static const double dmats1[10][10] = \
 
9314
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9315
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9316
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9317
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9318
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9319
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9320
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9321
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9322
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9323
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9324
      
 
9325
      static const double dmats2[10][10] = \
 
9326
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9327
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9328
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9329
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9330
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9331
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9332
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9333
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9334
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9335
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9336
      
 
9337
      // Compute reference derivatives.
 
9338
      // Declare pointer to array of derivatives on FIAT element.
 
9339
      double *derivatives = new double[num_derivatives];
 
9340
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9341
      {
 
9342
        derivatives[r] = 0.000000000000000;
 
9343
      }// end loop over 'r'
 
9344
      
 
9345
      // Declare derivative matrix (of polynomial basis).
 
9346
      double dmats[10][10] = \
 
9347
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9348
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9349
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9350
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9351
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9352
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9353
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9354
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9355
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9356
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9357
      
 
9358
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9359
      double dmats_old[10][10] = \
 
9360
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9361
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9362
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9363
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9364
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9365
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9366
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9367
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9368
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9369
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9370
      
 
9371
      // Loop possible derivatives.
 
9372
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9373
      {
 
9374
        // Resetting dmats values to compute next derivative.
 
9375
        for (unsigned int t = 0; t < 10; t++)
 
9376
        {
 
9377
          for (unsigned int u = 0; u < 10; u++)
 
9378
          {
 
9379
            dmats[t][u] = 0.000000000000000;
 
9380
            if (t == u)
 
9381
            {
 
9382
            dmats[t][u] = 1.000000000000000;
 
9383
            }
 
9384
            
 
9385
          }// end loop over 'u'
 
9386
        }// end loop over 't'
 
9387
        
 
9388
        // Looping derivative order to generate dmats.
 
9389
        for (unsigned int s = 0; s < n; s++)
 
9390
        {
 
9391
          // Updating dmats_old with new values and resetting dmats.
 
9392
          for (unsigned int t = 0; t < 10; t++)
 
9393
          {
 
9394
            for (unsigned int u = 0; u < 10; u++)
 
9395
            {
 
9396
              dmats_old[t][u] = dmats[t][u];
 
9397
              dmats[t][u] = 0.000000000000000;
 
9398
            }// end loop over 'u'
 
9399
          }// end loop over 't'
 
9400
          
 
9401
          // Update dmats using an inner product.
 
9402
          if (combinations[r][s] == 0)
 
9403
          {
 
9404
          for (unsigned int t = 0; t < 10; t++)
 
9405
          {
 
9406
            for (unsigned int u = 0; u < 10; u++)
 
9407
            {
 
9408
              for (unsigned int tu = 0; tu < 10; tu++)
 
9409
              {
 
9410
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9411
              }// end loop over 'tu'
 
9412
            }// end loop over 'u'
 
9413
          }// end loop over 't'
 
9414
          }
 
9415
          
 
9416
          if (combinations[r][s] == 1)
 
9417
          {
 
9418
          for (unsigned int t = 0; t < 10; t++)
 
9419
          {
 
9420
            for (unsigned int u = 0; u < 10; u++)
 
9421
            {
 
9422
              for (unsigned int tu = 0; tu < 10; tu++)
 
9423
              {
 
9424
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9425
              }// end loop over 'tu'
 
9426
            }// end loop over 'u'
 
9427
          }// end loop over 't'
 
9428
          }
 
9429
          
 
9430
          if (combinations[r][s] == 2)
 
9431
          {
 
9432
          for (unsigned int t = 0; t < 10; t++)
 
9433
          {
 
9434
            for (unsigned int u = 0; u < 10; u++)
 
9435
            {
 
9436
              for (unsigned int tu = 0; tu < 10; tu++)
 
9437
              {
 
9438
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9439
              }// end loop over 'tu'
 
9440
            }// end loop over 'u'
 
9441
          }// end loop over 't'
 
9442
          }
 
9443
          
 
9444
        }// end loop over 's'
 
9445
        for (unsigned int s = 0; s < 10; s++)
 
9446
        {
 
9447
          for (unsigned int t = 0; t < 10; t++)
 
9448
          {
 
9449
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9450
          }// end loop over 't'
 
9451
        }// end loop over 's'
 
9452
      }// end loop over 'r'
 
9453
      
 
9454
      // Transform derivatives back to physical element
 
9455
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9456
      {
 
9457
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9458
        {
 
9459
          values[r] += transform[r][s]*derivatives[s];
 
9460
        }// end loop over 's'
 
9461
      }// end loop over 'r'
 
9462
      
 
9463
      // Delete pointer to array of derivatives on FIAT element
 
9464
      delete [] derivatives;
 
9465
      
 
9466
      // Delete pointer to array of combinations of derivatives and transform
 
9467
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9468
      {
 
9469
        delete [] combinations[r];
 
9470
      }// end loop over 'r'
 
9471
      delete [] combinations;
 
9472
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9473
      {
 
9474
        delete [] transform[r];
 
9475
      }// end loop over 'r'
 
9476
      delete [] transform;
 
9477
        break;
 
9478
      }
 
9479
    case 8:
 
9480
      {
 
9481
        
 
9482
      // Array of basisvalues.
 
9483
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
9484
      
 
9485
      // Declare helper variables.
 
9486
      unsigned int rr = 0;
 
9487
      unsigned int ss = 0;
 
9488
      unsigned int tt = 0;
 
9489
      double tmp5 = 0.000000000000000;
 
9490
      double tmp6 = 0.000000000000000;
 
9491
      double tmp7 = 0.000000000000000;
 
9492
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
9493
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
9494
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
9495
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
9496
      double tmp4 = tmp3*tmp3;
 
9497
      
 
9498
      // Compute basisvalues.
 
9499
      basisvalues[0] = 1.000000000000000;
 
9500
      basisvalues[1] = tmp0;
 
9501
      for (unsigned int r = 1; r < 2; r++)
 
9502
      {
 
9503
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9504
        ss = r*(r + 1)*(r + 2)/6;
 
9505
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9506
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
9507
      }// end loop over 'r'
 
9508
      for (unsigned int r = 0; r < 2; r++)
 
9509
      {
 
9510
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9511
        ss = r*(r + 1)*(r + 2)/6;
 
9512
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
9513
      }// end loop over 'r'
 
9514
      for (unsigned int r = 0; r < 1; r++)
 
9515
      {
 
9516
        for (unsigned int s = 1; s < 2 - r; s++)
 
9517
        {
 
9518
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
9519
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9520
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
9521
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9522
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9523
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9524
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
9525
        }// end loop over 's'
 
9526
      }// end loop over 'r'
 
9527
      for (unsigned int r = 0; r < 2; r++)
 
9528
      {
 
9529
        for (unsigned int s = 0; s < 2 - r; s++)
 
9530
        {
 
9531
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
9532
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9533
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
9534
        }// end loop over 's'
 
9535
      }// end loop over 'r'
 
9536
      for (unsigned int r = 0; r < 1; r++)
 
9537
      {
 
9538
        for (unsigned int s = 0; s < 1 - r; s++)
 
9539
        {
 
9540
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9541
          {
 
9542
            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;
 
9543
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9544
            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;
 
9545
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9546
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9547
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9548
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9549
          }// end loop over 't'
 
9550
        }// end loop over 's'
 
9551
      }// end loop over 'r'
 
9552
      for (unsigned int r = 0; r < 3; r++)
 
9553
      {
 
9554
        for (unsigned int s = 0; s < 3 - r; s++)
 
9555
        {
 
9556
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9557
          {
 
9558
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9559
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
9560
          }// end loop over 't'
 
9561
        }// end loop over 's'
 
9562
      }// end loop over 'r'
 
9563
      
 
9564
      // Table(s) of coefficients.
 
9565
      static const double coefficients0[10] = \
 
9566
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
9567
      
 
9568
      // Tables of derivatives of the polynomial base (transpose).
 
9569
      static const double dmats0[10][10] = \
 
9570
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9571
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9572
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9573
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9574
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9575
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9576
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9577
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9578
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9579
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9580
      
 
9581
      static const double dmats1[10][10] = \
 
9582
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9583
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9584
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9585
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9586
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9587
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9588
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9589
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9590
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9591
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9592
      
 
9593
      static const double dmats2[10][10] = \
 
9594
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9595
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9596
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9597
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9598
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9599
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9600
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9601
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9602
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9603
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9604
      
 
9605
      // Compute reference derivatives.
 
9606
      // Declare pointer to array of derivatives on FIAT element.
 
9607
      double *derivatives = new double[num_derivatives];
 
9608
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9609
      {
 
9610
        derivatives[r] = 0.000000000000000;
 
9611
      }// end loop over 'r'
 
9612
      
 
9613
      // Declare derivative matrix (of polynomial basis).
 
9614
      double dmats[10][10] = \
 
9615
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9616
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9617
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9618
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9619
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9620
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9621
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9622
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9623
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9624
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9625
      
 
9626
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9627
      double dmats_old[10][10] = \
 
9628
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9629
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9630
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9631
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9632
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9633
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9634
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9635
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9636
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9637
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9638
      
 
9639
      // Loop possible derivatives.
 
9640
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9641
      {
 
9642
        // Resetting dmats values to compute next derivative.
 
9643
        for (unsigned int t = 0; t < 10; t++)
 
9644
        {
 
9645
          for (unsigned int u = 0; u < 10; u++)
 
9646
          {
 
9647
            dmats[t][u] = 0.000000000000000;
 
9648
            if (t == u)
 
9649
            {
 
9650
            dmats[t][u] = 1.000000000000000;
 
9651
            }
 
9652
            
 
9653
          }// end loop over 'u'
 
9654
        }// end loop over 't'
 
9655
        
 
9656
        // Looping derivative order to generate dmats.
 
9657
        for (unsigned int s = 0; s < n; s++)
 
9658
        {
 
9659
          // Updating dmats_old with new values and resetting dmats.
 
9660
          for (unsigned int t = 0; t < 10; t++)
 
9661
          {
 
9662
            for (unsigned int u = 0; u < 10; u++)
 
9663
            {
 
9664
              dmats_old[t][u] = dmats[t][u];
 
9665
              dmats[t][u] = 0.000000000000000;
 
9666
            }// end loop over 'u'
 
9667
          }// end loop over 't'
 
9668
          
 
9669
          // Update dmats using an inner product.
 
9670
          if (combinations[r][s] == 0)
 
9671
          {
 
9672
          for (unsigned int t = 0; t < 10; t++)
 
9673
          {
 
9674
            for (unsigned int u = 0; u < 10; u++)
 
9675
            {
 
9676
              for (unsigned int tu = 0; tu < 10; tu++)
 
9677
              {
 
9678
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9679
              }// end loop over 'tu'
 
9680
            }// end loop over 'u'
 
9681
          }// end loop over 't'
 
9682
          }
 
9683
          
 
9684
          if (combinations[r][s] == 1)
 
9685
          {
 
9686
          for (unsigned int t = 0; t < 10; t++)
 
9687
          {
 
9688
            for (unsigned int u = 0; u < 10; u++)
 
9689
            {
 
9690
              for (unsigned int tu = 0; tu < 10; tu++)
 
9691
              {
 
9692
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9693
              }// end loop over 'tu'
 
9694
            }// end loop over 'u'
 
9695
          }// end loop over 't'
 
9696
          }
 
9697
          
 
9698
          if (combinations[r][s] == 2)
 
9699
          {
 
9700
          for (unsigned int t = 0; t < 10; t++)
 
9701
          {
 
9702
            for (unsigned int u = 0; u < 10; u++)
 
9703
            {
 
9704
              for (unsigned int tu = 0; tu < 10; tu++)
 
9705
              {
 
9706
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9707
              }// end loop over 'tu'
 
9708
            }// end loop over 'u'
 
9709
          }// end loop over 't'
 
9710
          }
 
9711
          
 
9712
        }// end loop over 's'
 
9713
        for (unsigned int s = 0; s < 10; s++)
 
9714
        {
 
9715
          for (unsigned int t = 0; t < 10; t++)
 
9716
          {
 
9717
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9718
          }// end loop over 't'
 
9719
        }// end loop over 's'
 
9720
      }// end loop over 'r'
 
9721
      
 
9722
      // Transform derivatives back to physical element
 
9723
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9724
      {
 
9725
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9726
        {
 
9727
          values[r] += transform[r][s]*derivatives[s];
 
9728
        }// end loop over 's'
 
9729
      }// end loop over 'r'
 
9730
      
 
9731
      // Delete pointer to array of derivatives on FIAT element
 
9732
      delete [] derivatives;
 
9733
      
 
9734
      // Delete pointer to array of combinations of derivatives and transform
 
9735
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9736
      {
 
9737
        delete [] combinations[r];
 
9738
      }// end loop over 'r'
 
9739
      delete [] combinations;
 
9740
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9741
      {
 
9742
        delete [] transform[r];
 
9743
      }// end loop over 'r'
 
9744
      delete [] transform;
 
9745
        break;
 
9746
      }
 
9747
    case 9:
 
9748
      {
 
9749
        
 
9750
      // Array of basisvalues.
 
9751
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
9752
      
 
9753
      // Declare helper variables.
 
9754
      unsigned int rr = 0;
 
9755
      unsigned int ss = 0;
 
9756
      unsigned int tt = 0;
 
9757
      double tmp5 = 0.000000000000000;
 
9758
      double tmp6 = 0.000000000000000;
 
9759
      double tmp7 = 0.000000000000000;
 
9760
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
9761
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
9762
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
9763
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
9764
      double tmp4 = tmp3*tmp3;
 
9765
      
 
9766
      // Compute basisvalues.
 
9767
      basisvalues[0] = 1.000000000000000;
 
9768
      basisvalues[1] = tmp0;
 
9769
      for (unsigned int r = 1; r < 2; r++)
 
9770
      {
 
9771
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
9772
        ss = r*(r + 1)*(r + 2)/6;
 
9773
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
9774
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
9775
      }// end loop over 'r'
 
9776
      for (unsigned int r = 0; r < 2; r++)
 
9777
      {
 
9778
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
9779
        ss = r*(r + 1)*(r + 2)/6;
 
9780
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
9781
      }// end loop over 'r'
 
9782
      for (unsigned int r = 0; r < 1; r++)
 
9783
      {
 
9784
        for (unsigned int s = 1; s < 2 - r; s++)
 
9785
        {
 
9786
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
9787
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9788
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
9789
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9790
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9791
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
9792
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
9793
        }// end loop over 's'
 
9794
      }// end loop over 'r'
 
9795
      for (unsigned int r = 0; r < 2; r++)
 
9796
      {
 
9797
        for (unsigned int s = 0; s < 2 - r; s++)
 
9798
        {
 
9799
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
9800
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
9801
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
9802
        }// end loop over 's'
 
9803
      }// end loop over 'r'
 
9804
      for (unsigned int r = 0; r < 1; r++)
 
9805
      {
 
9806
        for (unsigned int s = 0; s < 1 - r; s++)
 
9807
        {
 
9808
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
9809
          {
 
9810
            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;
 
9811
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9812
            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;
 
9813
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9814
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9815
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
9816
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
9817
          }// end loop over 't'
 
9818
        }// end loop over 's'
 
9819
      }// end loop over 'r'
 
9820
      for (unsigned int r = 0; r < 3; r++)
 
9821
      {
 
9822
        for (unsigned int s = 0; s < 3 - r; s++)
 
9823
        {
 
9824
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
9825
          {
 
9826
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
9827
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
9828
          }// end loop over 't'
 
9829
        }// end loop over 's'
 
9830
      }// end loop over 'r'
 
9831
      
 
9832
      // Table(s) of coefficients.
 
9833
      static const double coefficients0[10] = \
 
9834
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
9835
      
 
9836
      // Tables of derivatives of the polynomial base (transpose).
 
9837
      static const double dmats0[10][10] = \
 
9838
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9839
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9840
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9841
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9842
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9843
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9844
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9845
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9846
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9847
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9848
      
 
9849
      static const double dmats1[10][10] = \
 
9850
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9851
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9852
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9853
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9854
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9855
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9856
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9857
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9858
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9859
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9860
      
 
9861
      static const double dmats2[10][10] = \
 
9862
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9863
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9864
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9865
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9866
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9867
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9868
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9869
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9870
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9871
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
9872
      
 
9873
      // Compute reference derivatives.
 
9874
      // Declare pointer to array of derivatives on FIAT element.
 
9875
      double *derivatives = new double[num_derivatives];
 
9876
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9877
      {
 
9878
        derivatives[r] = 0.000000000000000;
 
9879
      }// end loop over 'r'
 
9880
      
 
9881
      // Declare derivative matrix (of polynomial basis).
 
9882
      double dmats[10][10] = \
 
9883
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9884
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9885
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9886
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9887
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9888
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9889
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9890
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9891
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9892
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9893
      
 
9894
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
9895
      double dmats_old[10][10] = \
 
9896
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9897
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9898
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9899
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9900
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9901
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9902
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
9903
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
9904
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
9905
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
9906
      
 
9907
      // Loop possible derivatives.
 
9908
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9909
      {
 
9910
        // Resetting dmats values to compute next derivative.
 
9911
        for (unsigned int t = 0; t < 10; t++)
 
9912
        {
 
9913
          for (unsigned int u = 0; u < 10; u++)
 
9914
          {
 
9915
            dmats[t][u] = 0.000000000000000;
 
9916
            if (t == u)
 
9917
            {
 
9918
            dmats[t][u] = 1.000000000000000;
 
9919
            }
 
9920
            
 
9921
          }// end loop over 'u'
 
9922
        }// end loop over 't'
 
9923
        
 
9924
        // Looping derivative order to generate dmats.
 
9925
        for (unsigned int s = 0; s < n; s++)
 
9926
        {
 
9927
          // Updating dmats_old with new values and resetting dmats.
 
9928
          for (unsigned int t = 0; t < 10; t++)
 
9929
          {
 
9930
            for (unsigned int u = 0; u < 10; u++)
 
9931
            {
 
9932
              dmats_old[t][u] = dmats[t][u];
 
9933
              dmats[t][u] = 0.000000000000000;
 
9934
            }// end loop over 'u'
 
9935
          }// end loop over 't'
 
9936
          
 
9937
          // Update dmats using an inner product.
 
9938
          if (combinations[r][s] == 0)
 
9939
          {
 
9940
          for (unsigned int t = 0; t < 10; t++)
 
9941
          {
 
9942
            for (unsigned int u = 0; u < 10; u++)
 
9943
            {
 
9944
              for (unsigned int tu = 0; tu < 10; tu++)
 
9945
              {
 
9946
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
9947
              }// end loop over 'tu'
 
9948
            }// end loop over 'u'
 
9949
          }// end loop over 't'
 
9950
          }
 
9951
          
 
9952
          if (combinations[r][s] == 1)
 
9953
          {
 
9954
          for (unsigned int t = 0; t < 10; t++)
 
9955
          {
 
9956
            for (unsigned int u = 0; u < 10; u++)
 
9957
            {
 
9958
              for (unsigned int tu = 0; tu < 10; tu++)
 
9959
              {
 
9960
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
9961
              }// end loop over 'tu'
 
9962
            }// end loop over 'u'
 
9963
          }// end loop over 't'
 
9964
          }
 
9965
          
 
9966
          if (combinations[r][s] == 2)
 
9967
          {
 
9968
          for (unsigned int t = 0; t < 10; t++)
 
9969
          {
 
9970
            for (unsigned int u = 0; u < 10; u++)
 
9971
            {
 
9972
              for (unsigned int tu = 0; tu < 10; tu++)
 
9973
              {
 
9974
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
9975
              }// end loop over 'tu'
 
9976
            }// end loop over 'u'
 
9977
          }// end loop over 't'
 
9978
          }
 
9979
          
 
9980
        }// end loop over 's'
 
9981
        for (unsigned int s = 0; s < 10; s++)
 
9982
        {
 
9983
          for (unsigned int t = 0; t < 10; t++)
 
9984
          {
 
9985
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
9986
          }// end loop over 't'
 
9987
        }// end loop over 's'
 
9988
      }// end loop over 'r'
 
9989
      
 
9990
      // Transform derivatives back to physical element
 
9991
      for (unsigned int r = 0; r < num_derivatives; r++)
 
9992
      {
 
9993
        for (unsigned int s = 0; s < num_derivatives; s++)
 
9994
        {
 
9995
          values[r] += transform[r][s]*derivatives[s];
 
9996
        }// end loop over 's'
 
9997
      }// end loop over 'r'
 
9998
      
 
9999
      // Delete pointer to array of derivatives on FIAT element
 
10000
      delete [] derivatives;
 
10001
      
 
10002
      // Delete pointer to array of combinations of derivatives and transform
 
10003
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10004
      {
 
10005
        delete [] combinations[r];
 
10006
      }// end loop over 'r'
 
10007
      delete [] combinations;
 
10008
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10009
      {
 
10010
        delete [] transform[r];
 
10011
      }// end loop over 'r'
 
10012
      delete [] transform;
 
10013
        break;
 
10014
      }
 
10015
    case 10:
 
10016
      {
 
10017
        
 
10018
      // Array of basisvalues.
 
10019
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
10020
      
 
10021
      // Declare helper variables.
 
10022
      unsigned int rr = 0;
 
10023
      unsigned int ss = 0;
 
10024
      unsigned int tt = 0;
 
10025
      double tmp5 = 0.000000000000000;
 
10026
      double tmp6 = 0.000000000000000;
 
10027
      double tmp7 = 0.000000000000000;
 
10028
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
10029
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
10030
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
10031
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
10032
      double tmp4 = tmp3*tmp3;
 
10033
      
 
10034
      // Compute basisvalues.
 
10035
      basisvalues[0] = 1.000000000000000;
 
10036
      basisvalues[1] = tmp0;
 
10037
      for (unsigned int r = 1; r < 2; r++)
 
10038
      {
 
10039
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10040
        ss = r*(r + 1)*(r + 2)/6;
 
10041
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10042
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
10043
      }// end loop over 'r'
 
10044
      for (unsigned int r = 0; r < 2; r++)
 
10045
      {
 
10046
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10047
        ss = r*(r + 1)*(r + 2)/6;
 
10048
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
10049
      }// end loop over 'r'
 
10050
      for (unsigned int r = 0; r < 1; r++)
 
10051
      {
 
10052
        for (unsigned int s = 1; s < 2 - r; s++)
 
10053
        {
 
10054
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10055
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10056
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10057
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10058
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10059
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10060
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10061
        }// end loop over 's'
 
10062
      }// end loop over 'r'
 
10063
      for (unsigned int r = 0; r < 2; r++)
 
10064
      {
 
10065
        for (unsigned int s = 0; s < 2 - r; s++)
 
10066
        {
 
10067
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10068
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10069
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
10070
        }// end loop over 's'
 
10071
      }// end loop over 'r'
 
10072
      for (unsigned int r = 0; r < 1; r++)
 
10073
      {
 
10074
        for (unsigned int s = 0; s < 1 - r; s++)
 
10075
        {
 
10076
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10077
          {
 
10078
            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;
 
10079
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10080
            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;
 
10081
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10082
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10083
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10084
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10085
          }// end loop over 't'
 
10086
        }// end loop over 's'
 
10087
      }// end loop over 'r'
 
10088
      for (unsigned int r = 0; r < 3; r++)
 
10089
      {
 
10090
        for (unsigned int s = 0; s < 3 - r; s++)
 
10091
        {
 
10092
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10093
          {
 
10094
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10095
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
10096
          }// end loop over 't'
 
10097
        }// end loop over 's'
 
10098
      }// end loop over 'r'
 
10099
      
 
10100
      // Table(s) of coefficients.
 
10101
      static const double coefficients0[10] = \
 
10102
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
10103
      
 
10104
      // Tables of derivatives of the polynomial base (transpose).
 
10105
      static const double dmats0[10][10] = \
 
10106
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10107
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10108
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10109
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10110
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10111
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10112
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10113
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10114
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10115
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10116
      
 
10117
      static const double dmats1[10][10] = \
 
10118
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10119
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10120
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10121
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10122
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10123
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10124
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10125
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10126
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10127
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10128
      
 
10129
      static const double dmats2[10][10] = \
 
10130
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10131
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10132
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10133
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10134
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10135
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10136
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10137
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10138
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10139
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10140
      
 
10141
      // Compute reference derivatives.
 
10142
      // Declare pointer to array of derivatives on FIAT element.
 
10143
      double *derivatives = new double[num_derivatives];
 
10144
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10145
      {
 
10146
        derivatives[r] = 0.000000000000000;
 
10147
      }// end loop over 'r'
 
10148
      
 
10149
      // Declare derivative matrix (of polynomial basis).
 
10150
      double dmats[10][10] = \
 
10151
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10152
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10153
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10154
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10155
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10156
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10157
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10158
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10159
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10160
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10161
      
 
10162
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10163
      double dmats_old[10][10] = \
 
10164
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10165
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10166
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10167
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10168
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10169
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10170
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10171
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10172
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10173
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10174
      
 
10175
      // Loop possible derivatives.
 
10176
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10177
      {
 
10178
        // Resetting dmats values to compute next derivative.
 
10179
        for (unsigned int t = 0; t < 10; t++)
 
10180
        {
 
10181
          for (unsigned int u = 0; u < 10; u++)
 
10182
          {
 
10183
            dmats[t][u] = 0.000000000000000;
 
10184
            if (t == u)
 
10185
            {
 
10186
            dmats[t][u] = 1.000000000000000;
 
10187
            }
 
10188
            
 
10189
          }// end loop over 'u'
 
10190
        }// end loop over 't'
 
10191
        
 
10192
        // Looping derivative order to generate dmats.
 
10193
        for (unsigned int s = 0; s < n; s++)
 
10194
        {
 
10195
          // Updating dmats_old with new values and resetting dmats.
 
10196
          for (unsigned int t = 0; t < 10; t++)
 
10197
          {
 
10198
            for (unsigned int u = 0; u < 10; u++)
 
10199
            {
 
10200
              dmats_old[t][u] = dmats[t][u];
 
10201
              dmats[t][u] = 0.000000000000000;
 
10202
            }// end loop over 'u'
 
10203
          }// end loop over 't'
 
10204
          
 
10205
          // Update dmats using an inner product.
 
10206
          if (combinations[r][s] == 0)
 
10207
          {
 
10208
          for (unsigned int t = 0; t < 10; t++)
 
10209
          {
 
10210
            for (unsigned int u = 0; u < 10; u++)
 
10211
            {
 
10212
              for (unsigned int tu = 0; tu < 10; tu++)
 
10213
              {
 
10214
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10215
              }// end loop over 'tu'
 
10216
            }// end loop over 'u'
 
10217
          }// end loop over 't'
 
10218
          }
 
10219
          
 
10220
          if (combinations[r][s] == 1)
 
10221
          {
 
10222
          for (unsigned int t = 0; t < 10; t++)
 
10223
          {
 
10224
            for (unsigned int u = 0; u < 10; u++)
 
10225
            {
 
10226
              for (unsigned int tu = 0; tu < 10; tu++)
 
10227
              {
 
10228
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10229
              }// end loop over 'tu'
 
10230
            }// end loop over 'u'
 
10231
          }// end loop over 't'
 
10232
          }
 
10233
          
 
10234
          if (combinations[r][s] == 2)
 
10235
          {
 
10236
          for (unsigned int t = 0; t < 10; t++)
 
10237
          {
 
10238
            for (unsigned int u = 0; u < 10; u++)
 
10239
            {
 
10240
              for (unsigned int tu = 0; tu < 10; tu++)
 
10241
              {
 
10242
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10243
              }// end loop over 'tu'
 
10244
            }// end loop over 'u'
 
10245
          }// end loop over 't'
 
10246
          }
 
10247
          
 
10248
        }// end loop over 's'
 
10249
        for (unsigned int s = 0; s < 10; s++)
 
10250
        {
 
10251
          for (unsigned int t = 0; t < 10; t++)
 
10252
          {
 
10253
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
10254
          }// end loop over 't'
 
10255
        }// end loop over 's'
 
10256
      }// end loop over 'r'
 
10257
      
 
10258
      // Transform derivatives back to physical element
 
10259
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10260
      {
 
10261
        for (unsigned int s = 0; s < num_derivatives; s++)
 
10262
        {
 
10263
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
10264
        }// end loop over 's'
 
10265
      }// end loop over 'r'
 
10266
      
 
10267
      // Delete pointer to array of derivatives on FIAT element
 
10268
      delete [] derivatives;
 
10269
      
 
10270
      // Delete pointer to array of combinations of derivatives and transform
 
10271
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10272
      {
 
10273
        delete [] combinations[r];
 
10274
      }// end loop over 'r'
 
10275
      delete [] combinations;
 
10276
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10277
      {
 
10278
        delete [] transform[r];
 
10279
      }// end loop over 'r'
 
10280
      delete [] transform;
 
10281
        break;
 
10282
      }
 
10283
    case 11:
 
10284
      {
 
10285
        
 
10286
      // Array of basisvalues.
 
10287
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
10288
      
 
10289
      // Declare helper variables.
 
10290
      unsigned int rr = 0;
 
10291
      unsigned int ss = 0;
 
10292
      unsigned int tt = 0;
 
10293
      double tmp5 = 0.000000000000000;
 
10294
      double tmp6 = 0.000000000000000;
 
10295
      double tmp7 = 0.000000000000000;
 
10296
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
10297
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
10298
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
10299
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
10300
      double tmp4 = tmp3*tmp3;
 
10301
      
 
10302
      // Compute basisvalues.
 
10303
      basisvalues[0] = 1.000000000000000;
 
10304
      basisvalues[1] = tmp0;
 
10305
      for (unsigned int r = 1; r < 2; r++)
 
10306
      {
 
10307
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10308
        ss = r*(r + 1)*(r + 2)/6;
 
10309
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10310
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
10311
      }// end loop over 'r'
 
10312
      for (unsigned int r = 0; r < 2; r++)
 
10313
      {
 
10314
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10315
        ss = r*(r + 1)*(r + 2)/6;
 
10316
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
10317
      }// end loop over 'r'
 
10318
      for (unsigned int r = 0; r < 1; r++)
 
10319
      {
 
10320
        for (unsigned int s = 1; s < 2 - r; s++)
 
10321
        {
 
10322
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10323
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10324
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10325
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10326
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10327
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10328
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10329
        }// end loop over 's'
 
10330
      }// end loop over 'r'
 
10331
      for (unsigned int r = 0; r < 2; r++)
 
10332
      {
 
10333
        for (unsigned int s = 0; s < 2 - r; s++)
 
10334
        {
 
10335
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10336
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10337
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
10338
        }// end loop over 's'
 
10339
      }// end loop over 'r'
 
10340
      for (unsigned int r = 0; r < 1; r++)
 
10341
      {
 
10342
        for (unsigned int s = 0; s < 1 - r; s++)
 
10343
        {
 
10344
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10345
          {
 
10346
            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;
 
10347
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10348
            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;
 
10349
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10350
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10351
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10352
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10353
          }// end loop over 't'
 
10354
        }// end loop over 's'
 
10355
      }// end loop over 'r'
 
10356
      for (unsigned int r = 0; r < 3; r++)
 
10357
      {
 
10358
        for (unsigned int s = 0; s < 3 - r; s++)
 
10359
        {
 
10360
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10361
          {
 
10362
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10363
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
10364
          }// end loop over 't'
 
10365
        }// end loop over 's'
 
10366
      }// end loop over 'r'
 
10367
      
 
10368
      // Table(s) of coefficients.
 
10369
      static const double coefficients0[10] = \
 
10370
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
10371
      
 
10372
      // Tables of derivatives of the polynomial base (transpose).
 
10373
      static const double dmats0[10][10] = \
 
10374
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10375
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10376
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10377
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10378
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10379
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10380
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10381
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10382
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10383
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10384
      
 
10385
      static const double dmats1[10][10] = \
 
10386
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10387
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10388
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10389
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10390
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10391
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10392
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10393
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10394
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10395
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10396
      
 
10397
      static const double dmats2[10][10] = \
 
10398
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10399
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10400
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10401
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10402
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10403
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10404
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10405
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10406
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10407
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10408
      
 
10409
      // Compute reference derivatives.
 
10410
      // Declare pointer to array of derivatives on FIAT element.
 
10411
      double *derivatives = new double[num_derivatives];
 
10412
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10413
      {
 
10414
        derivatives[r] = 0.000000000000000;
 
10415
      }// end loop over 'r'
 
10416
      
 
10417
      // Declare derivative matrix (of polynomial basis).
 
10418
      double dmats[10][10] = \
 
10419
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10420
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10421
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10422
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10423
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10424
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10425
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10426
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10427
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10428
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10429
      
 
10430
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10431
      double dmats_old[10][10] = \
 
10432
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10433
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10434
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10435
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10436
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10437
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10438
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10439
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10440
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10441
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10442
      
 
10443
      // Loop possible derivatives.
 
10444
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10445
      {
 
10446
        // Resetting dmats values to compute next derivative.
 
10447
        for (unsigned int t = 0; t < 10; t++)
 
10448
        {
 
10449
          for (unsigned int u = 0; u < 10; u++)
 
10450
          {
 
10451
            dmats[t][u] = 0.000000000000000;
 
10452
            if (t == u)
 
10453
            {
 
10454
            dmats[t][u] = 1.000000000000000;
 
10455
            }
 
10456
            
 
10457
          }// end loop over 'u'
 
10458
        }// end loop over 't'
 
10459
        
 
10460
        // Looping derivative order to generate dmats.
 
10461
        for (unsigned int s = 0; s < n; s++)
 
10462
        {
 
10463
          // Updating dmats_old with new values and resetting dmats.
 
10464
          for (unsigned int t = 0; t < 10; t++)
 
10465
          {
 
10466
            for (unsigned int u = 0; u < 10; u++)
 
10467
            {
 
10468
              dmats_old[t][u] = dmats[t][u];
 
10469
              dmats[t][u] = 0.000000000000000;
 
10470
            }// end loop over 'u'
 
10471
          }// end loop over 't'
 
10472
          
 
10473
          // Update dmats using an inner product.
 
10474
          if (combinations[r][s] == 0)
 
10475
          {
 
10476
          for (unsigned int t = 0; t < 10; t++)
 
10477
          {
 
10478
            for (unsigned int u = 0; u < 10; u++)
 
10479
            {
 
10480
              for (unsigned int tu = 0; tu < 10; tu++)
 
10481
              {
 
10482
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10483
              }// end loop over 'tu'
 
10484
            }// end loop over 'u'
 
10485
          }// end loop over 't'
 
10486
          }
 
10487
          
 
10488
          if (combinations[r][s] == 1)
 
10489
          {
 
10490
          for (unsigned int t = 0; t < 10; t++)
 
10491
          {
 
10492
            for (unsigned int u = 0; u < 10; u++)
 
10493
            {
 
10494
              for (unsigned int tu = 0; tu < 10; tu++)
 
10495
              {
 
10496
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10497
              }// end loop over 'tu'
 
10498
            }// end loop over 'u'
 
10499
          }// end loop over 't'
 
10500
          }
 
10501
          
 
10502
          if (combinations[r][s] == 2)
 
10503
          {
 
10504
          for (unsigned int t = 0; t < 10; t++)
 
10505
          {
 
10506
            for (unsigned int u = 0; u < 10; u++)
 
10507
            {
 
10508
              for (unsigned int tu = 0; tu < 10; tu++)
 
10509
              {
 
10510
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10511
              }// end loop over 'tu'
 
10512
            }// end loop over 'u'
 
10513
          }// end loop over 't'
 
10514
          }
 
10515
          
 
10516
        }// end loop over 's'
 
10517
        for (unsigned int s = 0; s < 10; s++)
 
10518
        {
 
10519
          for (unsigned int t = 0; t < 10; t++)
 
10520
          {
 
10521
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
10522
          }// end loop over 't'
 
10523
        }// end loop over 's'
 
10524
      }// end loop over 'r'
 
10525
      
 
10526
      // Transform derivatives back to physical element
 
10527
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10528
      {
 
10529
        for (unsigned int s = 0; s < num_derivatives; s++)
 
10530
        {
 
10531
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
10532
        }// end loop over 's'
 
10533
      }// end loop over 'r'
 
10534
      
 
10535
      // Delete pointer to array of derivatives on FIAT element
 
10536
      delete [] derivatives;
 
10537
      
 
10538
      // Delete pointer to array of combinations of derivatives and transform
 
10539
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10540
      {
 
10541
        delete [] combinations[r];
 
10542
      }// end loop over 'r'
 
10543
      delete [] combinations;
 
10544
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10545
      {
 
10546
        delete [] transform[r];
 
10547
      }// end loop over 'r'
 
10548
      delete [] transform;
 
10549
        break;
 
10550
      }
 
10551
    case 12:
 
10552
      {
 
10553
        
 
10554
      // Array of basisvalues.
 
10555
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
10556
      
 
10557
      // Declare helper variables.
 
10558
      unsigned int rr = 0;
 
10559
      unsigned int ss = 0;
 
10560
      unsigned int tt = 0;
 
10561
      double tmp5 = 0.000000000000000;
 
10562
      double tmp6 = 0.000000000000000;
 
10563
      double tmp7 = 0.000000000000000;
 
10564
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
10565
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
10566
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
10567
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
10568
      double tmp4 = tmp3*tmp3;
 
10569
      
 
10570
      // Compute basisvalues.
 
10571
      basisvalues[0] = 1.000000000000000;
 
10572
      basisvalues[1] = tmp0;
 
10573
      for (unsigned int r = 1; r < 2; r++)
 
10574
      {
 
10575
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10576
        ss = r*(r + 1)*(r + 2)/6;
 
10577
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10578
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
10579
      }// end loop over 'r'
 
10580
      for (unsigned int r = 0; r < 2; r++)
 
10581
      {
 
10582
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10583
        ss = r*(r + 1)*(r + 2)/6;
 
10584
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
10585
      }// end loop over 'r'
 
10586
      for (unsigned int r = 0; r < 1; r++)
 
10587
      {
 
10588
        for (unsigned int s = 1; s < 2 - r; s++)
 
10589
        {
 
10590
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10591
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10592
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10593
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10594
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10595
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10596
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10597
        }// end loop over 's'
 
10598
      }// end loop over 'r'
 
10599
      for (unsigned int r = 0; r < 2; r++)
 
10600
      {
 
10601
        for (unsigned int s = 0; s < 2 - r; s++)
 
10602
        {
 
10603
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10604
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10605
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
10606
        }// end loop over 's'
 
10607
      }// end loop over 'r'
 
10608
      for (unsigned int r = 0; r < 1; r++)
 
10609
      {
 
10610
        for (unsigned int s = 0; s < 1 - r; s++)
 
10611
        {
 
10612
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10613
          {
 
10614
            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;
 
10615
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10616
            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;
 
10617
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10618
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10619
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10620
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10621
          }// end loop over 't'
 
10622
        }// end loop over 's'
 
10623
      }// end loop over 'r'
 
10624
      for (unsigned int r = 0; r < 3; r++)
 
10625
      {
 
10626
        for (unsigned int s = 0; s < 3 - r; s++)
 
10627
        {
 
10628
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10629
          {
 
10630
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10631
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
10632
          }// end loop over 't'
 
10633
        }// end loop over 's'
 
10634
      }// end loop over 'r'
 
10635
      
 
10636
      // Table(s) of coefficients.
 
10637
      static const double coefficients0[10] = \
 
10638
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
10639
      
 
10640
      // Tables of derivatives of the polynomial base (transpose).
 
10641
      static const double dmats0[10][10] = \
 
10642
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10643
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10644
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10645
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10646
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10647
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10648
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10649
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10650
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10651
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10652
      
 
10653
      static const double dmats1[10][10] = \
 
10654
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10655
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10656
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10657
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10658
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10659
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10660
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10661
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10662
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10663
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10664
      
 
10665
      static const double dmats2[10][10] = \
 
10666
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10667
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10668
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10669
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10670
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10671
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10672
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10673
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10674
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10675
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10676
      
 
10677
      // Compute reference derivatives.
 
10678
      // Declare pointer to array of derivatives on FIAT element.
 
10679
      double *derivatives = new double[num_derivatives];
 
10680
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10681
      {
 
10682
        derivatives[r] = 0.000000000000000;
 
10683
      }// end loop over 'r'
 
10684
      
 
10685
      // Declare derivative matrix (of polynomial basis).
 
10686
      double dmats[10][10] = \
 
10687
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10688
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10689
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10690
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10691
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10692
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10693
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10694
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10695
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10696
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10697
      
 
10698
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10699
      double dmats_old[10][10] = \
 
10700
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10701
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10702
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10703
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10704
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10705
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10706
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10707
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10708
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10709
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10710
      
 
10711
      // Loop possible derivatives.
 
10712
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10713
      {
 
10714
        // Resetting dmats values to compute next derivative.
 
10715
        for (unsigned int t = 0; t < 10; t++)
 
10716
        {
 
10717
          for (unsigned int u = 0; u < 10; u++)
 
10718
          {
 
10719
            dmats[t][u] = 0.000000000000000;
 
10720
            if (t == u)
 
10721
            {
 
10722
            dmats[t][u] = 1.000000000000000;
 
10723
            }
 
10724
            
 
10725
          }// end loop over 'u'
 
10726
        }// end loop over 't'
 
10727
        
 
10728
        // Looping derivative order to generate dmats.
 
10729
        for (unsigned int s = 0; s < n; s++)
 
10730
        {
 
10731
          // Updating dmats_old with new values and resetting dmats.
 
10732
          for (unsigned int t = 0; t < 10; t++)
 
10733
          {
 
10734
            for (unsigned int u = 0; u < 10; u++)
 
10735
            {
 
10736
              dmats_old[t][u] = dmats[t][u];
 
10737
              dmats[t][u] = 0.000000000000000;
 
10738
            }// end loop over 'u'
 
10739
          }// end loop over 't'
 
10740
          
 
10741
          // Update dmats using an inner product.
 
10742
          if (combinations[r][s] == 0)
 
10743
          {
 
10744
          for (unsigned int t = 0; t < 10; t++)
 
10745
          {
 
10746
            for (unsigned int u = 0; u < 10; u++)
 
10747
            {
 
10748
              for (unsigned int tu = 0; tu < 10; tu++)
 
10749
              {
 
10750
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
10751
              }// end loop over 'tu'
 
10752
            }// end loop over 'u'
 
10753
          }// end loop over 't'
 
10754
          }
 
10755
          
 
10756
          if (combinations[r][s] == 1)
 
10757
          {
 
10758
          for (unsigned int t = 0; t < 10; t++)
 
10759
          {
 
10760
            for (unsigned int u = 0; u < 10; u++)
 
10761
            {
 
10762
              for (unsigned int tu = 0; tu < 10; tu++)
 
10763
              {
 
10764
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
10765
              }// end loop over 'tu'
 
10766
            }// end loop over 'u'
 
10767
          }// end loop over 't'
 
10768
          }
 
10769
          
 
10770
          if (combinations[r][s] == 2)
 
10771
          {
 
10772
          for (unsigned int t = 0; t < 10; t++)
 
10773
          {
 
10774
            for (unsigned int u = 0; u < 10; u++)
 
10775
            {
 
10776
              for (unsigned int tu = 0; tu < 10; tu++)
 
10777
              {
 
10778
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
10779
              }// end loop over 'tu'
 
10780
            }// end loop over 'u'
 
10781
          }// end loop over 't'
 
10782
          }
 
10783
          
 
10784
        }// end loop over 's'
 
10785
        for (unsigned int s = 0; s < 10; s++)
 
10786
        {
 
10787
          for (unsigned int t = 0; t < 10; t++)
 
10788
          {
 
10789
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
10790
          }// end loop over 't'
 
10791
        }// end loop over 's'
 
10792
      }// end loop over 'r'
 
10793
      
 
10794
      // Transform derivatives back to physical element
 
10795
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10796
      {
 
10797
        for (unsigned int s = 0; s < num_derivatives; s++)
 
10798
        {
 
10799
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
10800
        }// end loop over 's'
 
10801
      }// end loop over 'r'
 
10802
      
 
10803
      // Delete pointer to array of derivatives on FIAT element
 
10804
      delete [] derivatives;
 
10805
      
 
10806
      // Delete pointer to array of combinations of derivatives and transform
 
10807
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10808
      {
 
10809
        delete [] combinations[r];
 
10810
      }// end loop over 'r'
 
10811
      delete [] combinations;
 
10812
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10813
      {
 
10814
        delete [] transform[r];
 
10815
      }// end loop over 'r'
 
10816
      delete [] transform;
 
10817
        break;
 
10818
      }
 
10819
    case 13:
 
10820
      {
 
10821
        
 
10822
      // Array of basisvalues.
 
10823
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
10824
      
 
10825
      // Declare helper variables.
 
10826
      unsigned int rr = 0;
 
10827
      unsigned int ss = 0;
 
10828
      unsigned int tt = 0;
 
10829
      double tmp5 = 0.000000000000000;
 
10830
      double tmp6 = 0.000000000000000;
 
10831
      double tmp7 = 0.000000000000000;
 
10832
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
10833
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
10834
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
10835
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
10836
      double tmp4 = tmp3*tmp3;
 
10837
      
 
10838
      // Compute basisvalues.
 
10839
      basisvalues[0] = 1.000000000000000;
 
10840
      basisvalues[1] = tmp0;
 
10841
      for (unsigned int r = 1; r < 2; r++)
 
10842
      {
 
10843
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
10844
        ss = r*(r + 1)*(r + 2)/6;
 
10845
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
10846
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
10847
      }// end loop over 'r'
 
10848
      for (unsigned int r = 0; r < 2; r++)
 
10849
      {
 
10850
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
10851
        ss = r*(r + 1)*(r + 2)/6;
 
10852
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
10853
      }// end loop over 'r'
 
10854
      for (unsigned int r = 0; r < 1; r++)
 
10855
      {
 
10856
        for (unsigned int s = 1; s < 2 - r; s++)
 
10857
        {
 
10858
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
10859
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10860
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
10861
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10862
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10863
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
10864
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
10865
        }// end loop over 's'
 
10866
      }// end loop over 'r'
 
10867
      for (unsigned int r = 0; r < 2; r++)
 
10868
      {
 
10869
        for (unsigned int s = 0; s < 2 - r; s++)
 
10870
        {
 
10871
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
10872
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
10873
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
10874
        }// end loop over 's'
 
10875
      }// end loop over 'r'
 
10876
      for (unsigned int r = 0; r < 1; r++)
 
10877
      {
 
10878
        for (unsigned int s = 0; s < 1 - r; s++)
 
10879
        {
 
10880
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
10881
          {
 
10882
            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;
 
10883
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10884
            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;
 
10885
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10886
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10887
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
10888
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
10889
          }// end loop over 't'
 
10890
        }// end loop over 's'
 
10891
      }// end loop over 'r'
 
10892
      for (unsigned int r = 0; r < 3; r++)
 
10893
      {
 
10894
        for (unsigned int s = 0; s < 3 - r; s++)
 
10895
        {
 
10896
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
10897
          {
 
10898
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
10899
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
10900
          }// end loop over 't'
 
10901
        }// end loop over 's'
 
10902
      }// end loop over 'r'
 
10903
      
 
10904
      // Table(s) of coefficients.
 
10905
      static const double coefficients0[10] = \
 
10906
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
10907
      
 
10908
      // Tables of derivatives of the polynomial base (transpose).
 
10909
      static const double dmats0[10][10] = \
 
10910
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10911
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10912
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10913
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10914
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10915
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10916
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10917
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10918
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10919
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10920
      
 
10921
      static const double dmats1[10][10] = \
 
10922
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10923
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10924
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10925
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10926
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10927
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10928
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10929
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10930
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10931
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10932
      
 
10933
      static const double dmats2[10][10] = \
 
10934
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10935
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10936
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10937
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10938
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10939
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10940
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10941
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10942
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10943
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
10944
      
 
10945
      // Compute reference derivatives.
 
10946
      // Declare pointer to array of derivatives on FIAT element.
 
10947
      double *derivatives = new double[num_derivatives];
 
10948
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10949
      {
 
10950
        derivatives[r] = 0.000000000000000;
 
10951
      }// end loop over 'r'
 
10952
      
 
10953
      // Declare derivative matrix (of polynomial basis).
 
10954
      double dmats[10][10] = \
 
10955
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10956
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10957
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10958
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10959
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10960
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10961
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10962
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10963
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10964
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10965
      
 
10966
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
10967
      double dmats_old[10][10] = \
 
10968
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10969
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10970
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10971
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10972
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10973
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10974
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
10975
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
10976
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
10977
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
10978
      
 
10979
      // Loop possible derivatives.
 
10980
      for (unsigned int r = 0; r < num_derivatives; r++)
 
10981
      {
 
10982
        // Resetting dmats values to compute next derivative.
 
10983
        for (unsigned int t = 0; t < 10; t++)
 
10984
        {
 
10985
          for (unsigned int u = 0; u < 10; u++)
 
10986
          {
 
10987
            dmats[t][u] = 0.000000000000000;
 
10988
            if (t == u)
 
10989
            {
 
10990
            dmats[t][u] = 1.000000000000000;
 
10991
            }
 
10992
            
 
10993
          }// end loop over 'u'
 
10994
        }// end loop over 't'
 
10995
        
 
10996
        // Looping derivative order to generate dmats.
 
10997
        for (unsigned int s = 0; s < n; s++)
 
10998
        {
 
10999
          // Updating dmats_old with new values and resetting dmats.
 
11000
          for (unsigned int t = 0; t < 10; t++)
 
11001
          {
 
11002
            for (unsigned int u = 0; u < 10; u++)
 
11003
            {
 
11004
              dmats_old[t][u] = dmats[t][u];
 
11005
              dmats[t][u] = 0.000000000000000;
 
11006
            }// end loop over 'u'
 
11007
          }// end loop over 't'
 
11008
          
 
11009
          // Update dmats using an inner product.
 
11010
          if (combinations[r][s] == 0)
 
11011
          {
 
11012
          for (unsigned int t = 0; t < 10; t++)
 
11013
          {
 
11014
            for (unsigned int u = 0; u < 10; u++)
 
11015
            {
 
11016
              for (unsigned int tu = 0; tu < 10; tu++)
 
11017
              {
 
11018
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11019
              }// end loop over 'tu'
 
11020
            }// end loop over 'u'
 
11021
          }// end loop over 't'
 
11022
          }
 
11023
          
 
11024
          if (combinations[r][s] == 1)
 
11025
          {
 
11026
          for (unsigned int t = 0; t < 10; t++)
 
11027
          {
 
11028
            for (unsigned int u = 0; u < 10; u++)
 
11029
            {
 
11030
              for (unsigned int tu = 0; tu < 10; tu++)
 
11031
              {
 
11032
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11033
              }// end loop over 'tu'
 
11034
            }// end loop over 'u'
 
11035
          }// end loop over 't'
 
11036
          }
 
11037
          
 
11038
          if (combinations[r][s] == 2)
 
11039
          {
 
11040
          for (unsigned int t = 0; t < 10; t++)
 
11041
          {
 
11042
            for (unsigned int u = 0; u < 10; u++)
 
11043
            {
 
11044
              for (unsigned int tu = 0; tu < 10; tu++)
 
11045
              {
 
11046
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11047
              }// end loop over 'tu'
 
11048
            }// end loop over 'u'
 
11049
          }// end loop over 't'
 
11050
          }
 
11051
          
 
11052
        }// end loop over 's'
 
11053
        for (unsigned int s = 0; s < 10; s++)
 
11054
        {
 
11055
          for (unsigned int t = 0; t < 10; t++)
 
11056
          {
 
11057
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11058
          }// end loop over 't'
 
11059
        }// end loop over 's'
 
11060
      }// end loop over 'r'
 
11061
      
 
11062
      // Transform derivatives back to physical element
 
11063
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11064
      {
 
11065
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11066
        {
 
11067
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11068
        }// end loop over 's'
 
11069
      }// end loop over 'r'
 
11070
      
 
11071
      // Delete pointer to array of derivatives on FIAT element
 
11072
      delete [] derivatives;
 
11073
      
 
11074
      // Delete pointer to array of combinations of derivatives and transform
 
11075
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11076
      {
 
11077
        delete [] combinations[r];
 
11078
      }// end loop over 'r'
 
11079
      delete [] combinations;
 
11080
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11081
      {
 
11082
        delete [] transform[r];
 
11083
      }// end loop over 'r'
 
11084
      delete [] transform;
 
11085
        break;
 
11086
      }
 
11087
    case 14:
 
11088
      {
 
11089
        
 
11090
      // Array of basisvalues.
 
11091
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
11092
      
 
11093
      // Declare helper variables.
 
11094
      unsigned int rr = 0;
 
11095
      unsigned int ss = 0;
 
11096
      unsigned int tt = 0;
 
11097
      double tmp5 = 0.000000000000000;
 
11098
      double tmp6 = 0.000000000000000;
 
11099
      double tmp7 = 0.000000000000000;
 
11100
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
11101
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
11102
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
11103
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
11104
      double tmp4 = tmp3*tmp3;
 
11105
      
 
11106
      // Compute basisvalues.
 
11107
      basisvalues[0] = 1.000000000000000;
 
11108
      basisvalues[1] = tmp0;
 
11109
      for (unsigned int r = 1; r < 2; r++)
 
11110
      {
 
11111
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11112
        ss = r*(r + 1)*(r + 2)/6;
 
11113
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11114
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
11115
      }// end loop over 'r'
 
11116
      for (unsigned int r = 0; r < 2; r++)
 
11117
      {
 
11118
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11119
        ss = r*(r + 1)*(r + 2)/6;
 
11120
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
11121
      }// end loop over 'r'
 
11122
      for (unsigned int r = 0; r < 1; r++)
 
11123
      {
 
11124
        for (unsigned int s = 1; s < 2 - r; s++)
 
11125
        {
 
11126
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11127
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11128
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11129
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11130
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11131
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11132
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11133
        }// end loop over 's'
 
11134
      }// end loop over 'r'
 
11135
      for (unsigned int r = 0; r < 2; r++)
 
11136
      {
 
11137
        for (unsigned int s = 0; s < 2 - r; s++)
 
11138
        {
 
11139
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11140
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11141
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
11142
        }// end loop over 's'
 
11143
      }// end loop over 'r'
 
11144
      for (unsigned int r = 0; r < 1; r++)
 
11145
      {
 
11146
        for (unsigned int s = 0; s < 1 - r; s++)
 
11147
        {
 
11148
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11149
          {
 
11150
            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;
 
11151
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11152
            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;
 
11153
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11154
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11155
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11156
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11157
          }// end loop over 't'
 
11158
        }// end loop over 's'
 
11159
      }// end loop over 'r'
 
11160
      for (unsigned int r = 0; r < 3; r++)
 
11161
      {
 
11162
        for (unsigned int s = 0; s < 3 - r; s++)
 
11163
        {
 
11164
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11165
          {
 
11166
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11167
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
11168
          }// end loop over 't'
 
11169
        }// end loop over 's'
 
11170
      }// end loop over 'r'
 
11171
      
 
11172
      // Table(s) of coefficients.
 
11173
      static const double coefficients0[10] = \
 
11174
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
11175
      
 
11176
      // Tables of derivatives of the polynomial base (transpose).
 
11177
      static const double dmats0[10][10] = \
 
11178
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11179
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11180
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11181
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11182
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11183
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11184
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11185
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11186
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11187
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11188
      
 
11189
      static const double dmats1[10][10] = \
 
11190
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11191
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11192
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11193
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11194
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11195
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11196
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11197
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11198
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11199
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11200
      
 
11201
      static const double dmats2[10][10] = \
 
11202
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11203
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11204
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11205
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11206
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11207
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11208
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11209
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11210
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11211
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11212
      
 
11213
      // Compute reference derivatives.
 
11214
      // Declare pointer to array of derivatives on FIAT element.
 
11215
      double *derivatives = new double[num_derivatives];
 
11216
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11217
      {
 
11218
        derivatives[r] = 0.000000000000000;
 
11219
      }// end loop over 'r'
 
11220
      
 
11221
      // Declare derivative matrix (of polynomial basis).
 
11222
      double dmats[10][10] = \
 
11223
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11224
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11225
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11226
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11227
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11228
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11229
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11230
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
11231
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
11232
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
11233
      
 
11234
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11235
      double dmats_old[10][10] = \
 
11236
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11237
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11238
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11239
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11240
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11241
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11242
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11243
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
11244
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
11245
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
11246
      
 
11247
      // Loop possible derivatives.
 
11248
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11249
      {
 
11250
        // Resetting dmats values to compute next derivative.
 
11251
        for (unsigned int t = 0; t < 10; t++)
 
11252
        {
 
11253
          for (unsigned int u = 0; u < 10; u++)
 
11254
          {
 
11255
            dmats[t][u] = 0.000000000000000;
 
11256
            if (t == u)
 
11257
            {
 
11258
            dmats[t][u] = 1.000000000000000;
 
11259
            }
 
11260
            
 
11261
          }// end loop over 'u'
 
11262
        }// end loop over 't'
 
11263
        
 
11264
        // Looping derivative order to generate dmats.
 
11265
        for (unsigned int s = 0; s < n; s++)
 
11266
        {
 
11267
          // Updating dmats_old with new values and resetting dmats.
 
11268
          for (unsigned int t = 0; t < 10; t++)
 
11269
          {
 
11270
            for (unsigned int u = 0; u < 10; u++)
 
11271
            {
 
11272
              dmats_old[t][u] = dmats[t][u];
 
11273
              dmats[t][u] = 0.000000000000000;
 
11274
            }// end loop over 'u'
 
11275
          }// end loop over 't'
 
11276
          
 
11277
          // Update dmats using an inner product.
 
11278
          if (combinations[r][s] == 0)
 
11279
          {
 
11280
          for (unsigned int t = 0; t < 10; t++)
 
11281
          {
 
11282
            for (unsigned int u = 0; u < 10; u++)
 
11283
            {
 
11284
              for (unsigned int tu = 0; tu < 10; tu++)
 
11285
              {
 
11286
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11287
              }// end loop over 'tu'
 
11288
            }// end loop over 'u'
 
11289
          }// end loop over 't'
 
11290
          }
 
11291
          
 
11292
          if (combinations[r][s] == 1)
 
11293
          {
 
11294
          for (unsigned int t = 0; t < 10; t++)
 
11295
          {
 
11296
            for (unsigned int u = 0; u < 10; u++)
 
11297
            {
 
11298
              for (unsigned int tu = 0; tu < 10; tu++)
 
11299
              {
 
11300
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11301
              }// end loop over 'tu'
 
11302
            }// end loop over 'u'
 
11303
          }// end loop over 't'
 
11304
          }
 
11305
          
 
11306
          if (combinations[r][s] == 2)
 
11307
          {
 
11308
          for (unsigned int t = 0; t < 10; t++)
 
11309
          {
 
11310
            for (unsigned int u = 0; u < 10; u++)
 
11311
            {
 
11312
              for (unsigned int tu = 0; tu < 10; tu++)
 
11313
              {
 
11314
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11315
              }// end loop over 'tu'
 
11316
            }// end loop over 'u'
 
11317
          }// end loop over 't'
 
11318
          }
 
11319
          
 
11320
        }// end loop over 's'
 
11321
        for (unsigned int s = 0; s < 10; s++)
 
11322
        {
 
11323
          for (unsigned int t = 0; t < 10; t++)
 
11324
          {
 
11325
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11326
          }// end loop over 't'
 
11327
        }// end loop over 's'
 
11328
      }// end loop over 'r'
 
11329
      
 
11330
      // Transform derivatives back to physical element
 
11331
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11332
      {
 
11333
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11334
        {
 
11335
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11336
        }// end loop over 's'
 
11337
      }// end loop over 'r'
 
11338
      
 
11339
      // Delete pointer to array of derivatives on FIAT element
 
11340
      delete [] derivatives;
 
11341
      
 
11342
      // Delete pointer to array of combinations of derivatives and transform
 
11343
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11344
      {
 
11345
        delete [] combinations[r];
 
11346
      }// end loop over 'r'
 
11347
      delete [] combinations;
 
11348
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11349
      {
 
11350
        delete [] transform[r];
 
11351
      }// end loop over 'r'
 
11352
      delete [] transform;
 
11353
        break;
 
11354
      }
 
11355
    case 15:
 
11356
      {
 
11357
        
 
11358
      // Array of basisvalues.
 
11359
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
11360
      
 
11361
      // Declare helper variables.
 
11362
      unsigned int rr = 0;
 
11363
      unsigned int ss = 0;
 
11364
      unsigned int tt = 0;
 
11365
      double tmp5 = 0.000000000000000;
 
11366
      double tmp6 = 0.000000000000000;
 
11367
      double tmp7 = 0.000000000000000;
 
11368
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
11369
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
11370
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
11371
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
11372
      double tmp4 = tmp3*tmp3;
 
11373
      
 
11374
      // Compute basisvalues.
 
11375
      basisvalues[0] = 1.000000000000000;
 
11376
      basisvalues[1] = tmp0;
 
11377
      for (unsigned int r = 1; r < 2; r++)
 
11378
      {
 
11379
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11380
        ss = r*(r + 1)*(r + 2)/6;
 
11381
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11382
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
11383
      }// end loop over 'r'
 
11384
      for (unsigned int r = 0; r < 2; r++)
 
11385
      {
 
11386
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11387
        ss = r*(r + 1)*(r + 2)/6;
 
11388
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
11389
      }// end loop over 'r'
 
11390
      for (unsigned int r = 0; r < 1; r++)
 
11391
      {
 
11392
        for (unsigned int s = 1; s < 2 - r; s++)
 
11393
        {
 
11394
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11395
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11396
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11397
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11398
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11399
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11400
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11401
        }// end loop over 's'
 
11402
      }// end loop over 'r'
 
11403
      for (unsigned int r = 0; r < 2; r++)
 
11404
      {
 
11405
        for (unsigned int s = 0; s < 2 - r; s++)
 
11406
        {
 
11407
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11408
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11409
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
11410
        }// end loop over 's'
 
11411
      }// end loop over 'r'
 
11412
      for (unsigned int r = 0; r < 1; r++)
 
11413
      {
 
11414
        for (unsigned int s = 0; s < 1 - r; s++)
 
11415
        {
 
11416
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11417
          {
 
11418
            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;
 
11419
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11420
            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;
 
11421
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11422
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11423
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11424
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11425
          }// end loop over 't'
 
11426
        }// end loop over 's'
 
11427
      }// end loop over 'r'
 
11428
      for (unsigned int r = 0; r < 3; r++)
 
11429
      {
 
11430
        for (unsigned int s = 0; s < 3 - r; s++)
 
11431
        {
 
11432
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11433
          {
 
11434
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11435
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
11436
          }// end loop over 't'
 
11437
        }// end loop over 's'
 
11438
      }// end loop over 'r'
 
11439
      
 
11440
      // Table(s) of coefficients.
 
11441
      static const double coefficients0[10] = \
 
11442
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
11443
      
 
11444
      // Tables of derivatives of the polynomial base (transpose).
 
11445
      static const double dmats0[10][10] = \
 
11446
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11447
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11448
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11449
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11450
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11451
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11452
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11453
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11454
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11455
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11456
      
 
11457
      static const double dmats1[10][10] = \
 
11458
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11459
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11460
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11461
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11462
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11463
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11464
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11465
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11466
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11467
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11468
      
 
11469
      static const double dmats2[10][10] = \
 
11470
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11471
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11472
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11473
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11474
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11475
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11476
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11477
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11478
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11479
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11480
      
 
11481
      // Compute reference derivatives.
 
11482
      // Declare pointer to array of derivatives on FIAT element.
 
11483
      double *derivatives = new double[num_derivatives];
 
11484
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11485
      {
 
11486
        derivatives[r] = 0.000000000000000;
 
11487
      }// end loop over 'r'
 
11488
      
 
11489
      // Declare derivative matrix (of polynomial basis).
 
11490
      double dmats[10][10] = \
 
11491
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11492
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11493
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11494
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11495
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11496
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11497
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11498
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
11499
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
11500
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
11501
      
 
11502
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11503
      double dmats_old[10][10] = \
 
11504
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11505
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11506
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11507
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11508
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11509
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11510
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11511
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
11512
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
11513
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
11514
      
 
11515
      // Loop possible derivatives.
 
11516
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11517
      {
 
11518
        // Resetting dmats values to compute next derivative.
 
11519
        for (unsigned int t = 0; t < 10; t++)
 
11520
        {
 
11521
          for (unsigned int u = 0; u < 10; u++)
 
11522
          {
 
11523
            dmats[t][u] = 0.000000000000000;
 
11524
            if (t == u)
 
11525
            {
 
11526
            dmats[t][u] = 1.000000000000000;
 
11527
            }
 
11528
            
 
11529
          }// end loop over 'u'
 
11530
        }// end loop over 't'
 
11531
        
 
11532
        // Looping derivative order to generate dmats.
 
11533
        for (unsigned int s = 0; s < n; s++)
 
11534
        {
 
11535
          // Updating dmats_old with new values and resetting dmats.
 
11536
          for (unsigned int t = 0; t < 10; t++)
 
11537
          {
 
11538
            for (unsigned int u = 0; u < 10; u++)
 
11539
            {
 
11540
              dmats_old[t][u] = dmats[t][u];
 
11541
              dmats[t][u] = 0.000000000000000;
 
11542
            }// end loop over 'u'
 
11543
          }// end loop over 't'
 
11544
          
 
11545
          // Update dmats using an inner product.
 
11546
          if (combinations[r][s] == 0)
 
11547
          {
 
11548
          for (unsigned int t = 0; t < 10; t++)
 
11549
          {
 
11550
            for (unsigned int u = 0; u < 10; u++)
 
11551
            {
 
11552
              for (unsigned int tu = 0; tu < 10; tu++)
 
11553
              {
 
11554
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11555
              }// end loop over 'tu'
 
11556
            }// end loop over 'u'
 
11557
          }// end loop over 't'
 
11558
          }
 
11559
          
 
11560
          if (combinations[r][s] == 1)
 
11561
          {
 
11562
          for (unsigned int t = 0; t < 10; t++)
 
11563
          {
 
11564
            for (unsigned int u = 0; u < 10; u++)
 
11565
            {
 
11566
              for (unsigned int tu = 0; tu < 10; tu++)
 
11567
              {
 
11568
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11569
              }// end loop over 'tu'
 
11570
            }// end loop over 'u'
 
11571
          }// end loop over 't'
 
11572
          }
 
11573
          
 
11574
          if (combinations[r][s] == 2)
 
11575
          {
 
11576
          for (unsigned int t = 0; t < 10; t++)
 
11577
          {
 
11578
            for (unsigned int u = 0; u < 10; u++)
 
11579
            {
 
11580
              for (unsigned int tu = 0; tu < 10; tu++)
 
11581
              {
 
11582
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11583
              }// end loop over 'tu'
 
11584
            }// end loop over 'u'
 
11585
          }// end loop over 't'
 
11586
          }
 
11587
          
 
11588
        }// end loop over 's'
 
11589
        for (unsigned int s = 0; s < 10; s++)
 
11590
        {
 
11591
          for (unsigned int t = 0; t < 10; t++)
 
11592
          {
 
11593
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11594
          }// end loop over 't'
 
11595
        }// end loop over 's'
 
11596
      }// end loop over 'r'
 
11597
      
 
11598
      // Transform derivatives back to physical element
 
11599
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11600
      {
 
11601
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11602
        {
 
11603
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11604
        }// end loop over 's'
 
11605
      }// end loop over 'r'
 
11606
      
 
11607
      // Delete pointer to array of derivatives on FIAT element
 
11608
      delete [] derivatives;
 
11609
      
 
11610
      // Delete pointer to array of combinations of derivatives and transform
 
11611
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11612
      {
 
11613
        delete [] combinations[r];
 
11614
      }// end loop over 'r'
 
11615
      delete [] combinations;
 
11616
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11617
      {
 
11618
        delete [] transform[r];
 
11619
      }// end loop over 'r'
 
11620
      delete [] transform;
 
11621
        break;
 
11622
      }
 
11623
    case 16:
 
11624
      {
 
11625
        
 
11626
      // Array of basisvalues.
 
11627
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
11628
      
 
11629
      // Declare helper variables.
 
11630
      unsigned int rr = 0;
 
11631
      unsigned int ss = 0;
 
11632
      unsigned int tt = 0;
 
11633
      double tmp5 = 0.000000000000000;
 
11634
      double tmp6 = 0.000000000000000;
 
11635
      double tmp7 = 0.000000000000000;
 
11636
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
11637
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
11638
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
11639
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
11640
      double tmp4 = tmp3*tmp3;
 
11641
      
 
11642
      // Compute basisvalues.
 
11643
      basisvalues[0] = 1.000000000000000;
 
11644
      basisvalues[1] = tmp0;
 
11645
      for (unsigned int r = 1; r < 2; r++)
 
11646
      {
 
11647
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11648
        ss = r*(r + 1)*(r + 2)/6;
 
11649
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11650
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
11651
      }// end loop over 'r'
 
11652
      for (unsigned int r = 0; r < 2; r++)
 
11653
      {
 
11654
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11655
        ss = r*(r + 1)*(r + 2)/6;
 
11656
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
11657
      }// end loop over 'r'
 
11658
      for (unsigned int r = 0; r < 1; r++)
 
11659
      {
 
11660
        for (unsigned int s = 1; s < 2 - r; s++)
 
11661
        {
 
11662
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11663
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11664
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11665
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11666
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11667
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11668
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11669
        }// end loop over 's'
 
11670
      }// end loop over 'r'
 
11671
      for (unsigned int r = 0; r < 2; r++)
 
11672
      {
 
11673
        for (unsigned int s = 0; s < 2 - r; s++)
 
11674
        {
 
11675
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11676
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11677
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
11678
        }// end loop over 's'
 
11679
      }// end loop over 'r'
 
11680
      for (unsigned int r = 0; r < 1; r++)
 
11681
      {
 
11682
        for (unsigned int s = 0; s < 1 - r; s++)
 
11683
        {
 
11684
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11685
          {
 
11686
            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;
 
11687
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11688
            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;
 
11689
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11690
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11691
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11692
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11693
          }// end loop over 't'
 
11694
        }// end loop over 's'
 
11695
      }// end loop over 'r'
 
11696
      for (unsigned int r = 0; r < 3; r++)
 
11697
      {
 
11698
        for (unsigned int s = 0; s < 3 - r; s++)
 
11699
        {
 
11700
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11701
          {
 
11702
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11703
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
11704
          }// end loop over 't'
 
11705
        }// end loop over 's'
 
11706
      }// end loop over 'r'
 
11707
      
 
11708
      // Table(s) of coefficients.
 
11709
      static const double coefficients0[10] = \
 
11710
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
11711
      
 
11712
      // Tables of derivatives of the polynomial base (transpose).
 
11713
      static const double dmats0[10][10] = \
 
11714
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11715
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11716
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11717
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11718
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11719
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11720
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11721
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11722
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11723
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11724
      
 
11725
      static const double dmats1[10][10] = \
 
11726
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11727
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11728
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11729
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11730
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11731
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11732
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11733
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11734
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11735
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11736
      
 
11737
      static const double dmats2[10][10] = \
 
11738
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11739
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11740
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11741
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11742
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11743
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11744
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11745
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11746
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11747
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11748
      
 
11749
      // Compute reference derivatives.
 
11750
      // Declare pointer to array of derivatives on FIAT element.
 
11751
      double *derivatives = new double[num_derivatives];
 
11752
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11753
      {
 
11754
        derivatives[r] = 0.000000000000000;
 
11755
      }// end loop over 'r'
 
11756
      
 
11757
      // Declare derivative matrix (of polynomial basis).
 
11758
      double dmats[10][10] = \
 
11759
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11760
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11761
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11762
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11763
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11764
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11765
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11766
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
11767
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
11768
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
11769
      
 
11770
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
11771
      double dmats_old[10][10] = \
 
11772
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11773
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11774
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11775
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11776
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11777
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11778
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11779
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
11780
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
11781
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
11782
      
 
11783
      // Loop possible derivatives.
 
11784
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11785
      {
 
11786
        // Resetting dmats values to compute next derivative.
 
11787
        for (unsigned int t = 0; t < 10; t++)
 
11788
        {
 
11789
          for (unsigned int u = 0; u < 10; u++)
 
11790
          {
 
11791
            dmats[t][u] = 0.000000000000000;
 
11792
            if (t == u)
 
11793
            {
 
11794
            dmats[t][u] = 1.000000000000000;
 
11795
            }
 
11796
            
 
11797
          }// end loop over 'u'
 
11798
        }// end loop over 't'
 
11799
        
 
11800
        // Looping derivative order to generate dmats.
 
11801
        for (unsigned int s = 0; s < n; s++)
 
11802
        {
 
11803
          // Updating dmats_old with new values and resetting dmats.
 
11804
          for (unsigned int t = 0; t < 10; t++)
 
11805
          {
 
11806
            for (unsigned int u = 0; u < 10; u++)
 
11807
            {
 
11808
              dmats_old[t][u] = dmats[t][u];
 
11809
              dmats[t][u] = 0.000000000000000;
 
11810
            }// end loop over 'u'
 
11811
          }// end loop over 't'
 
11812
          
 
11813
          // Update dmats using an inner product.
 
11814
          if (combinations[r][s] == 0)
 
11815
          {
 
11816
          for (unsigned int t = 0; t < 10; t++)
 
11817
          {
 
11818
            for (unsigned int u = 0; u < 10; u++)
 
11819
            {
 
11820
              for (unsigned int tu = 0; tu < 10; tu++)
 
11821
              {
 
11822
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
11823
              }// end loop over 'tu'
 
11824
            }// end loop over 'u'
 
11825
          }// end loop over 't'
 
11826
          }
 
11827
          
 
11828
          if (combinations[r][s] == 1)
 
11829
          {
 
11830
          for (unsigned int t = 0; t < 10; t++)
 
11831
          {
 
11832
            for (unsigned int u = 0; u < 10; u++)
 
11833
            {
 
11834
              for (unsigned int tu = 0; tu < 10; tu++)
 
11835
              {
 
11836
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
11837
              }// end loop over 'tu'
 
11838
            }// end loop over 'u'
 
11839
          }// end loop over 't'
 
11840
          }
 
11841
          
 
11842
          if (combinations[r][s] == 2)
 
11843
          {
 
11844
          for (unsigned int t = 0; t < 10; t++)
 
11845
          {
 
11846
            for (unsigned int u = 0; u < 10; u++)
 
11847
            {
 
11848
              for (unsigned int tu = 0; tu < 10; tu++)
 
11849
              {
 
11850
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
11851
              }// end loop over 'tu'
 
11852
            }// end loop over 'u'
 
11853
          }// end loop over 't'
 
11854
          }
 
11855
          
 
11856
        }// end loop over 's'
 
11857
        for (unsigned int s = 0; s < 10; s++)
 
11858
        {
 
11859
          for (unsigned int t = 0; t < 10; t++)
 
11860
          {
 
11861
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
11862
          }// end loop over 't'
 
11863
        }// end loop over 's'
 
11864
      }// end loop over 'r'
 
11865
      
 
11866
      // Transform derivatives back to physical element
 
11867
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11868
      {
 
11869
        for (unsigned int s = 0; s < num_derivatives; s++)
 
11870
        {
 
11871
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
11872
        }// end loop over 's'
 
11873
      }// end loop over 'r'
 
11874
      
 
11875
      // Delete pointer to array of derivatives on FIAT element
 
11876
      delete [] derivatives;
 
11877
      
 
11878
      // Delete pointer to array of combinations of derivatives and transform
 
11879
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11880
      {
 
11881
        delete [] combinations[r];
 
11882
      }// end loop over 'r'
 
11883
      delete [] combinations;
 
11884
      for (unsigned int r = 0; r < num_derivatives; r++)
 
11885
      {
 
11886
        delete [] transform[r];
 
11887
      }// end loop over 'r'
 
11888
      delete [] transform;
 
11889
        break;
 
11890
      }
 
11891
    case 17:
 
11892
      {
 
11893
        
 
11894
      // Array of basisvalues.
 
11895
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
11896
      
 
11897
      // Declare helper variables.
 
11898
      unsigned int rr = 0;
 
11899
      unsigned int ss = 0;
 
11900
      unsigned int tt = 0;
 
11901
      double tmp5 = 0.000000000000000;
 
11902
      double tmp6 = 0.000000000000000;
 
11903
      double tmp7 = 0.000000000000000;
 
11904
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
11905
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
11906
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
11907
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
11908
      double tmp4 = tmp3*tmp3;
 
11909
      
 
11910
      // Compute basisvalues.
 
11911
      basisvalues[0] = 1.000000000000000;
 
11912
      basisvalues[1] = tmp0;
 
11913
      for (unsigned int r = 1; r < 2; r++)
 
11914
      {
 
11915
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
11916
        ss = r*(r + 1)*(r + 2)/6;
 
11917
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
11918
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
11919
      }// end loop over 'r'
 
11920
      for (unsigned int r = 0; r < 2; r++)
 
11921
      {
 
11922
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
11923
        ss = r*(r + 1)*(r + 2)/6;
 
11924
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
11925
      }// end loop over 'r'
 
11926
      for (unsigned int r = 0; r < 1; r++)
 
11927
      {
 
11928
        for (unsigned int s = 1; s < 2 - r; s++)
 
11929
        {
 
11930
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
11931
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11932
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
11933
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11934
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11935
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
11936
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
11937
        }// end loop over 's'
 
11938
      }// end loop over 'r'
 
11939
      for (unsigned int r = 0; r < 2; r++)
 
11940
      {
 
11941
        for (unsigned int s = 0; s < 2 - r; s++)
 
11942
        {
 
11943
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
11944
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
11945
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
11946
        }// end loop over 's'
 
11947
      }// end loop over 'r'
 
11948
      for (unsigned int r = 0; r < 1; r++)
 
11949
      {
 
11950
        for (unsigned int s = 0; s < 1 - r; s++)
 
11951
        {
 
11952
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
11953
          {
 
11954
            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;
 
11955
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11956
            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;
 
11957
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11958
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11959
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
11960
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
11961
          }// end loop over 't'
 
11962
        }// end loop over 's'
 
11963
      }// end loop over 'r'
 
11964
      for (unsigned int r = 0; r < 3; r++)
 
11965
      {
 
11966
        for (unsigned int s = 0; s < 3 - r; s++)
 
11967
        {
 
11968
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
11969
          {
 
11970
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
11971
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
11972
          }// end loop over 't'
 
11973
        }// end loop over 's'
 
11974
      }// end loop over 'r'
 
11975
      
 
11976
      // Table(s) of coefficients.
 
11977
      static const double coefficients0[10] = \
 
11978
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
11979
      
 
11980
      // Tables of derivatives of the polynomial base (transpose).
 
11981
      static const double dmats0[10][10] = \
 
11982
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11983
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11984
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11985
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11986
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11987
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11988
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11989
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11990
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11991
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
11992
      
 
11993
      static const double dmats1[10][10] = \
 
11994
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11995
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11996
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11997
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11998
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
11999
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12000
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12001
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12002
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12003
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12004
      
 
12005
      static const double dmats2[10][10] = \
 
12006
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12007
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12008
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12009
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12010
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12011
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12012
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12013
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12014
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12015
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12016
      
 
12017
      // Compute reference derivatives.
 
12018
      // Declare pointer to array of derivatives on FIAT element.
 
12019
      double *derivatives = new double[num_derivatives];
 
12020
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12021
      {
 
12022
        derivatives[r] = 0.000000000000000;
 
12023
      }// end loop over 'r'
 
12024
      
 
12025
      // Declare derivative matrix (of polynomial basis).
 
12026
      double dmats[10][10] = \
 
12027
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12028
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12029
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12030
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12031
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12032
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12033
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12034
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12035
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12036
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12037
      
 
12038
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12039
      double dmats_old[10][10] = \
 
12040
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12041
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12042
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12043
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12044
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12045
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12046
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12047
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12048
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12049
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12050
      
 
12051
      // Loop possible derivatives.
 
12052
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12053
      {
 
12054
        // Resetting dmats values to compute next derivative.
 
12055
        for (unsigned int t = 0; t < 10; t++)
 
12056
        {
 
12057
          for (unsigned int u = 0; u < 10; u++)
 
12058
          {
 
12059
            dmats[t][u] = 0.000000000000000;
 
12060
            if (t == u)
 
12061
            {
 
12062
            dmats[t][u] = 1.000000000000000;
 
12063
            }
 
12064
            
 
12065
          }// end loop over 'u'
 
12066
        }// end loop over 't'
 
12067
        
 
12068
        // Looping derivative order to generate dmats.
 
12069
        for (unsigned int s = 0; s < n; s++)
 
12070
        {
 
12071
          // Updating dmats_old with new values and resetting dmats.
 
12072
          for (unsigned int t = 0; t < 10; t++)
 
12073
          {
 
12074
            for (unsigned int u = 0; u < 10; u++)
 
12075
            {
 
12076
              dmats_old[t][u] = dmats[t][u];
 
12077
              dmats[t][u] = 0.000000000000000;
 
12078
            }// end loop over 'u'
 
12079
          }// end loop over 't'
 
12080
          
 
12081
          // Update dmats using an inner product.
 
12082
          if (combinations[r][s] == 0)
 
12083
          {
 
12084
          for (unsigned int t = 0; t < 10; t++)
 
12085
          {
 
12086
            for (unsigned int u = 0; u < 10; u++)
 
12087
            {
 
12088
              for (unsigned int tu = 0; tu < 10; tu++)
 
12089
              {
 
12090
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12091
              }// end loop over 'tu'
 
12092
            }// end loop over 'u'
 
12093
          }// end loop over 't'
 
12094
          }
 
12095
          
 
12096
          if (combinations[r][s] == 1)
 
12097
          {
 
12098
          for (unsigned int t = 0; t < 10; t++)
 
12099
          {
 
12100
            for (unsigned int u = 0; u < 10; u++)
 
12101
            {
 
12102
              for (unsigned int tu = 0; tu < 10; tu++)
 
12103
              {
 
12104
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12105
              }// end loop over 'tu'
 
12106
            }// end loop over 'u'
 
12107
          }// end loop over 't'
 
12108
          }
 
12109
          
 
12110
          if (combinations[r][s] == 2)
 
12111
          {
 
12112
          for (unsigned int t = 0; t < 10; t++)
 
12113
          {
 
12114
            for (unsigned int u = 0; u < 10; u++)
 
12115
            {
 
12116
              for (unsigned int tu = 0; tu < 10; tu++)
 
12117
              {
 
12118
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12119
              }// end loop over 'tu'
 
12120
            }// end loop over 'u'
 
12121
          }// end loop over 't'
 
12122
          }
 
12123
          
 
12124
        }// end loop over 's'
 
12125
        for (unsigned int s = 0; s < 10; s++)
 
12126
        {
 
12127
          for (unsigned int t = 0; t < 10; t++)
 
12128
          {
 
12129
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12130
          }// end loop over 't'
 
12131
        }// end loop over 's'
 
12132
      }// end loop over 'r'
 
12133
      
 
12134
      // Transform derivatives back to physical element
 
12135
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12136
      {
 
12137
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12138
        {
 
12139
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
12140
        }// end loop over 's'
 
12141
      }// end loop over 'r'
 
12142
      
 
12143
      // Delete pointer to array of derivatives on FIAT element
 
12144
      delete [] derivatives;
 
12145
      
 
12146
      // Delete pointer to array of combinations of derivatives and transform
 
12147
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12148
      {
 
12149
        delete [] combinations[r];
 
12150
      }// end loop over 'r'
 
12151
      delete [] combinations;
 
12152
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12153
      {
 
12154
        delete [] transform[r];
 
12155
      }// end loop over 'r'
 
12156
      delete [] transform;
 
12157
        break;
 
12158
      }
 
12159
    case 18:
 
12160
      {
 
12161
        
 
12162
      // Array of basisvalues.
 
12163
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
12164
      
 
12165
      // Declare helper variables.
 
12166
      unsigned int rr = 0;
 
12167
      unsigned int ss = 0;
 
12168
      unsigned int tt = 0;
 
12169
      double tmp5 = 0.000000000000000;
 
12170
      double tmp6 = 0.000000000000000;
 
12171
      double tmp7 = 0.000000000000000;
 
12172
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
12173
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
12174
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
12175
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
12176
      double tmp4 = tmp3*tmp3;
 
12177
      
 
12178
      // Compute basisvalues.
 
12179
      basisvalues[0] = 1.000000000000000;
 
12180
      basisvalues[1] = tmp0;
 
12181
      for (unsigned int r = 1; r < 2; r++)
 
12182
      {
 
12183
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12184
        ss = r*(r + 1)*(r + 2)/6;
 
12185
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12186
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
12187
      }// end loop over 'r'
 
12188
      for (unsigned int r = 0; r < 2; r++)
 
12189
      {
 
12190
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12191
        ss = r*(r + 1)*(r + 2)/6;
 
12192
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
12193
      }// end loop over 'r'
 
12194
      for (unsigned int r = 0; r < 1; r++)
 
12195
      {
 
12196
        for (unsigned int s = 1; s < 2 - r; s++)
 
12197
        {
 
12198
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12199
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12200
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12201
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12202
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12203
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12204
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12205
        }// end loop over 's'
 
12206
      }// end loop over 'r'
 
12207
      for (unsigned int r = 0; r < 2; r++)
 
12208
      {
 
12209
        for (unsigned int s = 0; s < 2 - r; s++)
 
12210
        {
 
12211
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12212
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12213
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
12214
        }// end loop over 's'
 
12215
      }// end loop over 'r'
 
12216
      for (unsigned int r = 0; r < 1; r++)
 
12217
      {
 
12218
        for (unsigned int s = 0; s < 1 - r; s++)
 
12219
        {
 
12220
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12221
          {
 
12222
            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;
 
12223
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12224
            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;
 
12225
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12226
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12227
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12228
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12229
          }// end loop over 't'
 
12230
        }// end loop over 's'
 
12231
      }// end loop over 'r'
 
12232
      for (unsigned int r = 0; r < 3; r++)
 
12233
      {
 
12234
        for (unsigned int s = 0; s < 3 - r; s++)
 
12235
        {
 
12236
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12237
          {
 
12238
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12239
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
12240
          }// end loop over 't'
 
12241
        }// end loop over 's'
 
12242
      }// end loop over 'r'
 
12243
      
 
12244
      // Table(s) of coefficients.
 
12245
      static const double coefficients0[10] = \
 
12246
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
12247
      
 
12248
      // Tables of derivatives of the polynomial base (transpose).
 
12249
      static const double dmats0[10][10] = \
 
12250
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12251
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12252
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12253
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12254
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12255
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12256
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12257
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12258
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12259
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12260
      
 
12261
      static const double dmats1[10][10] = \
 
12262
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12263
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12264
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12265
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12266
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12267
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12268
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12269
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12270
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12271
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12272
      
 
12273
      static const double dmats2[10][10] = \
 
12274
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12275
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12276
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12277
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12278
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12279
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12280
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12281
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12282
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12283
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12284
      
 
12285
      // Compute reference derivatives.
 
12286
      // Declare pointer to array of derivatives on FIAT element.
 
12287
      double *derivatives = new double[num_derivatives];
 
12288
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12289
      {
 
12290
        derivatives[r] = 0.000000000000000;
 
12291
      }// end loop over 'r'
 
12292
      
 
12293
      // Declare derivative matrix (of polynomial basis).
 
12294
      double dmats[10][10] = \
 
12295
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12296
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12297
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12298
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12299
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12300
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12301
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12302
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12303
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12304
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12305
      
 
12306
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12307
      double dmats_old[10][10] = \
 
12308
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12309
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12310
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12311
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12312
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12313
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12314
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12315
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12316
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12317
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12318
      
 
12319
      // Loop possible derivatives.
 
12320
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12321
      {
 
12322
        // Resetting dmats values to compute next derivative.
 
12323
        for (unsigned int t = 0; t < 10; t++)
 
12324
        {
 
12325
          for (unsigned int u = 0; u < 10; u++)
 
12326
          {
 
12327
            dmats[t][u] = 0.000000000000000;
 
12328
            if (t == u)
 
12329
            {
 
12330
            dmats[t][u] = 1.000000000000000;
 
12331
            }
 
12332
            
 
12333
          }// end loop over 'u'
 
12334
        }// end loop over 't'
 
12335
        
 
12336
        // Looping derivative order to generate dmats.
 
12337
        for (unsigned int s = 0; s < n; s++)
 
12338
        {
 
12339
          // Updating dmats_old with new values and resetting dmats.
 
12340
          for (unsigned int t = 0; t < 10; t++)
 
12341
          {
 
12342
            for (unsigned int u = 0; u < 10; u++)
 
12343
            {
 
12344
              dmats_old[t][u] = dmats[t][u];
 
12345
              dmats[t][u] = 0.000000000000000;
 
12346
            }// end loop over 'u'
 
12347
          }// end loop over 't'
 
12348
          
 
12349
          // Update dmats using an inner product.
 
12350
          if (combinations[r][s] == 0)
 
12351
          {
 
12352
          for (unsigned int t = 0; t < 10; t++)
 
12353
          {
 
12354
            for (unsigned int u = 0; u < 10; u++)
 
12355
            {
 
12356
              for (unsigned int tu = 0; tu < 10; tu++)
 
12357
              {
 
12358
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12359
              }// end loop over 'tu'
 
12360
            }// end loop over 'u'
 
12361
          }// end loop over 't'
 
12362
          }
 
12363
          
 
12364
          if (combinations[r][s] == 1)
 
12365
          {
 
12366
          for (unsigned int t = 0; t < 10; t++)
 
12367
          {
 
12368
            for (unsigned int u = 0; u < 10; u++)
 
12369
            {
 
12370
              for (unsigned int tu = 0; tu < 10; tu++)
 
12371
              {
 
12372
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12373
              }// end loop over 'tu'
 
12374
            }// end loop over 'u'
 
12375
          }// end loop over 't'
 
12376
          }
 
12377
          
 
12378
          if (combinations[r][s] == 2)
 
12379
          {
 
12380
          for (unsigned int t = 0; t < 10; t++)
 
12381
          {
 
12382
            for (unsigned int u = 0; u < 10; u++)
 
12383
            {
 
12384
              for (unsigned int tu = 0; tu < 10; tu++)
 
12385
              {
 
12386
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12387
              }// end loop over 'tu'
 
12388
            }// end loop over 'u'
 
12389
          }// end loop over 't'
 
12390
          }
 
12391
          
 
12392
        }// end loop over 's'
 
12393
        for (unsigned int s = 0; s < 10; s++)
 
12394
        {
 
12395
          for (unsigned int t = 0; t < 10; t++)
 
12396
          {
 
12397
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12398
          }// end loop over 't'
 
12399
        }// end loop over 's'
 
12400
      }// end loop over 'r'
 
12401
      
 
12402
      // Transform derivatives back to physical element
 
12403
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12404
      {
 
12405
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12406
        {
 
12407
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
12408
        }// end loop over 's'
 
12409
      }// end loop over 'r'
 
12410
      
 
12411
      // Delete pointer to array of derivatives on FIAT element
 
12412
      delete [] derivatives;
 
12413
      
 
12414
      // Delete pointer to array of combinations of derivatives and transform
 
12415
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12416
      {
 
12417
        delete [] combinations[r];
 
12418
      }// end loop over 'r'
 
12419
      delete [] combinations;
 
12420
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12421
      {
 
12422
        delete [] transform[r];
 
12423
      }// end loop over 'r'
 
12424
      delete [] transform;
 
12425
        break;
 
12426
      }
 
12427
    case 19:
 
12428
      {
 
12429
        
 
12430
      // Array of basisvalues.
 
12431
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
12432
      
 
12433
      // Declare helper variables.
 
12434
      unsigned int rr = 0;
 
12435
      unsigned int ss = 0;
 
12436
      unsigned int tt = 0;
 
12437
      double tmp5 = 0.000000000000000;
 
12438
      double tmp6 = 0.000000000000000;
 
12439
      double tmp7 = 0.000000000000000;
 
12440
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
12441
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
12442
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
12443
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
12444
      double tmp4 = tmp3*tmp3;
 
12445
      
 
12446
      // Compute basisvalues.
 
12447
      basisvalues[0] = 1.000000000000000;
 
12448
      basisvalues[1] = tmp0;
 
12449
      for (unsigned int r = 1; r < 2; r++)
 
12450
      {
 
12451
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12452
        ss = r*(r + 1)*(r + 2)/6;
 
12453
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12454
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
12455
      }// end loop over 'r'
 
12456
      for (unsigned int r = 0; r < 2; r++)
 
12457
      {
 
12458
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12459
        ss = r*(r + 1)*(r + 2)/6;
 
12460
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
12461
      }// end loop over 'r'
 
12462
      for (unsigned int r = 0; r < 1; r++)
 
12463
      {
 
12464
        for (unsigned int s = 1; s < 2 - r; s++)
 
12465
        {
 
12466
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12467
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12468
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12469
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12470
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12471
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12472
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12473
        }// end loop over 's'
 
12474
      }// end loop over 'r'
 
12475
      for (unsigned int r = 0; r < 2; r++)
 
12476
      {
 
12477
        for (unsigned int s = 0; s < 2 - r; s++)
 
12478
        {
 
12479
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12480
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12481
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
12482
        }// end loop over 's'
 
12483
      }// end loop over 'r'
 
12484
      for (unsigned int r = 0; r < 1; r++)
 
12485
      {
 
12486
        for (unsigned int s = 0; s < 1 - r; s++)
 
12487
        {
 
12488
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12489
          {
 
12490
            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;
 
12491
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12492
            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;
 
12493
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12494
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12495
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12496
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12497
          }// end loop over 't'
 
12498
        }// end loop over 's'
 
12499
      }// end loop over 'r'
 
12500
      for (unsigned int r = 0; r < 3; r++)
 
12501
      {
 
12502
        for (unsigned int s = 0; s < 3 - r; s++)
 
12503
        {
 
12504
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12505
          {
 
12506
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12507
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
12508
          }// end loop over 't'
 
12509
        }// end loop over 's'
 
12510
      }// end loop over 'r'
 
12511
      
 
12512
      // Table(s) of coefficients.
 
12513
      static const double coefficients0[10] = \
 
12514
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
12515
      
 
12516
      // Tables of derivatives of the polynomial base (transpose).
 
12517
      static const double dmats0[10][10] = \
 
12518
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12519
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12520
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12521
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12522
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12523
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12524
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12525
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12526
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12527
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12528
      
 
12529
      static const double dmats1[10][10] = \
 
12530
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12531
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12532
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12533
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12534
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12535
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12536
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12537
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12538
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12539
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12540
      
 
12541
      static const double dmats2[10][10] = \
 
12542
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12543
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12544
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12545
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12546
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12547
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12548
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12549
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12550
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12551
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12552
      
 
12553
      // Compute reference derivatives.
 
12554
      // Declare pointer to array of derivatives on FIAT element.
 
12555
      double *derivatives = new double[num_derivatives];
 
12556
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12557
      {
 
12558
        derivatives[r] = 0.000000000000000;
 
12559
      }// end loop over 'r'
 
12560
      
 
12561
      // Declare derivative matrix (of polynomial basis).
 
12562
      double dmats[10][10] = \
 
12563
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12564
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12565
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12566
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12567
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12568
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12569
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12570
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12571
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12572
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12573
      
 
12574
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12575
      double dmats_old[10][10] = \
 
12576
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12577
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12578
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12579
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12580
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12581
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12582
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12583
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12584
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12585
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12586
      
 
12587
      // Loop possible derivatives.
 
12588
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12589
      {
 
12590
        // Resetting dmats values to compute next derivative.
 
12591
        for (unsigned int t = 0; t < 10; t++)
 
12592
        {
 
12593
          for (unsigned int u = 0; u < 10; u++)
 
12594
          {
 
12595
            dmats[t][u] = 0.000000000000000;
 
12596
            if (t == u)
 
12597
            {
 
12598
            dmats[t][u] = 1.000000000000000;
 
12599
            }
 
12600
            
 
12601
          }// end loop over 'u'
 
12602
        }// end loop over 't'
 
12603
        
 
12604
        // Looping derivative order to generate dmats.
 
12605
        for (unsigned int s = 0; s < n; s++)
 
12606
        {
 
12607
          // Updating dmats_old with new values and resetting dmats.
 
12608
          for (unsigned int t = 0; t < 10; t++)
 
12609
          {
 
12610
            for (unsigned int u = 0; u < 10; u++)
 
12611
            {
 
12612
              dmats_old[t][u] = dmats[t][u];
 
12613
              dmats[t][u] = 0.000000000000000;
 
12614
            }// end loop over 'u'
 
12615
          }// end loop over 't'
 
12616
          
 
12617
          // Update dmats using an inner product.
 
12618
          if (combinations[r][s] == 0)
 
12619
          {
 
12620
          for (unsigned int t = 0; t < 10; t++)
 
12621
          {
 
12622
            for (unsigned int u = 0; u < 10; u++)
 
12623
            {
 
12624
              for (unsigned int tu = 0; tu < 10; tu++)
 
12625
              {
 
12626
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12627
              }// end loop over 'tu'
 
12628
            }// end loop over 'u'
 
12629
          }// end loop over 't'
 
12630
          }
 
12631
          
 
12632
          if (combinations[r][s] == 1)
 
12633
          {
 
12634
          for (unsigned int t = 0; t < 10; t++)
 
12635
          {
 
12636
            for (unsigned int u = 0; u < 10; u++)
 
12637
            {
 
12638
              for (unsigned int tu = 0; tu < 10; tu++)
 
12639
              {
 
12640
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12641
              }// end loop over 'tu'
 
12642
            }// end loop over 'u'
 
12643
          }// end loop over 't'
 
12644
          }
 
12645
          
 
12646
          if (combinations[r][s] == 2)
 
12647
          {
 
12648
          for (unsigned int t = 0; t < 10; t++)
 
12649
          {
 
12650
            for (unsigned int u = 0; u < 10; u++)
 
12651
            {
 
12652
              for (unsigned int tu = 0; tu < 10; tu++)
 
12653
              {
 
12654
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12655
              }// end loop over 'tu'
 
12656
            }// end loop over 'u'
 
12657
          }// end loop over 't'
 
12658
          }
 
12659
          
 
12660
        }// end loop over 's'
 
12661
        for (unsigned int s = 0; s < 10; s++)
 
12662
        {
 
12663
          for (unsigned int t = 0; t < 10; t++)
 
12664
          {
 
12665
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12666
          }// end loop over 't'
 
12667
        }// end loop over 's'
 
12668
      }// end loop over 'r'
 
12669
      
 
12670
      // Transform derivatives back to physical element
 
12671
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12672
      {
 
12673
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12674
        {
 
12675
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
12676
        }// end loop over 's'
 
12677
      }// end loop over 'r'
 
12678
      
 
12679
      // Delete pointer to array of derivatives on FIAT element
 
12680
      delete [] derivatives;
 
12681
      
 
12682
      // Delete pointer to array of combinations of derivatives and transform
 
12683
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12684
      {
 
12685
        delete [] combinations[r];
 
12686
      }// end loop over 'r'
 
12687
      delete [] combinations;
 
12688
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12689
      {
 
12690
        delete [] transform[r];
 
12691
      }// end loop over 'r'
 
12692
      delete [] transform;
 
12693
        break;
 
12694
      }
 
12695
    case 20:
 
12696
      {
 
12697
        
 
12698
      // Array of basisvalues.
 
12699
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
12700
      
 
12701
      // Declare helper variables.
 
12702
      unsigned int rr = 0;
 
12703
      unsigned int ss = 0;
 
12704
      unsigned int tt = 0;
 
12705
      double tmp5 = 0.000000000000000;
 
12706
      double tmp6 = 0.000000000000000;
 
12707
      double tmp7 = 0.000000000000000;
 
12708
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
12709
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
12710
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
12711
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
12712
      double tmp4 = tmp3*tmp3;
 
12713
      
 
12714
      // Compute basisvalues.
 
12715
      basisvalues[0] = 1.000000000000000;
 
12716
      basisvalues[1] = tmp0;
 
12717
      for (unsigned int r = 1; r < 2; r++)
 
12718
      {
 
12719
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12720
        ss = r*(r + 1)*(r + 2)/6;
 
12721
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12722
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
12723
      }// end loop over 'r'
 
12724
      for (unsigned int r = 0; r < 2; r++)
 
12725
      {
 
12726
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12727
        ss = r*(r + 1)*(r + 2)/6;
 
12728
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
12729
      }// end loop over 'r'
 
12730
      for (unsigned int r = 0; r < 1; r++)
 
12731
      {
 
12732
        for (unsigned int s = 1; s < 2 - r; s++)
 
12733
        {
 
12734
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
12735
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12736
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
12737
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12738
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12739
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
12740
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
12741
        }// end loop over 's'
 
12742
      }// end loop over 'r'
 
12743
      for (unsigned int r = 0; r < 2; r++)
 
12744
      {
 
12745
        for (unsigned int s = 0; s < 2 - r; s++)
 
12746
        {
 
12747
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
12748
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
12749
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
12750
        }// end loop over 's'
 
12751
      }// end loop over 'r'
 
12752
      for (unsigned int r = 0; r < 1; r++)
 
12753
      {
 
12754
        for (unsigned int s = 0; s < 1 - r; s++)
 
12755
        {
 
12756
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
12757
          {
 
12758
            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;
 
12759
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12760
            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;
 
12761
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12762
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12763
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
12764
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
12765
          }// end loop over 't'
 
12766
        }// end loop over 's'
 
12767
      }// end loop over 'r'
 
12768
      for (unsigned int r = 0; r < 3; r++)
 
12769
      {
 
12770
        for (unsigned int s = 0; s < 3 - r; s++)
 
12771
        {
 
12772
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
12773
          {
 
12774
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
12775
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
12776
          }// end loop over 't'
 
12777
        }// end loop over 's'
 
12778
      }// end loop over 'r'
 
12779
      
 
12780
      // Table(s) of coefficients.
 
12781
      static const double coefficients0[10] = \
 
12782
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
12783
      
 
12784
      // Tables of derivatives of the polynomial base (transpose).
 
12785
      static const double dmats0[10][10] = \
 
12786
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12787
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12788
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12789
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12790
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12791
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12792
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12793
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12794
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12795
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12796
      
 
12797
      static const double dmats1[10][10] = \
 
12798
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12799
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12800
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12801
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12802
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12803
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12804
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12805
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12806
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12807
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12808
      
 
12809
      static const double dmats2[10][10] = \
 
12810
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12811
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12812
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12813
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12814
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12815
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12816
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12817
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12818
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12819
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
12820
      
 
12821
      // Compute reference derivatives.
 
12822
      // Declare pointer to array of derivatives on FIAT element.
 
12823
      double *derivatives = new double[num_derivatives];
 
12824
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12825
      {
 
12826
        derivatives[r] = 0.000000000000000;
 
12827
      }// end loop over 'r'
 
12828
      
 
12829
      // Declare derivative matrix (of polynomial basis).
 
12830
      double dmats[10][10] = \
 
12831
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12832
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12833
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12834
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12835
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12836
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12837
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12838
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12839
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12840
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12841
      
 
12842
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
12843
      double dmats_old[10][10] = \
 
12844
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12845
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12846
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12847
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12848
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12849
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12850
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
12851
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
12852
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
12853
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
12854
      
 
12855
      // Loop possible derivatives.
 
12856
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12857
      {
 
12858
        // Resetting dmats values to compute next derivative.
 
12859
        for (unsigned int t = 0; t < 10; t++)
 
12860
        {
 
12861
          for (unsigned int u = 0; u < 10; u++)
 
12862
          {
 
12863
            dmats[t][u] = 0.000000000000000;
 
12864
            if (t == u)
 
12865
            {
 
12866
            dmats[t][u] = 1.000000000000000;
 
12867
            }
 
12868
            
 
12869
          }// end loop over 'u'
 
12870
        }// end loop over 't'
 
12871
        
 
12872
        // Looping derivative order to generate dmats.
 
12873
        for (unsigned int s = 0; s < n; s++)
 
12874
        {
 
12875
          // Updating dmats_old with new values and resetting dmats.
 
12876
          for (unsigned int t = 0; t < 10; t++)
 
12877
          {
 
12878
            for (unsigned int u = 0; u < 10; u++)
 
12879
            {
 
12880
              dmats_old[t][u] = dmats[t][u];
 
12881
              dmats[t][u] = 0.000000000000000;
 
12882
            }// end loop over 'u'
 
12883
          }// end loop over 't'
 
12884
          
 
12885
          // Update dmats using an inner product.
 
12886
          if (combinations[r][s] == 0)
 
12887
          {
 
12888
          for (unsigned int t = 0; t < 10; t++)
 
12889
          {
 
12890
            for (unsigned int u = 0; u < 10; u++)
 
12891
            {
 
12892
              for (unsigned int tu = 0; tu < 10; tu++)
 
12893
              {
 
12894
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
12895
              }// end loop over 'tu'
 
12896
            }// end loop over 'u'
 
12897
          }// end loop over 't'
 
12898
          }
 
12899
          
 
12900
          if (combinations[r][s] == 1)
 
12901
          {
 
12902
          for (unsigned int t = 0; t < 10; t++)
 
12903
          {
 
12904
            for (unsigned int u = 0; u < 10; u++)
 
12905
            {
 
12906
              for (unsigned int tu = 0; tu < 10; tu++)
 
12907
              {
 
12908
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
12909
              }// end loop over 'tu'
 
12910
            }// end loop over 'u'
 
12911
          }// end loop over 't'
 
12912
          }
 
12913
          
 
12914
          if (combinations[r][s] == 2)
 
12915
          {
 
12916
          for (unsigned int t = 0; t < 10; t++)
 
12917
          {
 
12918
            for (unsigned int u = 0; u < 10; u++)
 
12919
            {
 
12920
              for (unsigned int tu = 0; tu < 10; tu++)
 
12921
              {
 
12922
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
12923
              }// end loop over 'tu'
 
12924
            }// end loop over 'u'
 
12925
          }// end loop over 't'
 
12926
          }
 
12927
          
 
12928
        }// end loop over 's'
 
12929
        for (unsigned int s = 0; s < 10; s++)
 
12930
        {
 
12931
          for (unsigned int t = 0; t < 10; t++)
 
12932
          {
 
12933
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
12934
          }// end loop over 't'
 
12935
        }// end loop over 's'
 
12936
      }// end loop over 'r'
 
12937
      
 
12938
      // Transform derivatives back to physical element
 
12939
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12940
      {
 
12941
        for (unsigned int s = 0; s < num_derivatives; s++)
 
12942
        {
 
12943
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
12944
        }// end loop over 's'
 
12945
      }// end loop over 'r'
 
12946
      
 
12947
      // Delete pointer to array of derivatives on FIAT element
 
12948
      delete [] derivatives;
 
12949
      
 
12950
      // Delete pointer to array of combinations of derivatives and transform
 
12951
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12952
      {
 
12953
        delete [] combinations[r];
 
12954
      }// end loop over 'r'
 
12955
      delete [] combinations;
 
12956
      for (unsigned int r = 0; r < num_derivatives; r++)
 
12957
      {
 
12958
        delete [] transform[r];
 
12959
      }// end loop over 'r'
 
12960
      delete [] transform;
 
12961
        break;
 
12962
      }
 
12963
    case 21:
 
12964
      {
 
12965
        
 
12966
      // Array of basisvalues.
 
12967
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
12968
      
 
12969
      // Declare helper variables.
 
12970
      unsigned int rr = 0;
 
12971
      unsigned int ss = 0;
 
12972
      unsigned int tt = 0;
 
12973
      double tmp5 = 0.000000000000000;
 
12974
      double tmp6 = 0.000000000000000;
 
12975
      double tmp7 = 0.000000000000000;
 
12976
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
12977
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
12978
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
12979
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
12980
      double tmp4 = tmp3*tmp3;
 
12981
      
 
12982
      // Compute basisvalues.
 
12983
      basisvalues[0] = 1.000000000000000;
 
12984
      basisvalues[1] = tmp0;
 
12985
      for (unsigned int r = 1; r < 2; r++)
 
12986
      {
 
12987
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
12988
        ss = r*(r + 1)*(r + 2)/6;
 
12989
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
12990
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
12991
      }// end loop over 'r'
 
12992
      for (unsigned int r = 0; r < 2; r++)
 
12993
      {
 
12994
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
12995
        ss = r*(r + 1)*(r + 2)/6;
 
12996
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
12997
      }// end loop over 'r'
 
12998
      for (unsigned int r = 0; r < 1; r++)
 
12999
      {
 
13000
        for (unsigned int s = 1; s < 2 - r; s++)
 
13001
        {
 
13002
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13003
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13004
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13005
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13006
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13007
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13008
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13009
        }// end loop over 's'
 
13010
      }// end loop over 'r'
 
13011
      for (unsigned int r = 0; r < 2; r++)
 
13012
      {
 
13013
        for (unsigned int s = 0; s < 2 - r; s++)
 
13014
        {
 
13015
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13016
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13017
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
13018
        }// end loop over 's'
 
13019
      }// end loop over 'r'
 
13020
      for (unsigned int r = 0; r < 1; r++)
 
13021
      {
 
13022
        for (unsigned int s = 0; s < 1 - r; s++)
 
13023
        {
 
13024
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13025
          {
 
13026
            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;
 
13027
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13028
            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;
 
13029
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13030
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13031
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13032
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13033
          }// end loop over 't'
 
13034
        }// end loop over 's'
 
13035
      }// end loop over 'r'
 
13036
      for (unsigned int r = 0; r < 3; r++)
 
13037
      {
 
13038
        for (unsigned int s = 0; s < 3 - r; s++)
 
13039
        {
 
13040
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13041
          {
 
13042
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13043
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
13044
          }// end loop over 't'
 
13045
        }// end loop over 's'
 
13046
      }// end loop over 'r'
 
13047
      
 
13048
      // Table(s) of coefficients.
 
13049
      static const double coefficients0[10] = \
 
13050
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
13051
      
 
13052
      // Tables of derivatives of the polynomial base (transpose).
 
13053
      static const double dmats0[10][10] = \
 
13054
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13055
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13056
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13057
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13058
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13059
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13060
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13061
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13062
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13063
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13064
      
 
13065
      static const double dmats1[10][10] = \
 
13066
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13067
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13068
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13069
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13070
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13071
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13072
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13073
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13074
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13075
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13076
      
 
13077
      static const double dmats2[10][10] = \
 
13078
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13079
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13080
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13081
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13082
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13083
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13084
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13085
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13086
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13087
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13088
      
 
13089
      // Compute reference derivatives.
 
13090
      // Declare pointer to array of derivatives on FIAT element.
 
13091
      double *derivatives = new double[num_derivatives];
 
13092
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13093
      {
 
13094
        derivatives[r] = 0.000000000000000;
 
13095
      }// end loop over 'r'
 
13096
      
 
13097
      // Declare derivative matrix (of polynomial basis).
 
13098
      double dmats[10][10] = \
 
13099
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13100
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13101
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13102
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13103
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13104
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13105
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13106
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13107
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13108
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13109
      
 
13110
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13111
      double dmats_old[10][10] = \
 
13112
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13113
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13114
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13115
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13116
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13117
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13118
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13119
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13120
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13121
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13122
      
 
13123
      // Loop possible derivatives.
 
13124
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13125
      {
 
13126
        // Resetting dmats values to compute next derivative.
 
13127
        for (unsigned int t = 0; t < 10; t++)
 
13128
        {
 
13129
          for (unsigned int u = 0; u < 10; u++)
 
13130
          {
 
13131
            dmats[t][u] = 0.000000000000000;
 
13132
            if (t == u)
 
13133
            {
 
13134
            dmats[t][u] = 1.000000000000000;
 
13135
            }
 
13136
            
 
13137
          }// end loop over 'u'
 
13138
        }// end loop over 't'
 
13139
        
 
13140
        // Looping derivative order to generate dmats.
 
13141
        for (unsigned int s = 0; s < n; s++)
 
13142
        {
 
13143
          // Updating dmats_old with new values and resetting dmats.
 
13144
          for (unsigned int t = 0; t < 10; t++)
 
13145
          {
 
13146
            for (unsigned int u = 0; u < 10; u++)
 
13147
            {
 
13148
              dmats_old[t][u] = dmats[t][u];
 
13149
              dmats[t][u] = 0.000000000000000;
 
13150
            }// end loop over 'u'
 
13151
          }// end loop over 't'
 
13152
          
 
13153
          // Update dmats using an inner product.
 
13154
          if (combinations[r][s] == 0)
 
13155
          {
 
13156
          for (unsigned int t = 0; t < 10; t++)
 
13157
          {
 
13158
            for (unsigned int u = 0; u < 10; u++)
 
13159
            {
 
13160
              for (unsigned int tu = 0; tu < 10; tu++)
 
13161
              {
 
13162
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13163
              }// end loop over 'tu'
 
13164
            }// end loop over 'u'
 
13165
          }// end loop over 't'
 
13166
          }
 
13167
          
 
13168
          if (combinations[r][s] == 1)
 
13169
          {
 
13170
          for (unsigned int t = 0; t < 10; t++)
 
13171
          {
 
13172
            for (unsigned int u = 0; u < 10; u++)
 
13173
            {
 
13174
              for (unsigned int tu = 0; tu < 10; tu++)
 
13175
              {
 
13176
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13177
              }// end loop over 'tu'
 
13178
            }// end loop over 'u'
 
13179
          }// end loop over 't'
 
13180
          }
 
13181
          
 
13182
          if (combinations[r][s] == 2)
 
13183
          {
 
13184
          for (unsigned int t = 0; t < 10; t++)
 
13185
          {
 
13186
            for (unsigned int u = 0; u < 10; u++)
 
13187
            {
 
13188
              for (unsigned int tu = 0; tu < 10; tu++)
 
13189
              {
 
13190
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13191
              }// end loop over 'tu'
 
13192
            }// end loop over 'u'
 
13193
          }// end loop over 't'
 
13194
          }
 
13195
          
 
13196
        }// end loop over 's'
 
13197
        for (unsigned int s = 0; s < 10; s++)
 
13198
        {
 
13199
          for (unsigned int t = 0; t < 10; t++)
 
13200
          {
 
13201
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13202
          }// end loop over 't'
 
13203
        }// end loop over 's'
 
13204
      }// end loop over 'r'
 
13205
      
 
13206
      // Transform derivatives back to physical element
 
13207
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13208
      {
 
13209
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13210
        {
 
13211
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13212
        }// end loop over 's'
 
13213
      }// end loop over 'r'
 
13214
      
 
13215
      // Delete pointer to array of derivatives on FIAT element
 
13216
      delete [] derivatives;
 
13217
      
 
13218
      // Delete pointer to array of combinations of derivatives and transform
 
13219
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13220
      {
 
13221
        delete [] combinations[r];
 
13222
      }// end loop over 'r'
 
13223
      delete [] combinations;
 
13224
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13225
      {
 
13226
        delete [] transform[r];
 
13227
      }// end loop over 'r'
 
13228
      delete [] transform;
 
13229
        break;
 
13230
      }
 
13231
    case 22:
 
13232
      {
 
13233
        
 
13234
      // Array of basisvalues.
 
13235
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
13236
      
 
13237
      // Declare helper variables.
 
13238
      unsigned int rr = 0;
 
13239
      unsigned int ss = 0;
 
13240
      unsigned int tt = 0;
 
13241
      double tmp5 = 0.000000000000000;
 
13242
      double tmp6 = 0.000000000000000;
 
13243
      double tmp7 = 0.000000000000000;
 
13244
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
13245
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
13246
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
13247
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
13248
      double tmp4 = tmp3*tmp3;
 
13249
      
 
13250
      // Compute basisvalues.
 
13251
      basisvalues[0] = 1.000000000000000;
 
13252
      basisvalues[1] = tmp0;
 
13253
      for (unsigned int r = 1; r < 2; r++)
 
13254
      {
 
13255
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
13256
        ss = r*(r + 1)*(r + 2)/6;
 
13257
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
13258
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
13259
      }// end loop over 'r'
 
13260
      for (unsigned int r = 0; r < 2; r++)
 
13261
      {
 
13262
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
13263
        ss = r*(r + 1)*(r + 2)/6;
 
13264
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
13265
      }// end loop over 'r'
 
13266
      for (unsigned int r = 0; r < 1; r++)
 
13267
      {
 
13268
        for (unsigned int s = 1; s < 2 - r; s++)
 
13269
        {
 
13270
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13271
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13272
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13273
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13274
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13275
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13276
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13277
        }// end loop over 's'
 
13278
      }// end loop over 'r'
 
13279
      for (unsigned int r = 0; r < 2; r++)
 
13280
      {
 
13281
        for (unsigned int s = 0; s < 2 - r; s++)
 
13282
        {
 
13283
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13284
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13285
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
13286
        }// end loop over 's'
 
13287
      }// end loop over 'r'
 
13288
      for (unsigned int r = 0; r < 1; r++)
 
13289
      {
 
13290
        for (unsigned int s = 0; s < 1 - r; s++)
 
13291
        {
 
13292
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13293
          {
 
13294
            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;
 
13295
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13296
            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;
 
13297
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13298
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13299
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13300
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13301
          }// end loop over 't'
 
13302
        }// end loop over 's'
 
13303
      }// end loop over 'r'
 
13304
      for (unsigned int r = 0; r < 3; r++)
 
13305
      {
 
13306
        for (unsigned int s = 0; s < 3 - r; s++)
 
13307
        {
 
13308
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13309
          {
 
13310
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13311
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
13312
          }// end loop over 't'
 
13313
        }// end loop over 's'
 
13314
      }// end loop over 'r'
 
13315
      
 
13316
      // Table(s) of coefficients.
 
13317
      static const double coefficients0[10] = \
 
13318
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
13319
      
 
13320
      // Tables of derivatives of the polynomial base (transpose).
 
13321
      static const double dmats0[10][10] = \
 
13322
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13323
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13324
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13325
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13326
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13327
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13328
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13329
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13330
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13331
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13332
      
 
13333
      static const double dmats1[10][10] = \
 
13334
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13335
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13336
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13337
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13338
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13339
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13340
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13341
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13342
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13343
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13344
      
 
13345
      static const double dmats2[10][10] = \
 
13346
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13347
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13348
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13349
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13350
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13351
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13352
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13353
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13354
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13355
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13356
      
 
13357
      // Compute reference derivatives.
 
13358
      // Declare pointer to array of derivatives on FIAT element.
 
13359
      double *derivatives = new double[num_derivatives];
 
13360
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13361
      {
 
13362
        derivatives[r] = 0.000000000000000;
 
13363
      }// end loop over 'r'
 
13364
      
 
13365
      // Declare derivative matrix (of polynomial basis).
 
13366
      double dmats[10][10] = \
 
13367
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13368
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13369
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13370
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13371
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13372
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13373
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13374
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13375
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13376
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13377
      
 
13378
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13379
      double dmats_old[10][10] = \
 
13380
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13381
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13382
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13383
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13384
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13385
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13386
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13387
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13388
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13389
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13390
      
 
13391
      // Loop possible derivatives.
 
13392
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13393
      {
 
13394
        // Resetting dmats values to compute next derivative.
 
13395
        for (unsigned int t = 0; t < 10; t++)
 
13396
        {
 
13397
          for (unsigned int u = 0; u < 10; u++)
 
13398
          {
 
13399
            dmats[t][u] = 0.000000000000000;
 
13400
            if (t == u)
 
13401
            {
 
13402
            dmats[t][u] = 1.000000000000000;
 
13403
            }
 
13404
            
 
13405
          }// end loop over 'u'
 
13406
        }// end loop over 't'
 
13407
        
 
13408
        // Looping derivative order to generate dmats.
 
13409
        for (unsigned int s = 0; s < n; s++)
 
13410
        {
 
13411
          // Updating dmats_old with new values and resetting dmats.
 
13412
          for (unsigned int t = 0; t < 10; t++)
 
13413
          {
 
13414
            for (unsigned int u = 0; u < 10; u++)
 
13415
            {
 
13416
              dmats_old[t][u] = dmats[t][u];
 
13417
              dmats[t][u] = 0.000000000000000;
 
13418
            }// end loop over 'u'
 
13419
          }// end loop over 't'
 
13420
          
 
13421
          // Update dmats using an inner product.
 
13422
          if (combinations[r][s] == 0)
 
13423
          {
 
13424
          for (unsigned int t = 0; t < 10; t++)
 
13425
          {
 
13426
            for (unsigned int u = 0; u < 10; u++)
 
13427
            {
 
13428
              for (unsigned int tu = 0; tu < 10; tu++)
 
13429
              {
 
13430
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13431
              }// end loop over 'tu'
 
13432
            }// end loop over 'u'
 
13433
          }// end loop over 't'
 
13434
          }
 
13435
          
 
13436
          if (combinations[r][s] == 1)
 
13437
          {
 
13438
          for (unsigned int t = 0; t < 10; t++)
 
13439
          {
 
13440
            for (unsigned int u = 0; u < 10; u++)
 
13441
            {
 
13442
              for (unsigned int tu = 0; tu < 10; tu++)
 
13443
              {
 
13444
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13445
              }// end loop over 'tu'
 
13446
            }// end loop over 'u'
 
13447
          }// end loop over 't'
 
13448
          }
 
13449
          
 
13450
          if (combinations[r][s] == 2)
 
13451
          {
 
13452
          for (unsigned int t = 0; t < 10; t++)
 
13453
          {
 
13454
            for (unsigned int u = 0; u < 10; u++)
 
13455
            {
 
13456
              for (unsigned int tu = 0; tu < 10; tu++)
 
13457
              {
 
13458
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13459
              }// end loop over 'tu'
 
13460
            }// end loop over 'u'
 
13461
          }// end loop over 't'
 
13462
          }
 
13463
          
 
13464
        }// end loop over 's'
 
13465
        for (unsigned int s = 0; s < 10; s++)
 
13466
        {
 
13467
          for (unsigned int t = 0; t < 10; t++)
 
13468
          {
 
13469
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13470
          }// end loop over 't'
 
13471
        }// end loop over 's'
 
13472
      }// end loop over 'r'
 
13473
      
 
13474
      // Transform derivatives back to physical element
 
13475
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13476
      {
 
13477
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13478
        {
 
13479
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13480
        }// end loop over 's'
 
13481
      }// end loop over 'r'
 
13482
      
 
13483
      // Delete pointer to array of derivatives on FIAT element
 
13484
      delete [] derivatives;
 
13485
      
 
13486
      // Delete pointer to array of combinations of derivatives and transform
 
13487
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13488
      {
 
13489
        delete [] combinations[r];
 
13490
      }// end loop over 'r'
 
13491
      delete [] combinations;
 
13492
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13493
      {
 
13494
        delete [] transform[r];
 
13495
      }// end loop over 'r'
 
13496
      delete [] transform;
 
13497
        break;
 
13498
      }
 
13499
    case 23:
 
13500
      {
 
13501
        
 
13502
      // Array of basisvalues.
 
13503
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
13504
      
 
13505
      // Declare helper variables.
 
13506
      unsigned int rr = 0;
 
13507
      unsigned int ss = 0;
 
13508
      unsigned int tt = 0;
 
13509
      double tmp5 = 0.000000000000000;
 
13510
      double tmp6 = 0.000000000000000;
 
13511
      double tmp7 = 0.000000000000000;
 
13512
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
13513
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
13514
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
13515
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
13516
      double tmp4 = tmp3*tmp3;
 
13517
      
 
13518
      // Compute basisvalues.
 
13519
      basisvalues[0] = 1.000000000000000;
 
13520
      basisvalues[1] = tmp0;
 
13521
      for (unsigned int r = 1; r < 2; r++)
 
13522
      {
 
13523
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
13524
        ss = r*(r + 1)*(r + 2)/6;
 
13525
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
13526
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
13527
      }// end loop over 'r'
 
13528
      for (unsigned int r = 0; r < 2; r++)
 
13529
      {
 
13530
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
13531
        ss = r*(r + 1)*(r + 2)/6;
 
13532
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
13533
      }// end loop over 'r'
 
13534
      for (unsigned int r = 0; r < 1; r++)
 
13535
      {
 
13536
        for (unsigned int s = 1; s < 2 - r; s++)
 
13537
        {
 
13538
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13539
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13540
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13541
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13542
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13543
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13544
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13545
        }// end loop over 's'
 
13546
      }// end loop over 'r'
 
13547
      for (unsigned int r = 0; r < 2; r++)
 
13548
      {
 
13549
        for (unsigned int s = 0; s < 2 - r; s++)
 
13550
        {
 
13551
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13552
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13553
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
13554
        }// end loop over 's'
 
13555
      }// end loop over 'r'
 
13556
      for (unsigned int r = 0; r < 1; r++)
 
13557
      {
 
13558
        for (unsigned int s = 0; s < 1 - r; s++)
 
13559
        {
 
13560
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13561
          {
 
13562
            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;
 
13563
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13564
            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;
 
13565
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13566
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13567
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13568
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13569
          }// end loop over 't'
 
13570
        }// end loop over 's'
 
13571
      }// end loop over 'r'
 
13572
      for (unsigned int r = 0; r < 3; r++)
 
13573
      {
 
13574
        for (unsigned int s = 0; s < 3 - r; s++)
 
13575
        {
 
13576
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13577
          {
 
13578
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13579
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
13580
          }// end loop over 't'
 
13581
        }// end loop over 's'
 
13582
      }// end loop over 'r'
 
13583
      
 
13584
      // Table(s) of coefficients.
 
13585
      static const double coefficients0[10] = \
 
13586
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
13587
      
 
13588
      // Tables of derivatives of the polynomial base (transpose).
 
13589
      static const double dmats0[10][10] = \
 
13590
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13591
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13592
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13593
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13594
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13595
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13596
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13597
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13598
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13599
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13600
      
 
13601
      static const double dmats1[10][10] = \
 
13602
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13603
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13604
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13605
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13606
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13607
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13608
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13609
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13610
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13611
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13612
      
 
13613
      static const double dmats2[10][10] = \
 
13614
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13615
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13616
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13617
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13618
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13619
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13620
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13621
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13622
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13623
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13624
      
 
13625
      // Compute reference derivatives.
 
13626
      // Declare pointer to array of derivatives on FIAT element.
 
13627
      double *derivatives = new double[num_derivatives];
 
13628
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13629
      {
 
13630
        derivatives[r] = 0.000000000000000;
 
13631
      }// end loop over 'r'
 
13632
      
 
13633
      // Declare derivative matrix (of polynomial basis).
 
13634
      double dmats[10][10] = \
 
13635
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13636
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13637
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13638
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13639
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13640
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13641
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13642
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13643
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13644
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13645
      
 
13646
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13647
      double dmats_old[10][10] = \
 
13648
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13649
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13650
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13651
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13652
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13653
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13654
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13655
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13656
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13657
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13658
      
 
13659
      // Loop possible derivatives.
 
13660
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13661
      {
 
13662
        // Resetting dmats values to compute next derivative.
 
13663
        for (unsigned int t = 0; t < 10; t++)
 
13664
        {
 
13665
          for (unsigned int u = 0; u < 10; u++)
 
13666
          {
 
13667
            dmats[t][u] = 0.000000000000000;
 
13668
            if (t == u)
 
13669
            {
 
13670
            dmats[t][u] = 1.000000000000000;
 
13671
            }
 
13672
            
 
13673
          }// end loop over 'u'
 
13674
        }// end loop over 't'
 
13675
        
 
13676
        // Looping derivative order to generate dmats.
 
13677
        for (unsigned int s = 0; s < n; s++)
 
13678
        {
 
13679
          // Updating dmats_old with new values and resetting dmats.
 
13680
          for (unsigned int t = 0; t < 10; t++)
 
13681
          {
 
13682
            for (unsigned int u = 0; u < 10; u++)
 
13683
            {
 
13684
              dmats_old[t][u] = dmats[t][u];
 
13685
              dmats[t][u] = 0.000000000000000;
 
13686
            }// end loop over 'u'
 
13687
          }// end loop over 't'
 
13688
          
 
13689
          // Update dmats using an inner product.
 
13690
          if (combinations[r][s] == 0)
 
13691
          {
 
13692
          for (unsigned int t = 0; t < 10; t++)
 
13693
          {
 
13694
            for (unsigned int u = 0; u < 10; u++)
 
13695
            {
 
13696
              for (unsigned int tu = 0; tu < 10; tu++)
 
13697
              {
 
13698
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13699
              }// end loop over 'tu'
 
13700
            }// end loop over 'u'
 
13701
          }// end loop over 't'
 
13702
          }
 
13703
          
 
13704
          if (combinations[r][s] == 1)
 
13705
          {
 
13706
          for (unsigned int t = 0; t < 10; t++)
 
13707
          {
 
13708
            for (unsigned int u = 0; u < 10; u++)
 
13709
            {
 
13710
              for (unsigned int tu = 0; tu < 10; tu++)
 
13711
              {
 
13712
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13713
              }// end loop over 'tu'
 
13714
            }// end loop over 'u'
 
13715
          }// end loop over 't'
 
13716
          }
 
13717
          
 
13718
          if (combinations[r][s] == 2)
 
13719
          {
 
13720
          for (unsigned int t = 0; t < 10; t++)
 
13721
          {
 
13722
            for (unsigned int u = 0; u < 10; u++)
 
13723
            {
 
13724
              for (unsigned int tu = 0; tu < 10; tu++)
 
13725
              {
 
13726
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13727
              }// end loop over 'tu'
 
13728
            }// end loop over 'u'
 
13729
          }// end loop over 't'
 
13730
          }
 
13731
          
 
13732
        }// end loop over 's'
 
13733
        for (unsigned int s = 0; s < 10; s++)
 
13734
        {
 
13735
          for (unsigned int t = 0; t < 10; t++)
 
13736
          {
 
13737
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
13738
          }// end loop over 't'
 
13739
        }// end loop over 's'
 
13740
      }// end loop over 'r'
 
13741
      
 
13742
      // Transform derivatives back to physical element
 
13743
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13744
      {
 
13745
        for (unsigned int s = 0; s < num_derivatives; s++)
 
13746
        {
 
13747
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
13748
        }// end loop over 's'
 
13749
      }// end loop over 'r'
 
13750
      
 
13751
      // Delete pointer to array of derivatives on FIAT element
 
13752
      delete [] derivatives;
 
13753
      
 
13754
      // Delete pointer to array of combinations of derivatives and transform
 
13755
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13756
      {
 
13757
        delete [] combinations[r];
 
13758
      }// end loop over 'r'
 
13759
      delete [] combinations;
 
13760
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13761
      {
 
13762
        delete [] transform[r];
 
13763
      }// end loop over 'r'
 
13764
      delete [] transform;
 
13765
        break;
 
13766
      }
 
13767
    case 24:
 
13768
      {
 
13769
        
 
13770
      // Array of basisvalues.
 
13771
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
13772
      
 
13773
      // Declare helper variables.
 
13774
      unsigned int rr = 0;
 
13775
      unsigned int ss = 0;
 
13776
      unsigned int tt = 0;
 
13777
      double tmp5 = 0.000000000000000;
 
13778
      double tmp6 = 0.000000000000000;
 
13779
      double tmp7 = 0.000000000000000;
 
13780
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
13781
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
13782
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
13783
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
13784
      double tmp4 = tmp3*tmp3;
 
13785
      
 
13786
      // Compute basisvalues.
 
13787
      basisvalues[0] = 1.000000000000000;
 
13788
      basisvalues[1] = tmp0;
 
13789
      for (unsigned int r = 1; r < 2; r++)
 
13790
      {
 
13791
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
13792
        ss = r*(r + 1)*(r + 2)/6;
 
13793
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
13794
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
13795
      }// end loop over 'r'
 
13796
      for (unsigned int r = 0; r < 2; r++)
 
13797
      {
 
13798
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
13799
        ss = r*(r + 1)*(r + 2)/6;
 
13800
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
13801
      }// end loop over 'r'
 
13802
      for (unsigned int r = 0; r < 1; r++)
 
13803
      {
 
13804
        for (unsigned int s = 1; s < 2 - r; s++)
 
13805
        {
 
13806
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
13807
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13808
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
13809
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13810
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13811
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
13812
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
13813
        }// end loop over 's'
 
13814
      }// end loop over 'r'
 
13815
      for (unsigned int r = 0; r < 2; r++)
 
13816
      {
 
13817
        for (unsigned int s = 0; s < 2 - r; s++)
 
13818
        {
 
13819
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
13820
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
13821
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
13822
        }// end loop over 's'
 
13823
      }// end loop over 'r'
 
13824
      for (unsigned int r = 0; r < 1; r++)
 
13825
      {
 
13826
        for (unsigned int s = 0; s < 1 - r; s++)
 
13827
        {
 
13828
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
13829
          {
 
13830
            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;
 
13831
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13832
            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;
 
13833
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13834
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13835
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
13836
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
13837
          }// end loop over 't'
 
13838
        }// end loop over 's'
 
13839
      }// end loop over 'r'
 
13840
      for (unsigned int r = 0; r < 3; r++)
 
13841
      {
 
13842
        for (unsigned int s = 0; s < 3 - r; s++)
 
13843
        {
 
13844
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
13845
          {
 
13846
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
13847
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
13848
          }// end loop over 't'
 
13849
        }// end loop over 's'
 
13850
      }// end loop over 'r'
 
13851
      
 
13852
      // Table(s) of coefficients.
 
13853
      static const double coefficients0[10] = \
 
13854
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
13855
      
 
13856
      // Tables of derivatives of the polynomial base (transpose).
 
13857
      static const double dmats0[10][10] = \
 
13858
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13859
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13860
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13861
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13862
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13863
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13864
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13865
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13866
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13867
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13868
      
 
13869
      static const double dmats1[10][10] = \
 
13870
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13871
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13872
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13873
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13874
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13875
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13876
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13877
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13878
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13879
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13880
      
 
13881
      static const double dmats2[10][10] = \
 
13882
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13883
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13884
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13885
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13886
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13887
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13888
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13889
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13890
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13891
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
13892
      
 
13893
      // Compute reference derivatives.
 
13894
      // Declare pointer to array of derivatives on FIAT element.
 
13895
      double *derivatives = new double[num_derivatives];
 
13896
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13897
      {
 
13898
        derivatives[r] = 0.000000000000000;
 
13899
      }// end loop over 'r'
 
13900
      
 
13901
      // Declare derivative matrix (of polynomial basis).
 
13902
      double dmats[10][10] = \
 
13903
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13904
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13905
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13906
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13907
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13908
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13909
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13910
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13911
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13912
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13913
      
 
13914
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
13915
      double dmats_old[10][10] = \
 
13916
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13917
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13918
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13919
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13920
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13921
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13922
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
13923
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
13924
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
13925
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
13926
      
 
13927
      // Loop possible derivatives.
 
13928
      for (unsigned int r = 0; r < num_derivatives; r++)
 
13929
      {
 
13930
        // Resetting dmats values to compute next derivative.
 
13931
        for (unsigned int t = 0; t < 10; t++)
 
13932
        {
 
13933
          for (unsigned int u = 0; u < 10; u++)
 
13934
          {
 
13935
            dmats[t][u] = 0.000000000000000;
 
13936
            if (t == u)
 
13937
            {
 
13938
            dmats[t][u] = 1.000000000000000;
 
13939
            }
 
13940
            
 
13941
          }// end loop over 'u'
 
13942
        }// end loop over 't'
 
13943
        
 
13944
        // Looping derivative order to generate dmats.
 
13945
        for (unsigned int s = 0; s < n; s++)
 
13946
        {
 
13947
          // Updating dmats_old with new values and resetting dmats.
 
13948
          for (unsigned int t = 0; t < 10; t++)
 
13949
          {
 
13950
            for (unsigned int u = 0; u < 10; u++)
 
13951
            {
 
13952
              dmats_old[t][u] = dmats[t][u];
 
13953
              dmats[t][u] = 0.000000000000000;
 
13954
            }// end loop over 'u'
 
13955
          }// end loop over 't'
 
13956
          
 
13957
          // Update dmats using an inner product.
 
13958
          if (combinations[r][s] == 0)
 
13959
          {
 
13960
          for (unsigned int t = 0; t < 10; t++)
 
13961
          {
 
13962
            for (unsigned int u = 0; u < 10; u++)
 
13963
            {
 
13964
              for (unsigned int tu = 0; tu < 10; tu++)
 
13965
              {
 
13966
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
13967
              }// end loop over 'tu'
 
13968
            }// end loop over 'u'
 
13969
          }// end loop over 't'
 
13970
          }
 
13971
          
 
13972
          if (combinations[r][s] == 1)
 
13973
          {
 
13974
          for (unsigned int t = 0; t < 10; t++)
 
13975
          {
 
13976
            for (unsigned int u = 0; u < 10; u++)
 
13977
            {
 
13978
              for (unsigned int tu = 0; tu < 10; tu++)
 
13979
              {
 
13980
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
13981
              }// end loop over 'tu'
 
13982
            }// end loop over 'u'
 
13983
          }// end loop over 't'
 
13984
          }
 
13985
          
 
13986
          if (combinations[r][s] == 2)
 
13987
          {
 
13988
          for (unsigned int t = 0; t < 10; t++)
 
13989
          {
 
13990
            for (unsigned int u = 0; u < 10; u++)
 
13991
            {
 
13992
              for (unsigned int tu = 0; tu < 10; tu++)
 
13993
              {
 
13994
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
13995
              }// end loop over 'tu'
 
13996
            }// end loop over 'u'
 
13997
          }// end loop over 't'
 
13998
          }
 
13999
          
 
14000
        }// end loop over 's'
 
14001
        for (unsigned int s = 0; s < 10; s++)
 
14002
        {
 
14003
          for (unsigned int t = 0; t < 10; t++)
 
14004
          {
 
14005
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14006
          }// end loop over 't'
 
14007
        }// end loop over 's'
 
14008
      }// end loop over 'r'
 
14009
      
 
14010
      // Transform derivatives back to physical element
 
14011
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14012
      {
 
14013
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14014
        {
 
14015
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14016
        }// end loop over 's'
 
14017
      }// end loop over 'r'
 
14018
      
 
14019
      // Delete pointer to array of derivatives on FIAT element
 
14020
      delete [] derivatives;
 
14021
      
 
14022
      // Delete pointer to array of combinations of derivatives and transform
 
14023
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14024
      {
 
14025
        delete [] combinations[r];
 
14026
      }// end loop over 'r'
 
14027
      delete [] combinations;
 
14028
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14029
      {
 
14030
        delete [] transform[r];
 
14031
      }// end loop over 'r'
 
14032
      delete [] transform;
 
14033
        break;
 
14034
      }
 
14035
    case 25:
 
14036
      {
 
14037
        
 
14038
      // Array of basisvalues.
 
14039
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
14040
      
 
14041
      // Declare helper variables.
 
14042
      unsigned int rr = 0;
 
14043
      unsigned int ss = 0;
 
14044
      unsigned int tt = 0;
 
14045
      double tmp5 = 0.000000000000000;
 
14046
      double tmp6 = 0.000000000000000;
 
14047
      double tmp7 = 0.000000000000000;
 
14048
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
14049
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
14050
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
14051
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
14052
      double tmp4 = tmp3*tmp3;
 
14053
      
 
14054
      // Compute basisvalues.
 
14055
      basisvalues[0] = 1.000000000000000;
 
14056
      basisvalues[1] = tmp0;
 
14057
      for (unsigned int r = 1; r < 2; r++)
 
14058
      {
 
14059
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14060
        ss = r*(r + 1)*(r + 2)/6;
 
14061
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14062
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
14063
      }// end loop over 'r'
 
14064
      for (unsigned int r = 0; r < 2; r++)
 
14065
      {
 
14066
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14067
        ss = r*(r + 1)*(r + 2)/6;
 
14068
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
14069
      }// end loop over 'r'
 
14070
      for (unsigned int r = 0; r < 1; r++)
 
14071
      {
 
14072
        for (unsigned int s = 1; s < 2 - r; s++)
 
14073
        {
 
14074
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14075
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14076
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14077
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14078
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14079
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14080
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14081
        }// end loop over 's'
 
14082
      }// end loop over 'r'
 
14083
      for (unsigned int r = 0; r < 2; r++)
 
14084
      {
 
14085
        for (unsigned int s = 0; s < 2 - r; s++)
 
14086
        {
 
14087
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14088
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14089
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
14090
        }// end loop over 's'
 
14091
      }// end loop over 'r'
 
14092
      for (unsigned int r = 0; r < 1; r++)
 
14093
      {
 
14094
        for (unsigned int s = 0; s < 1 - r; s++)
 
14095
        {
 
14096
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14097
          {
 
14098
            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;
 
14099
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14100
            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;
 
14101
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14102
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14103
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14104
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14105
          }// end loop over 't'
 
14106
        }// end loop over 's'
 
14107
      }// end loop over 'r'
 
14108
      for (unsigned int r = 0; r < 3; r++)
 
14109
      {
 
14110
        for (unsigned int s = 0; s < 3 - r; s++)
 
14111
        {
 
14112
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14113
          {
 
14114
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14115
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
14116
          }// end loop over 't'
 
14117
        }// end loop over 's'
 
14118
      }// end loop over 'r'
 
14119
      
 
14120
      // Table(s) of coefficients.
 
14121
      static const double coefficients0[10] = \
 
14122
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
14123
      
 
14124
      // Tables of derivatives of the polynomial base (transpose).
 
14125
      static const double dmats0[10][10] = \
 
14126
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14127
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14128
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14129
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14130
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14131
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14132
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14133
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14134
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14135
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14136
      
 
14137
      static const double dmats1[10][10] = \
 
14138
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14139
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14140
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14141
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14142
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14143
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14144
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14145
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14146
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14147
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14148
      
 
14149
      static const double dmats2[10][10] = \
 
14150
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14151
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14152
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14153
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14154
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14155
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14156
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14157
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14158
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14159
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14160
      
 
14161
      // Compute reference derivatives.
 
14162
      // Declare pointer to array of derivatives on FIAT element.
 
14163
      double *derivatives = new double[num_derivatives];
 
14164
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14165
      {
 
14166
        derivatives[r] = 0.000000000000000;
 
14167
      }// end loop over 'r'
 
14168
      
 
14169
      // Declare derivative matrix (of polynomial basis).
 
14170
      double dmats[10][10] = \
 
14171
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14172
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14173
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14174
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14175
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14176
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14177
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14178
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14179
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14180
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14181
      
 
14182
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14183
      double dmats_old[10][10] = \
 
14184
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14185
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14186
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14187
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14188
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14189
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14190
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14191
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14192
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14193
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14194
      
 
14195
      // Loop possible derivatives.
 
14196
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14197
      {
 
14198
        // Resetting dmats values to compute next derivative.
 
14199
        for (unsigned int t = 0; t < 10; t++)
 
14200
        {
 
14201
          for (unsigned int u = 0; u < 10; u++)
 
14202
          {
 
14203
            dmats[t][u] = 0.000000000000000;
 
14204
            if (t == u)
 
14205
            {
 
14206
            dmats[t][u] = 1.000000000000000;
 
14207
            }
 
14208
            
 
14209
          }// end loop over 'u'
 
14210
        }// end loop over 't'
 
14211
        
 
14212
        // Looping derivative order to generate dmats.
 
14213
        for (unsigned int s = 0; s < n; s++)
 
14214
        {
 
14215
          // Updating dmats_old with new values and resetting dmats.
 
14216
          for (unsigned int t = 0; t < 10; t++)
 
14217
          {
 
14218
            for (unsigned int u = 0; u < 10; u++)
 
14219
            {
 
14220
              dmats_old[t][u] = dmats[t][u];
 
14221
              dmats[t][u] = 0.000000000000000;
 
14222
            }// end loop over 'u'
 
14223
          }// end loop over 't'
 
14224
          
 
14225
          // Update dmats using an inner product.
 
14226
          if (combinations[r][s] == 0)
 
14227
          {
 
14228
          for (unsigned int t = 0; t < 10; t++)
 
14229
          {
 
14230
            for (unsigned int u = 0; u < 10; u++)
 
14231
            {
 
14232
              for (unsigned int tu = 0; tu < 10; tu++)
 
14233
              {
 
14234
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14235
              }// end loop over 'tu'
 
14236
            }// end loop over 'u'
 
14237
          }// end loop over 't'
 
14238
          }
 
14239
          
 
14240
          if (combinations[r][s] == 1)
 
14241
          {
 
14242
          for (unsigned int t = 0; t < 10; t++)
 
14243
          {
 
14244
            for (unsigned int u = 0; u < 10; u++)
 
14245
            {
 
14246
              for (unsigned int tu = 0; tu < 10; tu++)
 
14247
              {
 
14248
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
14249
              }// end loop over 'tu'
 
14250
            }// end loop over 'u'
 
14251
          }// end loop over 't'
 
14252
          }
 
14253
          
 
14254
          if (combinations[r][s] == 2)
 
14255
          {
 
14256
          for (unsigned int t = 0; t < 10; t++)
 
14257
          {
 
14258
            for (unsigned int u = 0; u < 10; u++)
 
14259
            {
 
14260
              for (unsigned int tu = 0; tu < 10; tu++)
 
14261
              {
 
14262
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
14263
              }// end loop over 'tu'
 
14264
            }// end loop over 'u'
 
14265
          }// end loop over 't'
 
14266
          }
 
14267
          
 
14268
        }// end loop over 's'
 
14269
        for (unsigned int s = 0; s < 10; s++)
 
14270
        {
 
14271
          for (unsigned int t = 0; t < 10; t++)
 
14272
          {
 
14273
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14274
          }// end loop over 't'
 
14275
        }// end loop over 's'
 
14276
      }// end loop over 'r'
 
14277
      
 
14278
      // Transform derivatives back to physical element
 
14279
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14280
      {
 
14281
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14282
        {
 
14283
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14284
        }// end loop over 's'
 
14285
      }// end loop over 'r'
 
14286
      
 
14287
      // Delete pointer to array of derivatives on FIAT element
 
14288
      delete [] derivatives;
 
14289
      
 
14290
      // Delete pointer to array of combinations of derivatives and transform
 
14291
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14292
      {
 
14293
        delete [] combinations[r];
 
14294
      }// end loop over 'r'
 
14295
      delete [] combinations;
 
14296
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14297
      {
 
14298
        delete [] transform[r];
 
14299
      }// end loop over 'r'
 
14300
      delete [] transform;
 
14301
        break;
 
14302
      }
 
14303
    case 26:
 
14304
      {
 
14305
        
 
14306
      // Array of basisvalues.
 
14307
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
14308
      
 
14309
      // Declare helper variables.
 
14310
      unsigned int rr = 0;
 
14311
      unsigned int ss = 0;
 
14312
      unsigned int tt = 0;
 
14313
      double tmp5 = 0.000000000000000;
 
14314
      double tmp6 = 0.000000000000000;
 
14315
      double tmp7 = 0.000000000000000;
 
14316
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
14317
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
14318
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
14319
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
14320
      double tmp4 = tmp3*tmp3;
 
14321
      
 
14322
      // Compute basisvalues.
 
14323
      basisvalues[0] = 1.000000000000000;
 
14324
      basisvalues[1] = tmp0;
 
14325
      for (unsigned int r = 1; r < 2; r++)
 
14326
      {
 
14327
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14328
        ss = r*(r + 1)*(r + 2)/6;
 
14329
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14330
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
14331
      }// end loop over 'r'
 
14332
      for (unsigned int r = 0; r < 2; r++)
 
14333
      {
 
14334
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14335
        ss = r*(r + 1)*(r + 2)/6;
 
14336
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
14337
      }// end loop over 'r'
 
14338
      for (unsigned int r = 0; r < 1; r++)
 
14339
      {
 
14340
        for (unsigned int s = 1; s < 2 - r; s++)
 
14341
        {
 
14342
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14343
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14344
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14345
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14346
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14347
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14348
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14349
        }// end loop over 's'
 
14350
      }// end loop over 'r'
 
14351
      for (unsigned int r = 0; r < 2; r++)
 
14352
      {
 
14353
        for (unsigned int s = 0; s < 2 - r; s++)
 
14354
        {
 
14355
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14356
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14357
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
14358
        }// end loop over 's'
 
14359
      }// end loop over 'r'
 
14360
      for (unsigned int r = 0; r < 1; r++)
 
14361
      {
 
14362
        for (unsigned int s = 0; s < 1 - r; s++)
 
14363
        {
 
14364
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14365
          {
 
14366
            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;
 
14367
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14368
            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;
 
14369
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14370
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14371
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14372
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14373
          }// end loop over 't'
 
14374
        }// end loop over 's'
 
14375
      }// end loop over 'r'
 
14376
      for (unsigned int r = 0; r < 3; r++)
 
14377
      {
 
14378
        for (unsigned int s = 0; s < 3 - r; s++)
 
14379
        {
 
14380
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14381
          {
 
14382
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14383
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
14384
          }// end loop over 't'
 
14385
        }// end loop over 's'
 
14386
      }// end loop over 'r'
 
14387
      
 
14388
      // Table(s) of coefficients.
 
14389
      static const double coefficients0[10] = \
 
14390
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
14391
      
 
14392
      // Tables of derivatives of the polynomial base (transpose).
 
14393
      static const double dmats0[10][10] = \
 
14394
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14395
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14396
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14397
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14398
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14399
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14400
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14401
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14402
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14403
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14404
      
 
14405
      static const double dmats1[10][10] = \
 
14406
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14407
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14408
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14409
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14410
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14411
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14412
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14413
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14414
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14415
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14416
      
 
14417
      static const double dmats2[10][10] = \
 
14418
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14419
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14420
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14421
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14422
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14423
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14424
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14425
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14426
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14427
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14428
      
 
14429
      // Compute reference derivatives.
 
14430
      // Declare pointer to array of derivatives on FIAT element.
 
14431
      double *derivatives = new double[num_derivatives];
 
14432
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14433
      {
 
14434
        derivatives[r] = 0.000000000000000;
 
14435
      }// end loop over 'r'
 
14436
      
 
14437
      // Declare derivative matrix (of polynomial basis).
 
14438
      double dmats[10][10] = \
 
14439
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14440
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14441
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14442
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14443
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14444
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14445
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14446
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14447
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14448
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14449
      
 
14450
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14451
      double dmats_old[10][10] = \
 
14452
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14453
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14454
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14455
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14456
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14457
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14458
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14459
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14460
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14461
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14462
      
 
14463
      // Loop possible derivatives.
 
14464
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14465
      {
 
14466
        // Resetting dmats values to compute next derivative.
 
14467
        for (unsigned int t = 0; t < 10; t++)
 
14468
        {
 
14469
          for (unsigned int u = 0; u < 10; u++)
 
14470
          {
 
14471
            dmats[t][u] = 0.000000000000000;
 
14472
            if (t == u)
 
14473
            {
 
14474
            dmats[t][u] = 1.000000000000000;
 
14475
            }
 
14476
            
 
14477
          }// end loop over 'u'
 
14478
        }// end loop over 't'
 
14479
        
 
14480
        // Looping derivative order to generate dmats.
 
14481
        for (unsigned int s = 0; s < n; s++)
 
14482
        {
 
14483
          // Updating dmats_old with new values and resetting dmats.
 
14484
          for (unsigned int t = 0; t < 10; t++)
 
14485
          {
 
14486
            for (unsigned int u = 0; u < 10; u++)
 
14487
            {
 
14488
              dmats_old[t][u] = dmats[t][u];
 
14489
              dmats[t][u] = 0.000000000000000;
 
14490
            }// end loop over 'u'
 
14491
          }// end loop over 't'
 
14492
          
 
14493
          // Update dmats using an inner product.
 
14494
          if (combinations[r][s] == 0)
 
14495
          {
 
14496
          for (unsigned int t = 0; t < 10; t++)
 
14497
          {
 
14498
            for (unsigned int u = 0; u < 10; u++)
 
14499
            {
 
14500
              for (unsigned int tu = 0; tu < 10; tu++)
 
14501
              {
 
14502
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14503
              }// end loop over 'tu'
 
14504
            }// end loop over 'u'
 
14505
          }// end loop over 't'
 
14506
          }
 
14507
          
 
14508
          if (combinations[r][s] == 1)
 
14509
          {
 
14510
          for (unsigned int t = 0; t < 10; t++)
 
14511
          {
 
14512
            for (unsigned int u = 0; u < 10; u++)
 
14513
            {
 
14514
              for (unsigned int tu = 0; tu < 10; tu++)
 
14515
              {
 
14516
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
14517
              }// end loop over 'tu'
 
14518
            }// end loop over 'u'
 
14519
          }// end loop over 't'
 
14520
          }
 
14521
          
 
14522
          if (combinations[r][s] == 2)
 
14523
          {
 
14524
          for (unsigned int t = 0; t < 10; t++)
 
14525
          {
 
14526
            for (unsigned int u = 0; u < 10; u++)
 
14527
            {
 
14528
              for (unsigned int tu = 0; tu < 10; tu++)
 
14529
              {
 
14530
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
14531
              }// end loop over 'tu'
 
14532
            }// end loop over 'u'
 
14533
          }// end loop over 't'
 
14534
          }
 
14535
          
 
14536
        }// end loop over 's'
 
14537
        for (unsigned int s = 0; s < 10; s++)
 
14538
        {
 
14539
          for (unsigned int t = 0; t < 10; t++)
 
14540
          {
 
14541
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14542
          }// end loop over 't'
 
14543
        }// end loop over 's'
 
14544
      }// end loop over 'r'
 
14545
      
 
14546
      // Transform derivatives back to physical element
 
14547
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14548
      {
 
14549
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14550
        {
 
14551
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14552
        }// end loop over 's'
 
14553
      }// end loop over 'r'
 
14554
      
 
14555
      // Delete pointer to array of derivatives on FIAT element
 
14556
      delete [] derivatives;
 
14557
      
 
14558
      // Delete pointer to array of combinations of derivatives and transform
 
14559
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14560
      {
 
14561
        delete [] combinations[r];
 
14562
      }// end loop over 'r'
 
14563
      delete [] combinations;
 
14564
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14565
      {
 
14566
        delete [] transform[r];
 
14567
      }// end loop over 'r'
 
14568
      delete [] transform;
 
14569
        break;
 
14570
      }
 
14571
    case 27:
 
14572
      {
 
14573
        
 
14574
      // Array of basisvalues.
 
14575
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
14576
      
 
14577
      // Declare helper variables.
 
14578
      unsigned int rr = 0;
 
14579
      unsigned int ss = 0;
 
14580
      unsigned int tt = 0;
 
14581
      double tmp5 = 0.000000000000000;
 
14582
      double tmp6 = 0.000000000000000;
 
14583
      double tmp7 = 0.000000000000000;
 
14584
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
14585
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
14586
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
14587
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
14588
      double tmp4 = tmp3*tmp3;
 
14589
      
 
14590
      // Compute basisvalues.
 
14591
      basisvalues[0] = 1.000000000000000;
 
14592
      basisvalues[1] = tmp0;
 
14593
      for (unsigned int r = 1; r < 2; r++)
 
14594
      {
 
14595
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14596
        ss = r*(r + 1)*(r + 2)/6;
 
14597
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14598
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
14599
      }// end loop over 'r'
 
14600
      for (unsigned int r = 0; r < 2; r++)
 
14601
      {
 
14602
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14603
        ss = r*(r + 1)*(r + 2)/6;
 
14604
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
14605
      }// end loop over 'r'
 
14606
      for (unsigned int r = 0; r < 1; r++)
 
14607
      {
 
14608
        for (unsigned int s = 1; s < 2 - r; s++)
 
14609
        {
 
14610
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14611
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14612
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14613
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14614
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14615
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14616
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14617
        }// end loop over 's'
 
14618
      }// end loop over 'r'
 
14619
      for (unsigned int r = 0; r < 2; r++)
 
14620
      {
 
14621
        for (unsigned int s = 0; s < 2 - r; s++)
 
14622
        {
 
14623
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14624
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14625
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
14626
        }// end loop over 's'
 
14627
      }// end loop over 'r'
 
14628
      for (unsigned int r = 0; r < 1; r++)
 
14629
      {
 
14630
        for (unsigned int s = 0; s < 1 - r; s++)
 
14631
        {
 
14632
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14633
          {
 
14634
            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;
 
14635
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14636
            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;
 
14637
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14638
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14639
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14640
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14641
          }// end loop over 't'
 
14642
        }// end loop over 's'
 
14643
      }// end loop over 'r'
 
14644
      for (unsigned int r = 0; r < 3; r++)
 
14645
      {
 
14646
        for (unsigned int s = 0; s < 3 - r; s++)
 
14647
        {
 
14648
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14649
          {
 
14650
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14651
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
14652
          }// end loop over 't'
 
14653
        }// end loop over 's'
 
14654
      }// end loop over 'r'
 
14655
      
 
14656
      // Table(s) of coefficients.
 
14657
      static const double coefficients0[10] = \
 
14658
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
14659
      
 
14660
      // Tables of derivatives of the polynomial base (transpose).
 
14661
      static const double dmats0[10][10] = \
 
14662
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14663
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14664
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14665
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14666
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14667
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14668
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14669
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14670
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14671
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14672
      
 
14673
      static const double dmats1[10][10] = \
 
14674
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14675
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14676
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14677
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14678
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14679
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14680
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14681
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14682
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14683
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14684
      
 
14685
      static const double dmats2[10][10] = \
 
14686
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14687
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14688
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14689
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14690
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14691
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14692
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14693
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14694
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14695
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14696
      
 
14697
      // Compute reference derivatives.
 
14698
      // Declare pointer to array of derivatives on FIAT element.
 
14699
      double *derivatives = new double[num_derivatives];
 
14700
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14701
      {
 
14702
        derivatives[r] = 0.000000000000000;
 
14703
      }// end loop over 'r'
 
14704
      
 
14705
      // Declare derivative matrix (of polynomial basis).
 
14706
      double dmats[10][10] = \
 
14707
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14708
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14709
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14710
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14711
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14712
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14713
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14714
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14715
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14716
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14717
      
 
14718
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14719
      double dmats_old[10][10] = \
 
14720
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14721
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14722
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14723
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14724
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14725
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14726
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14727
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14728
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14729
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14730
      
 
14731
      // Loop possible derivatives.
 
14732
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14733
      {
 
14734
        // Resetting dmats values to compute next derivative.
 
14735
        for (unsigned int t = 0; t < 10; t++)
 
14736
        {
 
14737
          for (unsigned int u = 0; u < 10; u++)
 
14738
          {
 
14739
            dmats[t][u] = 0.000000000000000;
 
14740
            if (t == u)
 
14741
            {
 
14742
            dmats[t][u] = 1.000000000000000;
 
14743
            }
 
14744
            
 
14745
          }// end loop over 'u'
 
14746
        }// end loop over 't'
 
14747
        
 
14748
        // Looping derivative order to generate dmats.
 
14749
        for (unsigned int s = 0; s < n; s++)
 
14750
        {
 
14751
          // Updating dmats_old with new values and resetting dmats.
 
14752
          for (unsigned int t = 0; t < 10; t++)
 
14753
          {
 
14754
            for (unsigned int u = 0; u < 10; u++)
 
14755
            {
 
14756
              dmats_old[t][u] = dmats[t][u];
 
14757
              dmats[t][u] = 0.000000000000000;
 
14758
            }// end loop over 'u'
 
14759
          }// end loop over 't'
 
14760
          
 
14761
          // Update dmats using an inner product.
 
14762
          if (combinations[r][s] == 0)
 
14763
          {
 
14764
          for (unsigned int t = 0; t < 10; t++)
 
14765
          {
 
14766
            for (unsigned int u = 0; u < 10; u++)
 
14767
            {
 
14768
              for (unsigned int tu = 0; tu < 10; tu++)
 
14769
              {
 
14770
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
14771
              }// end loop over 'tu'
 
14772
            }// end loop over 'u'
 
14773
          }// end loop over 't'
 
14774
          }
 
14775
          
 
14776
          if (combinations[r][s] == 1)
 
14777
          {
 
14778
          for (unsigned int t = 0; t < 10; t++)
 
14779
          {
 
14780
            for (unsigned int u = 0; u < 10; u++)
 
14781
            {
 
14782
              for (unsigned int tu = 0; tu < 10; tu++)
 
14783
              {
 
14784
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
14785
              }// end loop over 'tu'
 
14786
            }// end loop over 'u'
 
14787
          }// end loop over 't'
 
14788
          }
 
14789
          
 
14790
          if (combinations[r][s] == 2)
 
14791
          {
 
14792
          for (unsigned int t = 0; t < 10; t++)
 
14793
          {
 
14794
            for (unsigned int u = 0; u < 10; u++)
 
14795
            {
 
14796
              for (unsigned int tu = 0; tu < 10; tu++)
 
14797
              {
 
14798
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
14799
              }// end loop over 'tu'
 
14800
            }// end loop over 'u'
 
14801
          }// end loop over 't'
 
14802
          }
 
14803
          
 
14804
        }// end loop over 's'
 
14805
        for (unsigned int s = 0; s < 10; s++)
 
14806
        {
 
14807
          for (unsigned int t = 0; t < 10; t++)
 
14808
          {
 
14809
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
14810
          }// end loop over 't'
 
14811
        }// end loop over 's'
 
14812
      }// end loop over 'r'
 
14813
      
 
14814
      // Transform derivatives back to physical element
 
14815
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14816
      {
 
14817
        for (unsigned int s = 0; s < num_derivatives; s++)
 
14818
        {
 
14819
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
14820
        }// end loop over 's'
 
14821
      }// end loop over 'r'
 
14822
      
 
14823
      // Delete pointer to array of derivatives on FIAT element
 
14824
      delete [] derivatives;
 
14825
      
 
14826
      // Delete pointer to array of combinations of derivatives and transform
 
14827
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14828
      {
 
14829
        delete [] combinations[r];
 
14830
      }// end loop over 'r'
 
14831
      delete [] combinations;
 
14832
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14833
      {
 
14834
        delete [] transform[r];
 
14835
      }// end loop over 'r'
 
14836
      delete [] transform;
 
14837
        break;
 
14838
      }
 
14839
    case 28:
 
14840
      {
 
14841
        
 
14842
      // Array of basisvalues.
 
14843
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
14844
      
 
14845
      // Declare helper variables.
 
14846
      unsigned int rr = 0;
 
14847
      unsigned int ss = 0;
 
14848
      unsigned int tt = 0;
 
14849
      double tmp5 = 0.000000000000000;
 
14850
      double tmp6 = 0.000000000000000;
 
14851
      double tmp7 = 0.000000000000000;
 
14852
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
14853
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
14854
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
14855
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
14856
      double tmp4 = tmp3*tmp3;
 
14857
      
 
14858
      // Compute basisvalues.
 
14859
      basisvalues[0] = 1.000000000000000;
 
14860
      basisvalues[1] = tmp0;
 
14861
      for (unsigned int r = 1; r < 2; r++)
 
14862
      {
 
14863
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
14864
        ss = r*(r + 1)*(r + 2)/6;
 
14865
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
14866
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
14867
      }// end loop over 'r'
 
14868
      for (unsigned int r = 0; r < 2; r++)
 
14869
      {
 
14870
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
14871
        ss = r*(r + 1)*(r + 2)/6;
 
14872
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
14873
      }// end loop over 'r'
 
14874
      for (unsigned int r = 0; r < 1; r++)
 
14875
      {
 
14876
        for (unsigned int s = 1; s < 2 - r; s++)
 
14877
        {
 
14878
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
14879
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14880
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
14881
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14882
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14883
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
14884
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
14885
        }// end loop over 's'
 
14886
      }// end loop over 'r'
 
14887
      for (unsigned int r = 0; r < 2; r++)
 
14888
      {
 
14889
        for (unsigned int s = 0; s < 2 - r; s++)
 
14890
        {
 
14891
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
14892
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
14893
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
14894
        }// end loop over 's'
 
14895
      }// end loop over 'r'
 
14896
      for (unsigned int r = 0; r < 1; r++)
 
14897
      {
 
14898
        for (unsigned int s = 0; s < 1 - r; s++)
 
14899
        {
 
14900
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
14901
          {
 
14902
            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;
 
14903
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14904
            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;
 
14905
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14906
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14907
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
14908
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
14909
          }// end loop over 't'
 
14910
        }// end loop over 's'
 
14911
      }// end loop over 'r'
 
14912
      for (unsigned int r = 0; r < 3; r++)
 
14913
      {
 
14914
        for (unsigned int s = 0; s < 3 - r; s++)
 
14915
        {
 
14916
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
14917
          {
 
14918
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
14919
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
14920
          }// end loop over 't'
 
14921
        }// end loop over 's'
 
14922
      }// end loop over 'r'
 
14923
      
 
14924
      // Table(s) of coefficients.
 
14925
      static const double coefficients0[10] = \
 
14926
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
14927
      
 
14928
      // Tables of derivatives of the polynomial base (transpose).
 
14929
      static const double dmats0[10][10] = \
 
14930
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14931
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14932
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14933
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14934
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14935
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14936
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14937
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14938
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14939
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14940
      
 
14941
      static const double dmats1[10][10] = \
 
14942
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14943
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14944
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14945
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14946
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14947
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14948
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14949
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14950
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14951
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14952
      
 
14953
      static const double dmats2[10][10] = \
 
14954
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14955
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14956
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14957
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14958
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14959
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14960
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14961
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14962
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14963
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
14964
      
 
14965
      // Compute reference derivatives.
 
14966
      // Declare pointer to array of derivatives on FIAT element.
 
14967
      double *derivatives = new double[num_derivatives];
 
14968
      for (unsigned int r = 0; r < num_derivatives; r++)
 
14969
      {
 
14970
        derivatives[r] = 0.000000000000000;
 
14971
      }// end loop over 'r'
 
14972
      
 
14973
      // Declare derivative matrix (of polynomial basis).
 
14974
      double dmats[10][10] = \
 
14975
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14976
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14977
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14978
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14979
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14980
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14981
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14982
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14983
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14984
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14985
      
 
14986
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
14987
      double dmats_old[10][10] = \
 
14988
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14989
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14990
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14991
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14992
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14993
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14994
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
14995
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
14996
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
14997
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
14998
      
 
14999
      // Loop possible derivatives.
 
15000
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15001
      {
 
15002
        // Resetting dmats values to compute next derivative.
 
15003
        for (unsigned int t = 0; t < 10; t++)
 
15004
        {
 
15005
          for (unsigned int u = 0; u < 10; u++)
 
15006
          {
 
15007
            dmats[t][u] = 0.000000000000000;
 
15008
            if (t == u)
 
15009
            {
 
15010
            dmats[t][u] = 1.000000000000000;
 
15011
            }
 
15012
            
 
15013
          }// end loop over 'u'
 
15014
        }// end loop over 't'
 
15015
        
 
15016
        // Looping derivative order to generate dmats.
 
15017
        for (unsigned int s = 0; s < n; s++)
 
15018
        {
 
15019
          // Updating dmats_old with new values and resetting dmats.
 
15020
          for (unsigned int t = 0; t < 10; t++)
 
15021
          {
 
15022
            for (unsigned int u = 0; u < 10; u++)
 
15023
            {
 
15024
              dmats_old[t][u] = dmats[t][u];
 
15025
              dmats[t][u] = 0.000000000000000;
 
15026
            }// end loop over 'u'
 
15027
          }// end loop over 't'
 
15028
          
 
15029
          // Update dmats using an inner product.
 
15030
          if (combinations[r][s] == 0)
 
15031
          {
 
15032
          for (unsigned int t = 0; t < 10; t++)
 
15033
          {
 
15034
            for (unsigned int u = 0; u < 10; u++)
 
15035
            {
 
15036
              for (unsigned int tu = 0; tu < 10; tu++)
 
15037
              {
 
15038
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
15039
              }// end loop over 'tu'
 
15040
            }// end loop over 'u'
 
15041
          }// end loop over 't'
 
15042
          }
 
15043
          
 
15044
          if (combinations[r][s] == 1)
 
15045
          {
 
15046
          for (unsigned int t = 0; t < 10; t++)
 
15047
          {
 
15048
            for (unsigned int u = 0; u < 10; u++)
 
15049
            {
 
15050
              for (unsigned int tu = 0; tu < 10; tu++)
 
15051
              {
 
15052
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
15053
              }// end loop over 'tu'
 
15054
            }// end loop over 'u'
 
15055
          }// end loop over 't'
 
15056
          }
 
15057
          
 
15058
          if (combinations[r][s] == 2)
 
15059
          {
 
15060
          for (unsigned int t = 0; t < 10; t++)
 
15061
          {
 
15062
            for (unsigned int u = 0; u < 10; u++)
 
15063
            {
 
15064
              for (unsigned int tu = 0; tu < 10; tu++)
 
15065
              {
 
15066
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
15067
              }// end loop over 'tu'
 
15068
            }// end loop over 'u'
 
15069
          }// end loop over 't'
 
15070
          }
 
15071
          
 
15072
        }// end loop over 's'
 
15073
        for (unsigned int s = 0; s < 10; s++)
 
15074
        {
 
15075
          for (unsigned int t = 0; t < 10; t++)
 
15076
          {
 
15077
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
15078
          }// end loop over 't'
 
15079
        }// end loop over 's'
 
15080
      }// end loop over 'r'
 
15081
      
 
15082
      // Transform derivatives back to physical element
 
15083
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15084
      {
 
15085
        for (unsigned int s = 0; s < num_derivatives; s++)
 
15086
        {
 
15087
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
15088
        }// end loop over 's'
 
15089
      }// end loop over 'r'
 
15090
      
 
15091
      // Delete pointer to array of derivatives on FIAT element
 
15092
      delete [] derivatives;
 
15093
      
 
15094
      // Delete pointer to array of combinations of derivatives and transform
 
15095
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15096
      {
 
15097
        delete [] combinations[r];
 
15098
      }// end loop over 'r'
 
15099
      delete [] combinations;
 
15100
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15101
      {
 
15102
        delete [] transform[r];
 
15103
      }// end loop over 'r'
 
15104
      delete [] transform;
 
15105
        break;
 
15106
      }
 
15107
    case 29:
 
15108
      {
 
15109
        
 
15110
      // Array of basisvalues.
 
15111
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
15112
      
 
15113
      // Declare helper variables.
 
15114
      unsigned int rr = 0;
 
15115
      unsigned int ss = 0;
 
15116
      unsigned int tt = 0;
 
15117
      double tmp5 = 0.000000000000000;
 
15118
      double tmp6 = 0.000000000000000;
 
15119
      double tmp7 = 0.000000000000000;
 
15120
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
15121
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
15122
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
15123
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
15124
      double tmp4 = tmp3*tmp3;
 
15125
      
 
15126
      // Compute basisvalues.
 
15127
      basisvalues[0] = 1.000000000000000;
 
15128
      basisvalues[1] = tmp0;
 
15129
      for (unsigned int r = 1; r < 2; r++)
 
15130
      {
 
15131
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
15132
        ss = r*(r + 1)*(r + 2)/6;
 
15133
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
15134
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
15135
      }// end loop over 'r'
 
15136
      for (unsigned int r = 0; r < 2; r++)
 
15137
      {
 
15138
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
15139
        ss = r*(r + 1)*(r + 2)/6;
 
15140
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
15141
      }// end loop over 'r'
 
15142
      for (unsigned int r = 0; r < 1; r++)
 
15143
      {
 
15144
        for (unsigned int s = 1; s < 2 - r; s++)
 
15145
        {
 
15146
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
15147
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
15148
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
15149
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
15150
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
15151
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
15152
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
15153
        }// end loop over 's'
 
15154
      }// end loop over 'r'
 
15155
      for (unsigned int r = 0; r < 2; r++)
 
15156
      {
 
15157
        for (unsigned int s = 0; s < 2 - r; s++)
 
15158
        {
 
15159
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
15160
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
15161
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
15162
        }// end loop over 's'
 
15163
      }// end loop over 'r'
 
15164
      for (unsigned int r = 0; r < 1; r++)
 
15165
      {
 
15166
        for (unsigned int s = 0; s < 1 - r; s++)
 
15167
        {
 
15168
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
15169
          {
 
15170
            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;
 
15171
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
15172
            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;
 
15173
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
15174
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
15175
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
15176
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
15177
          }// end loop over 't'
 
15178
        }// end loop over 's'
 
15179
      }// end loop over 'r'
 
15180
      for (unsigned int r = 0; r < 3; r++)
 
15181
      {
 
15182
        for (unsigned int s = 0; s < 3 - r; s++)
 
15183
        {
 
15184
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
15185
          {
 
15186
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
15187
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
15188
          }// end loop over 't'
 
15189
        }// end loop over 's'
 
15190
      }// end loop over 'r'
 
15191
      
 
15192
      // Table(s) of coefficients.
 
15193
      static const double coefficients0[10] = \
 
15194
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
15195
      
 
15196
      // Tables of derivatives of the polynomial base (transpose).
 
15197
      static const double dmats0[10][10] = \
 
15198
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15199
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15200
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15201
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15202
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15203
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15204
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15205
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15206
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15207
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
15208
      
 
15209
      static const double dmats1[10][10] = \
 
15210
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15211
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15212
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15213
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15214
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15215
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15216
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15217
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15218
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15219
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
15220
      
 
15221
      static const double dmats2[10][10] = \
 
15222
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15223
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15224
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15225
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15226
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15227
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15228
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15229
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15230
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15231
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
15232
      
 
15233
      // Compute reference derivatives.
 
15234
      // Declare pointer to array of derivatives on FIAT element.
 
15235
      double *derivatives = new double[num_derivatives];
 
15236
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15237
      {
 
15238
        derivatives[r] = 0.000000000000000;
 
15239
      }// end loop over 'r'
 
15240
      
 
15241
      // Declare derivative matrix (of polynomial basis).
 
15242
      double dmats[10][10] = \
 
15243
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15244
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15245
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15246
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15247
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15248
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15249
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15250
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
15251
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
15252
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
15253
      
 
15254
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
15255
      double dmats_old[10][10] = \
 
15256
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15257
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15258
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15259
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15260
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15261
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15262
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
15263
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
15264
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
15265
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
15266
      
 
15267
      // Loop possible derivatives.
 
15268
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15269
      {
 
15270
        // Resetting dmats values to compute next derivative.
 
15271
        for (unsigned int t = 0; t < 10; t++)
 
15272
        {
 
15273
          for (unsigned int u = 0; u < 10; u++)
 
15274
          {
 
15275
            dmats[t][u] = 0.000000000000000;
 
15276
            if (t == u)
 
15277
            {
 
15278
            dmats[t][u] = 1.000000000000000;
 
15279
            }
 
15280
            
 
15281
          }// end loop over 'u'
 
15282
        }// end loop over 't'
 
15283
        
 
15284
        // Looping derivative order to generate dmats.
 
15285
        for (unsigned int s = 0; s < n; s++)
 
15286
        {
 
15287
          // Updating dmats_old with new values and resetting dmats.
 
15288
          for (unsigned int t = 0; t < 10; t++)
 
15289
          {
 
15290
            for (unsigned int u = 0; u < 10; u++)
 
15291
            {
 
15292
              dmats_old[t][u] = dmats[t][u];
 
15293
              dmats[t][u] = 0.000000000000000;
 
15294
            }// end loop over 'u'
 
15295
          }// end loop over 't'
 
15296
          
 
15297
          // Update dmats using an inner product.
 
15298
          if (combinations[r][s] == 0)
 
15299
          {
 
15300
          for (unsigned int t = 0; t < 10; t++)
 
15301
          {
 
15302
            for (unsigned int u = 0; u < 10; u++)
 
15303
            {
 
15304
              for (unsigned int tu = 0; tu < 10; tu++)
 
15305
              {
 
15306
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
15307
              }// end loop over 'tu'
 
15308
            }// end loop over 'u'
 
15309
          }// end loop over 't'
 
15310
          }
 
15311
          
 
15312
          if (combinations[r][s] == 1)
 
15313
          {
 
15314
          for (unsigned int t = 0; t < 10; t++)
 
15315
          {
 
15316
            for (unsigned int u = 0; u < 10; u++)
 
15317
            {
 
15318
              for (unsigned int tu = 0; tu < 10; tu++)
 
15319
              {
 
15320
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
15321
              }// end loop over 'tu'
 
15322
            }// end loop over 'u'
 
15323
          }// end loop over 't'
 
15324
          }
 
15325
          
 
15326
          if (combinations[r][s] == 2)
 
15327
          {
 
15328
          for (unsigned int t = 0; t < 10; t++)
 
15329
          {
 
15330
            for (unsigned int u = 0; u < 10; u++)
 
15331
            {
 
15332
              for (unsigned int tu = 0; tu < 10; tu++)
 
15333
              {
 
15334
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
15335
              }// end loop over 'tu'
 
15336
            }// end loop over 'u'
 
15337
          }// end loop over 't'
 
15338
          }
 
15339
          
 
15340
        }// end loop over 's'
 
15341
        for (unsigned int s = 0; s < 10; s++)
 
15342
        {
 
15343
          for (unsigned int t = 0; t < 10; t++)
 
15344
          {
 
15345
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
15346
          }// end loop over 't'
 
15347
        }// end loop over 's'
 
15348
      }// end loop over 'r'
 
15349
      
 
15350
      // Transform derivatives back to physical element
 
15351
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15352
      {
 
15353
        for (unsigned int s = 0; s < num_derivatives; s++)
 
15354
        {
 
15355
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
15356
        }// end loop over 's'
 
15357
      }// end loop over 'r'
 
15358
      
 
15359
      // Delete pointer to array of derivatives on FIAT element
 
15360
      delete [] derivatives;
 
15361
      
 
15362
      // Delete pointer to array of combinations of derivatives and transform
 
15363
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15364
      {
 
15365
        delete [] combinations[r];
 
15366
      }// end loop over 'r'
 
15367
      delete [] combinations;
 
15368
      for (unsigned int r = 0; r < num_derivatives; r++)
 
15369
      {
 
15370
        delete [] transform[r];
 
15371
      }// end loop over 'r'
 
15372
      delete [] transform;
 
15373
        break;
 
15374
      }
 
15375
    }
 
15376
    
 
15377
  }
 
15378
 
 
15379
  /// Evaluate order n derivatives of all basis functions at given point in cell
 
15380
  virtual void evaluate_basis_derivatives_all(unsigned int n,
 
15381
                                              double* values,
 
15382
                                              const double* coordinates,
 
15383
                                              const ufc::cell& c) const
 
15384
  {
 
15385
    // Compute number of derivatives.
 
15386
    unsigned int num_derivatives = 1;
 
15387
    for (unsigned int r = 0; r < n; r++)
 
15388
    {
 
15389
      num_derivatives *= 3;
 
15390
    }// end loop over 'r'
 
15391
    
 
15392
    // Helper variable to hold values of a single dof.
 
15393
    double *dof_values = new double[3*num_derivatives];
 
15394
    for (unsigned int r = 0; r < 3*num_derivatives; r++)
 
15395
    {
 
15396
      dof_values[r] = 0.000000000000000;
 
15397
    }// end loop over 'r'
 
15398
    
 
15399
    // Loop dofs and call evaluate_basis_derivatives.
 
15400
    for (unsigned int r = 0; r < 30; r++)
 
15401
    {
 
15402
      evaluate_basis_derivatives(r, n, dof_values, coordinates, c);
 
15403
      for (unsigned int s = 0; s < 3*num_derivatives; s++)
 
15404
      {
 
15405
        values[r*3*num_derivatives + s] = dof_values[s];
 
15406
      }// end loop over 's'
 
15407
    }// end loop over 'r'
 
15408
    
 
15409
    // Delete pointer.
 
15410
    delete [] dof_values;
 
15411
  }
 
15412
 
 
15413
  /// Evaluate linear functional for dof i on the function f
 
15414
  virtual double evaluate_dof(unsigned int i,
 
15415
                              const ufc::function& f,
 
15416
                              const ufc::cell& c) const
 
15417
  {
 
15418
    // Declare variables for result of evaluation.
 
15419
    double vals[3];
 
15420
    
 
15421
    // Declare variable for physical coordinates.
 
15422
    double y[3];
 
15423
    const double * const * x = c.coordinates;
 
15424
    switch (i)
 
15425
    {
 
15426
    case 0:
 
15427
      {
 
15428
        y[0] = x[0][0];
 
15429
      y[1] = x[0][1];
 
15430
      y[2] = x[0][2];
 
15431
      f.evaluate(vals, y, c);
 
15432
      return vals[0];
 
15433
        break;
 
15434
      }
 
15435
    case 1:
 
15436
      {
 
15437
        y[0] = x[1][0];
 
15438
      y[1] = x[1][1];
 
15439
      y[2] = x[1][2];
 
15440
      f.evaluate(vals, y, c);
 
15441
      return vals[0];
 
15442
        break;
 
15443
      }
 
15444
    case 2:
 
15445
      {
 
15446
        y[0] = x[2][0];
 
15447
      y[1] = x[2][1];
 
15448
      y[2] = x[2][2];
 
15449
      f.evaluate(vals, y, c);
 
15450
      return vals[0];
 
15451
        break;
 
15452
      }
 
15453
    case 3:
 
15454
      {
 
15455
        y[0] = x[3][0];
 
15456
      y[1] = x[3][1];
 
15457
      y[2] = x[3][2];
 
15458
      f.evaluate(vals, y, c);
 
15459
      return vals[0];
 
15460
        break;
 
15461
      }
 
15462
    case 4:
 
15463
      {
 
15464
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
15465
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
15466
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
15467
      f.evaluate(vals, y, c);
 
15468
      return vals[0];
 
15469
        break;
 
15470
      }
 
15471
    case 5:
 
15472
      {
 
15473
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
15474
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
15475
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
15476
      f.evaluate(vals, y, c);
 
15477
      return vals[0];
 
15478
        break;
 
15479
      }
 
15480
    case 6:
 
15481
      {
 
15482
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
15483
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
15484
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
15485
      f.evaluate(vals, y, c);
 
15486
      return vals[0];
 
15487
        break;
 
15488
      }
 
15489
    case 7:
 
15490
      {
 
15491
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
15492
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
15493
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
15494
      f.evaluate(vals, y, c);
 
15495
      return vals[0];
 
15496
        break;
 
15497
      }
 
15498
    case 8:
 
15499
      {
 
15500
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
15501
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
15502
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
15503
      f.evaluate(vals, y, c);
 
15504
      return vals[0];
 
15505
        break;
 
15506
      }
 
15507
    case 9:
 
15508
      {
 
15509
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
15510
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
15511
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
15512
      f.evaluate(vals, y, c);
 
15513
      return vals[0];
 
15514
        break;
 
15515
      }
 
15516
    case 10:
 
15517
      {
 
15518
        y[0] = x[0][0];
 
15519
      y[1] = x[0][1];
 
15520
      y[2] = x[0][2];
 
15521
      f.evaluate(vals, y, c);
 
15522
      return vals[1];
 
15523
        break;
 
15524
      }
 
15525
    case 11:
 
15526
      {
 
15527
        y[0] = x[1][0];
 
15528
      y[1] = x[1][1];
 
15529
      y[2] = x[1][2];
 
15530
      f.evaluate(vals, y, c);
 
15531
      return vals[1];
 
15532
        break;
 
15533
      }
 
15534
    case 12:
 
15535
      {
 
15536
        y[0] = x[2][0];
 
15537
      y[1] = x[2][1];
 
15538
      y[2] = x[2][2];
 
15539
      f.evaluate(vals, y, c);
 
15540
      return vals[1];
 
15541
        break;
 
15542
      }
 
15543
    case 13:
 
15544
      {
 
15545
        y[0] = x[3][0];
 
15546
      y[1] = x[3][1];
 
15547
      y[2] = x[3][2];
 
15548
      f.evaluate(vals, y, c);
 
15549
      return vals[1];
 
15550
        break;
 
15551
      }
 
15552
    case 14:
 
15553
      {
 
15554
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
15555
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
15556
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
15557
      f.evaluate(vals, y, c);
 
15558
      return vals[1];
 
15559
        break;
 
15560
      }
 
15561
    case 15:
 
15562
      {
 
15563
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
15564
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
15565
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
15566
      f.evaluate(vals, y, c);
 
15567
      return vals[1];
 
15568
        break;
 
15569
      }
 
15570
    case 16:
 
15571
      {
 
15572
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
15573
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
15574
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
15575
      f.evaluate(vals, y, c);
 
15576
      return vals[1];
 
15577
        break;
 
15578
      }
 
15579
    case 17:
 
15580
      {
 
15581
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
15582
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
15583
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
15584
      f.evaluate(vals, y, c);
 
15585
      return vals[1];
 
15586
        break;
 
15587
      }
 
15588
    case 18:
 
15589
      {
 
15590
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
15591
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
15592
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
15593
      f.evaluate(vals, y, c);
 
15594
      return vals[1];
 
15595
        break;
 
15596
      }
 
15597
    case 19:
 
15598
      {
 
15599
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
15600
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
15601
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
15602
      f.evaluate(vals, y, c);
 
15603
      return vals[1];
 
15604
        break;
 
15605
      }
 
15606
    case 20:
 
15607
      {
 
15608
        y[0] = x[0][0];
 
15609
      y[1] = x[0][1];
 
15610
      y[2] = x[0][2];
 
15611
      f.evaluate(vals, y, c);
 
15612
      return vals[2];
 
15613
        break;
 
15614
      }
 
15615
    case 21:
 
15616
      {
 
15617
        y[0] = x[1][0];
 
15618
      y[1] = x[1][1];
 
15619
      y[2] = x[1][2];
 
15620
      f.evaluate(vals, y, c);
 
15621
      return vals[2];
 
15622
        break;
 
15623
      }
 
15624
    case 22:
 
15625
      {
 
15626
        y[0] = x[2][0];
 
15627
      y[1] = x[2][1];
 
15628
      y[2] = x[2][2];
 
15629
      f.evaluate(vals, y, c);
 
15630
      return vals[2];
 
15631
        break;
 
15632
      }
 
15633
    case 23:
 
15634
      {
 
15635
        y[0] = x[3][0];
 
15636
      y[1] = x[3][1];
 
15637
      y[2] = x[3][2];
 
15638
      f.evaluate(vals, y, c);
 
15639
      return vals[2];
 
15640
        break;
 
15641
      }
 
15642
    case 24:
 
15643
      {
 
15644
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
15645
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
15646
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
15647
      f.evaluate(vals, y, c);
 
15648
      return vals[2];
 
15649
        break;
 
15650
      }
 
15651
    case 25:
 
15652
      {
 
15653
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
15654
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
15655
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
15656
      f.evaluate(vals, y, c);
 
15657
      return vals[2];
 
15658
        break;
 
15659
      }
 
15660
    case 26:
 
15661
      {
 
15662
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
15663
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
15664
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
15665
      f.evaluate(vals, y, c);
 
15666
      return vals[2];
 
15667
        break;
 
15668
      }
 
15669
    case 27:
 
15670
      {
 
15671
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
15672
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
15673
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
15674
      f.evaluate(vals, y, c);
 
15675
      return vals[2];
 
15676
        break;
 
15677
      }
 
15678
    case 28:
 
15679
      {
 
15680
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
15681
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
15682
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
15683
      f.evaluate(vals, y, c);
 
15684
      return vals[2];
 
15685
        break;
 
15686
      }
 
15687
    case 29:
 
15688
      {
 
15689
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
15690
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
15691
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
15692
      f.evaluate(vals, y, c);
 
15693
      return vals[2];
 
15694
        break;
 
15695
      }
 
15696
    }
 
15697
    
 
15698
    return 0.000000000000000;
 
15699
  }
 
15700
 
 
15701
  /// Evaluate linear functionals for all dofs on the function f
 
15702
  virtual void evaluate_dofs(double* values,
 
15703
                             const ufc::function& f,
 
15704
                             const ufc::cell& c) const
 
15705
  {
 
15706
    // Declare variables for result of evaluation.
 
15707
    double vals[3];
 
15708
    
 
15709
    // Declare variable for physical coordinates.
 
15710
    double y[3];
 
15711
    const double * const * x = c.coordinates;
 
15712
    y[0] = x[0][0];
 
15713
    y[1] = x[0][1];
 
15714
    y[2] = x[0][2];
 
15715
    f.evaluate(vals, y, c);
 
15716
    values[0] = vals[0];
 
15717
    y[0] = x[1][0];
 
15718
    y[1] = x[1][1];
 
15719
    y[2] = x[1][2];
 
15720
    f.evaluate(vals, y, c);
 
15721
    values[1] = vals[0];
 
15722
    y[0] = x[2][0];
 
15723
    y[1] = x[2][1];
 
15724
    y[2] = x[2][2];
 
15725
    f.evaluate(vals, y, c);
 
15726
    values[2] = vals[0];
 
15727
    y[0] = x[3][0];
 
15728
    y[1] = x[3][1];
 
15729
    y[2] = x[3][2];
 
15730
    f.evaluate(vals, y, c);
 
15731
    values[3] = vals[0];
 
15732
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
15733
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
15734
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
15735
    f.evaluate(vals, y, c);
 
15736
    values[4] = vals[0];
 
15737
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
15738
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
15739
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
15740
    f.evaluate(vals, y, c);
 
15741
    values[5] = vals[0];
 
15742
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
15743
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
15744
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
15745
    f.evaluate(vals, y, c);
 
15746
    values[6] = vals[0];
 
15747
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
15748
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
15749
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
15750
    f.evaluate(vals, y, c);
 
15751
    values[7] = vals[0];
 
15752
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
15753
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
15754
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
15755
    f.evaluate(vals, y, c);
 
15756
    values[8] = vals[0];
 
15757
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
15758
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
15759
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
15760
    f.evaluate(vals, y, c);
 
15761
    values[9] = vals[0];
 
15762
    y[0] = x[0][0];
 
15763
    y[1] = x[0][1];
 
15764
    y[2] = x[0][2];
 
15765
    f.evaluate(vals, y, c);
 
15766
    values[10] = vals[1];
 
15767
    y[0] = x[1][0];
 
15768
    y[1] = x[1][1];
 
15769
    y[2] = x[1][2];
 
15770
    f.evaluate(vals, y, c);
 
15771
    values[11] = vals[1];
 
15772
    y[0] = x[2][0];
 
15773
    y[1] = x[2][1];
 
15774
    y[2] = x[2][2];
 
15775
    f.evaluate(vals, y, c);
 
15776
    values[12] = vals[1];
 
15777
    y[0] = x[3][0];
 
15778
    y[1] = x[3][1];
 
15779
    y[2] = x[3][2];
 
15780
    f.evaluate(vals, y, c);
 
15781
    values[13] = vals[1];
 
15782
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
15783
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
15784
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
15785
    f.evaluate(vals, y, c);
 
15786
    values[14] = vals[1];
 
15787
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
15788
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
15789
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
15790
    f.evaluate(vals, y, c);
 
15791
    values[15] = vals[1];
 
15792
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
15793
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
15794
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
15795
    f.evaluate(vals, y, c);
 
15796
    values[16] = vals[1];
 
15797
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
15798
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
15799
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
15800
    f.evaluate(vals, y, c);
 
15801
    values[17] = vals[1];
 
15802
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
15803
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
15804
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
15805
    f.evaluate(vals, y, c);
 
15806
    values[18] = vals[1];
 
15807
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
15808
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
15809
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
15810
    f.evaluate(vals, y, c);
 
15811
    values[19] = vals[1];
 
15812
    y[0] = x[0][0];
 
15813
    y[1] = x[0][1];
 
15814
    y[2] = x[0][2];
 
15815
    f.evaluate(vals, y, c);
 
15816
    values[20] = vals[2];
 
15817
    y[0] = x[1][0];
 
15818
    y[1] = x[1][1];
 
15819
    y[2] = x[1][2];
 
15820
    f.evaluate(vals, y, c);
 
15821
    values[21] = vals[2];
 
15822
    y[0] = x[2][0];
 
15823
    y[1] = x[2][1];
 
15824
    y[2] = x[2][2];
 
15825
    f.evaluate(vals, y, c);
 
15826
    values[22] = vals[2];
 
15827
    y[0] = x[3][0];
 
15828
    y[1] = x[3][1];
 
15829
    y[2] = x[3][2];
 
15830
    f.evaluate(vals, y, c);
 
15831
    values[23] = vals[2];
 
15832
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
15833
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
15834
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
15835
    f.evaluate(vals, y, c);
 
15836
    values[24] = vals[2];
 
15837
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
15838
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
15839
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
15840
    f.evaluate(vals, y, c);
 
15841
    values[25] = vals[2];
 
15842
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
15843
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
15844
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
15845
    f.evaluate(vals, y, c);
 
15846
    values[26] = vals[2];
 
15847
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
15848
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
15849
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
15850
    f.evaluate(vals, y, c);
 
15851
    values[27] = vals[2];
 
15852
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
15853
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
15854
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
15855
    f.evaluate(vals, y, c);
 
15856
    values[28] = vals[2];
 
15857
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
15858
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
15859
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
15860
    f.evaluate(vals, y, c);
 
15861
    values[29] = vals[2];
 
15862
  }
 
15863
 
 
15864
  /// Interpolate vertex values from dof values
 
15865
  virtual void interpolate_vertex_values(double* vertex_values,
 
15866
                                         const double* dof_values,
 
15867
                                         const ufc::cell& c) const
 
15868
  {
 
15869
    // Evaluate function and change variables
 
15870
    vertex_values[0] = dof_values[0];
 
15871
    vertex_values[3] = dof_values[1];
 
15872
    vertex_values[6] = dof_values[2];
 
15873
    vertex_values[9] = dof_values[3];
 
15874
    // Evaluate function and change variables
 
15875
    vertex_values[1] = dof_values[10];
 
15876
    vertex_values[4] = dof_values[11];
 
15877
    vertex_values[7] = dof_values[12];
 
15878
    vertex_values[10] = dof_values[13];
 
15879
    // Evaluate function and change variables
 
15880
    vertex_values[2] = dof_values[20];
 
15881
    vertex_values[5] = dof_values[21];
 
15882
    vertex_values[8] = dof_values[22];
 
15883
    vertex_values[11] = dof_values[23];
 
15884
  }
 
15885
 
 
15886
  /// Map coordinate xhat from reference cell to coordinate x in cell
 
15887
  virtual void map_from_reference_cell(double* x,
 
15888
                                       const double* xhat,
 
15889
                                       const ufc::cell& c)
 
15890
  {
 
15891
    throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0).");
 
15892
  }
 
15893
 
 
15894
  /// Map from coordinate x in cell to coordinate xhat in reference cell
 
15895
  virtual void map_to_reference_cell(double* xhat,
 
15896
                                     const double* x,
 
15897
                                     const ufc::cell& c)
 
15898
  {
 
15899
    throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0).");
 
15900
  }
 
15901
 
 
15902
  /// Return the number of sub elements (for a mixed element)
 
15903
  virtual unsigned int num_sub_elements() const
 
15904
  {
 
15905
    return 3;
 
15906
  }
 
15907
 
 
15908
  /// Create a new finite element for sub element i (for a mixed element)
 
15909
  virtual ufc::finite_element* create_sub_element(unsigned int i) const
 
15910
  {
 
15911
    switch (i)
 
15912
    {
 
15913
    case 0:
 
15914
      {
 
15915
        return new stokes_finite_element_0();
 
15916
        break;
 
15917
      }
 
15918
    case 1:
 
15919
      {
 
15920
        return new stokes_finite_element_0();
 
15921
        break;
 
15922
      }
 
15923
    case 2:
 
15924
      {
 
15925
        return new stokes_finite_element_0();
 
15926
        break;
 
15927
      }
 
15928
    }
 
15929
    
 
15930
    return 0;
 
15931
  }
 
15932
 
 
15933
  /// Create a new class instance
 
15934
  virtual ufc::finite_element* create() const
 
15935
  {
 
15936
    return new stokes_finite_element_1();
 
15937
  }
 
15938
 
 
15939
};
 
15940
 
 
15941
/// This class defines the interface for a finite element.
 
15942
 
 
15943
class stokes_finite_element_2: public ufc::finite_element
 
15944
{
 
15945
public:
 
15946
 
 
15947
  /// Constructor
 
15948
  stokes_finite_element_2() : ufc::finite_element()
 
15949
  {
 
15950
    // Do nothing
 
15951
  }
 
15952
 
 
15953
  /// Destructor
 
15954
  virtual ~stokes_finite_element_2()
 
15955
  {
 
15956
    // Do nothing
 
15957
  }
 
15958
 
 
15959
  /// Return a string identifying the finite element
 
15960
  virtual const char* signature() const
 
15961
  {
 
15962
    return "FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)";
 
15963
  }
 
15964
 
 
15965
  /// Return the cell shape
 
15966
  virtual ufc::shape cell_shape() const
 
15967
  {
 
15968
    return ufc::tetrahedron;
 
15969
  }
 
15970
 
 
15971
  /// Return the topological dimension of the cell shape
 
15972
  virtual unsigned int topological_dimension() const
 
15973
  {
 
15974
    return 3;
 
15975
  }
 
15976
 
 
15977
  /// Return the geometric dimension of the cell shape
 
15978
  virtual unsigned int geometric_dimension() const
 
15979
  {
 
15980
    return 3;
 
15981
  }
 
15982
 
 
15983
  /// Return the dimension of the finite element function space
 
15984
  virtual unsigned int space_dimension() const
 
15985
  {
 
15986
    return 4;
 
15987
  }
 
15988
 
 
15989
  /// Return the rank of the value space
 
15990
  virtual unsigned int value_rank() const
 
15991
  {
 
15992
    return 0;
 
15993
  }
 
15994
 
 
15995
  /// Return the dimension of the value space for axis i
 
15996
  virtual unsigned int value_dimension(unsigned int i) const
 
15997
  {
 
15998
    return 1;
 
15999
  }
 
16000
 
 
16001
  /// Evaluate basis function i at given point in cell
 
16002
  virtual void evaluate_basis(unsigned int i,
 
16003
                              double* values,
 
16004
                              const double* coordinates,
 
16005
                              const ufc::cell& c) const
 
16006
  {
 
16007
    // Extract vertex coordinates
 
16008
    const double * const * x = c.coordinates;
 
16009
    
 
16010
    // Compute Jacobian of affine map from reference cell
 
16011
    const double J_00 = x[1][0] - x[0][0];
 
16012
    const double J_01 = x[2][0] - x[0][0];
 
16013
    const double J_02 = x[3][0] - x[0][0];
 
16014
    const double J_10 = x[1][1] - x[0][1];
 
16015
    const double J_11 = x[2][1] - x[0][1];
 
16016
    const double J_12 = x[3][1] - x[0][1];
 
16017
    const double J_20 = x[1][2] - x[0][2];
 
16018
    const double J_21 = x[2][2] - x[0][2];
 
16019
    const double J_22 = x[3][2] - x[0][2];
 
16020
    
 
16021
    // Compute sub determinants
 
16022
    const double d_00 = J_11*J_22 - J_12*J_21;
 
16023
    const double d_01 = J_12*J_20 - J_10*J_22;
 
16024
    const double d_02 = J_10*J_21 - J_11*J_20;
 
16025
    const double d_10 = J_02*J_21 - J_01*J_22;
 
16026
    const double d_11 = J_00*J_22 - J_02*J_20;
 
16027
    const double d_12 = J_01*J_20 - J_00*J_21;
 
16028
    const double d_20 = J_01*J_12 - J_02*J_11;
 
16029
    const double d_21 = J_02*J_10 - J_00*J_12;
 
16030
    const double d_22 = J_00*J_11 - J_01*J_10;
 
16031
    
 
16032
    // Compute determinant of Jacobian
 
16033
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
16034
    
 
16035
    // Compute inverse of Jacobian
 
16036
    
 
16037
    // Compute constants
 
16038
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
16039
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
16040
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
16041
    
 
16042
    // Get coordinates and map to the reference (FIAT) element
 
16043
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
16044
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
16045
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
16046
    
 
16047
    
 
16048
    // Reset values.
 
16049
    *values = 0.000000000000000;
 
16050
    switch (i)
 
16051
    {
 
16052
    case 0:
 
16053
      {
 
16054
        
 
16055
      // Array of basisvalues.
 
16056
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16057
      
 
16058
      // Declare helper variables.
 
16059
      unsigned int rr = 0;
 
16060
      unsigned int ss = 0;
 
16061
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16062
      
 
16063
      // Compute basisvalues.
 
16064
      basisvalues[0] = 1.000000000000000;
 
16065
      basisvalues[1] = tmp0;
 
16066
      for (unsigned int r = 0; r < 1; r++)
 
16067
      {
 
16068
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16069
        ss = r*(r + 1)*(r + 2)/6;
 
16070
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16071
      }// end loop over 'r'
 
16072
      for (unsigned int r = 0; r < 1; r++)
 
16073
      {
 
16074
        for (unsigned int s = 0; s < 1 - r; s++)
 
16075
        {
 
16076
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16077
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16078
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16079
        }// end loop over 's'
 
16080
      }// end loop over 'r'
 
16081
      for (unsigned int r = 0; r < 2; r++)
 
16082
      {
 
16083
        for (unsigned int s = 0; s < 2 - r; s++)
 
16084
        {
 
16085
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16086
          {
 
16087
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16088
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16089
          }// end loop over 't'
 
16090
        }// end loop over 's'
 
16091
      }// end loop over 'r'
 
16092
      
 
16093
      // Table(s) of coefficients.
 
16094
      static const double coefficients0[4] = \
 
16095
      {0.288675134594813, -0.182574185835055, -0.105409255338946, -0.074535599249993};
 
16096
      
 
16097
      // Compute value(s).
 
16098
      for (unsigned int r = 0; r < 4; r++)
 
16099
      {
 
16100
        *values += coefficients0[r]*basisvalues[r];
 
16101
      }// end loop over 'r'
 
16102
        break;
 
16103
      }
 
16104
    case 1:
 
16105
      {
 
16106
        
 
16107
      // Array of basisvalues.
 
16108
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16109
      
 
16110
      // Declare helper variables.
 
16111
      unsigned int rr = 0;
 
16112
      unsigned int ss = 0;
 
16113
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16114
      
 
16115
      // Compute basisvalues.
 
16116
      basisvalues[0] = 1.000000000000000;
 
16117
      basisvalues[1] = tmp0;
 
16118
      for (unsigned int r = 0; r < 1; r++)
 
16119
      {
 
16120
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16121
        ss = r*(r + 1)*(r + 2)/6;
 
16122
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16123
      }// end loop over 'r'
 
16124
      for (unsigned int r = 0; r < 1; r++)
 
16125
      {
 
16126
        for (unsigned int s = 0; s < 1 - r; s++)
 
16127
        {
 
16128
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16129
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16130
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16131
        }// end loop over 's'
 
16132
      }// end loop over 'r'
 
16133
      for (unsigned int r = 0; r < 2; r++)
 
16134
      {
 
16135
        for (unsigned int s = 0; s < 2 - r; s++)
 
16136
        {
 
16137
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16138
          {
 
16139
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16140
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16141
          }// end loop over 't'
 
16142
        }// end loop over 's'
 
16143
      }// end loop over 'r'
 
16144
      
 
16145
      // Table(s) of coefficients.
 
16146
      static const double coefficients0[4] = \
 
16147
      {0.288675134594813, 0.182574185835055, -0.105409255338946, -0.074535599249993};
 
16148
      
 
16149
      // Compute value(s).
 
16150
      for (unsigned int r = 0; r < 4; r++)
 
16151
      {
 
16152
        *values += coefficients0[r]*basisvalues[r];
 
16153
      }// end loop over 'r'
 
16154
        break;
 
16155
      }
 
16156
    case 2:
 
16157
      {
 
16158
        
 
16159
      // Array of basisvalues.
 
16160
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16161
      
 
16162
      // Declare helper variables.
 
16163
      unsigned int rr = 0;
 
16164
      unsigned int ss = 0;
 
16165
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16166
      
 
16167
      // Compute basisvalues.
 
16168
      basisvalues[0] = 1.000000000000000;
 
16169
      basisvalues[1] = tmp0;
 
16170
      for (unsigned int r = 0; r < 1; r++)
 
16171
      {
 
16172
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16173
        ss = r*(r + 1)*(r + 2)/6;
 
16174
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16175
      }// end loop over 'r'
 
16176
      for (unsigned int r = 0; r < 1; r++)
 
16177
      {
 
16178
        for (unsigned int s = 0; s < 1 - r; s++)
 
16179
        {
 
16180
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16181
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16182
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16183
        }// end loop over 's'
 
16184
      }// end loop over 'r'
 
16185
      for (unsigned int r = 0; r < 2; r++)
 
16186
      {
 
16187
        for (unsigned int s = 0; s < 2 - r; s++)
 
16188
        {
 
16189
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16190
          {
 
16191
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16192
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16193
          }// end loop over 't'
 
16194
        }// end loop over 's'
 
16195
      }// end loop over 'r'
 
16196
      
 
16197
      // Table(s) of coefficients.
 
16198
      static const double coefficients0[4] = \
 
16199
      {0.288675134594813, 0.000000000000000, 0.210818510677892, -0.074535599249993};
 
16200
      
 
16201
      // Compute value(s).
 
16202
      for (unsigned int r = 0; r < 4; r++)
 
16203
      {
 
16204
        *values += coefficients0[r]*basisvalues[r];
 
16205
      }// end loop over 'r'
 
16206
        break;
 
16207
      }
 
16208
    case 3:
 
16209
      {
 
16210
        
 
16211
      // Array of basisvalues.
 
16212
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16213
      
 
16214
      // Declare helper variables.
 
16215
      unsigned int rr = 0;
 
16216
      unsigned int ss = 0;
 
16217
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16218
      
 
16219
      // Compute basisvalues.
 
16220
      basisvalues[0] = 1.000000000000000;
 
16221
      basisvalues[1] = tmp0;
 
16222
      for (unsigned int r = 0; r < 1; r++)
 
16223
      {
 
16224
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16225
        ss = r*(r + 1)*(r + 2)/6;
 
16226
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16227
      }// end loop over 'r'
 
16228
      for (unsigned int r = 0; r < 1; r++)
 
16229
      {
 
16230
        for (unsigned int s = 0; s < 1 - r; s++)
 
16231
        {
 
16232
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16233
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16234
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16235
        }// end loop over 's'
 
16236
      }// end loop over 'r'
 
16237
      for (unsigned int r = 0; r < 2; r++)
 
16238
      {
 
16239
        for (unsigned int s = 0; s < 2 - r; s++)
 
16240
        {
 
16241
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16242
          {
 
16243
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16244
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16245
          }// end loop over 't'
 
16246
        }// end loop over 's'
 
16247
      }// end loop over 'r'
 
16248
      
 
16249
      // Table(s) of coefficients.
 
16250
      static const double coefficients0[4] = \
 
16251
      {0.288675134594813, 0.000000000000000, 0.000000000000000, 0.223606797749979};
 
16252
      
 
16253
      // Compute value(s).
 
16254
      for (unsigned int r = 0; r < 4; r++)
 
16255
      {
 
16256
        *values += coefficients0[r]*basisvalues[r];
 
16257
      }// end loop over 'r'
 
16258
        break;
 
16259
      }
 
16260
    }
 
16261
    
 
16262
  }
 
16263
 
 
16264
  /// Evaluate all basis functions at given point in cell
 
16265
  virtual void evaluate_basis_all(double* values,
 
16266
                                  const double* coordinates,
 
16267
                                  const ufc::cell& c) const
 
16268
  {
 
16269
    // Helper variable to hold values of a single dof.
 
16270
    double dof_values = 0.000000000000000;
 
16271
    
 
16272
    // Loop dofs and call evaluate_basis.
 
16273
    for (unsigned int r = 0; r < 4; r++)
 
16274
    {
 
16275
      evaluate_basis(r, &dof_values, coordinates, c);
 
16276
      values[r] = dof_values;
 
16277
    }// end loop over 'r'
 
16278
  }
 
16279
 
 
16280
  /// Evaluate order n derivatives of basis function i at given point in cell
 
16281
  virtual void evaluate_basis_derivatives(unsigned int i,
 
16282
                                          unsigned int n,
 
16283
                                          double* values,
 
16284
                                          const double* coordinates,
 
16285
                                          const ufc::cell& c) const
 
16286
  {
 
16287
    // Extract vertex coordinates
 
16288
    const double * const * x = c.coordinates;
 
16289
    
 
16290
    // Compute Jacobian of affine map from reference cell
 
16291
    const double J_00 = x[1][0] - x[0][0];
 
16292
    const double J_01 = x[2][0] - x[0][0];
 
16293
    const double J_02 = x[3][0] - x[0][0];
 
16294
    const double J_10 = x[1][1] - x[0][1];
 
16295
    const double J_11 = x[2][1] - x[0][1];
 
16296
    const double J_12 = x[3][1] - x[0][1];
 
16297
    const double J_20 = x[1][2] - x[0][2];
 
16298
    const double J_21 = x[2][2] - x[0][2];
 
16299
    const double J_22 = x[3][2] - x[0][2];
 
16300
    
 
16301
    // Compute sub determinants
 
16302
    const double d_00 = J_11*J_22 - J_12*J_21;
 
16303
    const double d_01 = J_12*J_20 - J_10*J_22;
 
16304
    const double d_02 = J_10*J_21 - J_11*J_20;
 
16305
    const double d_10 = J_02*J_21 - J_01*J_22;
 
16306
    const double d_11 = J_00*J_22 - J_02*J_20;
 
16307
    const double d_12 = J_01*J_20 - J_00*J_21;
 
16308
    const double d_20 = J_01*J_12 - J_02*J_11;
 
16309
    const double d_21 = J_02*J_10 - J_00*J_12;
 
16310
    const double d_22 = J_00*J_11 - J_01*J_10;
 
16311
    
 
16312
    // Compute determinant of Jacobian
 
16313
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
16314
    
 
16315
    // Compute inverse of Jacobian
 
16316
    const double K_00 = d_00 / detJ;
 
16317
    const double K_01 = d_10 / detJ;
 
16318
    const double K_02 = d_20 / detJ;
 
16319
    const double K_10 = d_01 / detJ;
 
16320
    const double K_11 = d_11 / detJ;
 
16321
    const double K_12 = d_21 / detJ;
 
16322
    const double K_20 = d_02 / detJ;
 
16323
    const double K_21 = d_12 / detJ;
 
16324
    const double K_22 = d_22 / detJ;
 
16325
    
 
16326
    // Compute constants
 
16327
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
16328
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
16329
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
16330
    
 
16331
    // Get coordinates and map to the reference (FIAT) element
 
16332
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
16333
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
16334
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
16335
    
 
16336
    
 
16337
    // Compute number of derivatives.
 
16338
    unsigned int num_derivatives = 1;
 
16339
    for (unsigned int r = 0; r < n; r++)
 
16340
    {
 
16341
      num_derivatives *= 3;
 
16342
    }// end loop over 'r'
 
16343
    
 
16344
    // Declare pointer to two dimensional array that holds combinations of derivatives and initialise
 
16345
    unsigned int **combinations = new unsigned int *[num_derivatives];
 
16346
    for (unsigned int row = 0; row < num_derivatives; row++)
 
16347
    {
 
16348
      combinations[row] = new unsigned int [n];
 
16349
      for (unsigned int col = 0; col < n; col++)
 
16350
        combinations[row][col] = 0;
 
16351
    }
 
16352
    
 
16353
    // Generate combinations of derivatives
 
16354
    for (unsigned int row = 1; row < num_derivatives; row++)
 
16355
    {
 
16356
      for (unsigned int num = 0; num < row; num++)
 
16357
      {
 
16358
        for (unsigned int col = n-1; col+1 > 0; col--)
 
16359
        {
 
16360
          if (combinations[row][col] + 1 > 2)
 
16361
            combinations[row][col] = 0;
 
16362
          else
 
16363
          {
 
16364
            combinations[row][col] += 1;
 
16365
            break;
 
16366
          }
 
16367
        }
 
16368
      }
 
16369
    }
 
16370
    
 
16371
    // Compute inverse of Jacobian
 
16372
    const double Jinv[3][3] = {{K_00, K_01, K_02}, {K_10, K_11, K_12}, {K_20, K_21, K_22}};
 
16373
    
 
16374
    // Declare transformation matrix
 
16375
    // Declare pointer to two dimensional array and initialise
 
16376
    double **transform = new double *[num_derivatives];
 
16377
    
 
16378
    for (unsigned int j = 0; j < num_derivatives; j++)
 
16379
    {
 
16380
      transform[j] = new double [num_derivatives];
 
16381
      for (unsigned int k = 0; k < num_derivatives; k++)
 
16382
        transform[j][k] = 1;
 
16383
    }
 
16384
    
 
16385
    // Construct transformation matrix
 
16386
    for (unsigned int row = 0; row < num_derivatives; row++)
 
16387
    {
 
16388
      for (unsigned int col = 0; col < num_derivatives; col++)
 
16389
      {
 
16390
        for (unsigned int k = 0; k < n; k++)
 
16391
          transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
 
16392
      }
 
16393
    }
 
16394
    
 
16395
    // Reset values. Assuming that values is always an array.
 
16396
    for (unsigned int r = 0; r < num_derivatives; r++)
 
16397
    {
 
16398
      values[r] = 0.000000000000000;
 
16399
    }// end loop over 'r'
 
16400
    
 
16401
    switch (i)
 
16402
    {
 
16403
    case 0:
 
16404
      {
 
16405
        
 
16406
      // Array of basisvalues.
 
16407
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16408
      
 
16409
      // Declare helper variables.
 
16410
      unsigned int rr = 0;
 
16411
      unsigned int ss = 0;
 
16412
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16413
      
 
16414
      // Compute basisvalues.
 
16415
      basisvalues[0] = 1.000000000000000;
 
16416
      basisvalues[1] = tmp0;
 
16417
      for (unsigned int r = 0; r < 1; r++)
 
16418
      {
 
16419
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16420
        ss = r*(r + 1)*(r + 2)/6;
 
16421
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16422
      }// end loop over 'r'
 
16423
      for (unsigned int r = 0; r < 1; r++)
 
16424
      {
 
16425
        for (unsigned int s = 0; s < 1 - r; s++)
 
16426
        {
 
16427
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16428
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16429
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16430
        }// end loop over 's'
 
16431
      }// end loop over 'r'
 
16432
      for (unsigned int r = 0; r < 2; r++)
 
16433
      {
 
16434
        for (unsigned int s = 0; s < 2 - r; s++)
 
16435
        {
 
16436
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16437
          {
 
16438
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16439
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16440
          }// end loop over 't'
 
16441
        }// end loop over 's'
 
16442
      }// end loop over 'r'
 
16443
      
 
16444
      // Table(s) of coefficients.
 
16445
      static const double coefficients0[4] = \
 
16446
      {0.288675134594813, -0.182574185835055, -0.105409255338946, -0.074535599249993};
 
16447
      
 
16448
      // Tables of derivatives of the polynomial base (transpose).
 
16449
      static const double dmats0[4][4] = \
 
16450
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16451
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16452
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16453
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16454
      
 
16455
      static const double dmats1[4][4] = \
 
16456
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16457
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16458
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16459
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16460
      
 
16461
      static const double dmats2[4][4] = \
 
16462
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16463
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16464
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16465
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16466
      
 
16467
      // Compute reference derivatives.
 
16468
      // Declare pointer to array of derivatives on FIAT element.
 
16469
      double *derivatives = new double[num_derivatives];
 
16470
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16471
      {
 
16472
        derivatives[r] = 0.000000000000000;
 
16473
      }// end loop over 'r'
 
16474
      
 
16475
      // Declare derivative matrix (of polynomial basis).
 
16476
      double dmats[4][4] = \
 
16477
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16478
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
16479
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
16480
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
16481
      
 
16482
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16483
      double dmats_old[4][4] = \
 
16484
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16485
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
16486
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
16487
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
16488
      
 
16489
      // Loop possible derivatives.
 
16490
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16491
      {
 
16492
        // Resetting dmats values to compute next derivative.
 
16493
        for (unsigned int t = 0; t < 4; t++)
 
16494
        {
 
16495
          for (unsigned int u = 0; u < 4; u++)
 
16496
          {
 
16497
            dmats[t][u] = 0.000000000000000;
 
16498
            if (t == u)
 
16499
            {
 
16500
            dmats[t][u] = 1.000000000000000;
 
16501
            }
 
16502
            
 
16503
          }// end loop over 'u'
 
16504
        }// end loop over 't'
 
16505
        
 
16506
        // Looping derivative order to generate dmats.
 
16507
        for (unsigned int s = 0; s < n; s++)
 
16508
        {
 
16509
          // Updating dmats_old with new values and resetting dmats.
 
16510
          for (unsigned int t = 0; t < 4; t++)
 
16511
          {
 
16512
            for (unsigned int u = 0; u < 4; u++)
 
16513
            {
 
16514
              dmats_old[t][u] = dmats[t][u];
 
16515
              dmats[t][u] = 0.000000000000000;
 
16516
            }// end loop over 'u'
 
16517
          }// end loop over 't'
 
16518
          
 
16519
          // Update dmats using an inner product.
 
16520
          if (combinations[r][s] == 0)
 
16521
          {
 
16522
          for (unsigned int t = 0; t < 4; t++)
 
16523
          {
 
16524
            for (unsigned int u = 0; u < 4; u++)
 
16525
            {
 
16526
              for (unsigned int tu = 0; tu < 4; tu++)
 
16527
              {
 
16528
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
16529
              }// end loop over 'tu'
 
16530
            }// end loop over 'u'
 
16531
          }// end loop over 't'
 
16532
          }
 
16533
          
 
16534
          if (combinations[r][s] == 1)
 
16535
          {
 
16536
          for (unsigned int t = 0; t < 4; t++)
 
16537
          {
 
16538
            for (unsigned int u = 0; u < 4; u++)
 
16539
            {
 
16540
              for (unsigned int tu = 0; tu < 4; tu++)
 
16541
              {
 
16542
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
16543
              }// end loop over 'tu'
 
16544
            }// end loop over 'u'
 
16545
          }// end loop over 't'
 
16546
          }
 
16547
          
 
16548
          if (combinations[r][s] == 2)
 
16549
          {
 
16550
          for (unsigned int t = 0; t < 4; t++)
 
16551
          {
 
16552
            for (unsigned int u = 0; u < 4; u++)
 
16553
            {
 
16554
              for (unsigned int tu = 0; tu < 4; tu++)
 
16555
              {
 
16556
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
16557
              }// end loop over 'tu'
 
16558
            }// end loop over 'u'
 
16559
          }// end loop over 't'
 
16560
          }
 
16561
          
 
16562
        }// end loop over 's'
 
16563
        for (unsigned int s = 0; s < 4; s++)
 
16564
        {
 
16565
          for (unsigned int t = 0; t < 4; t++)
 
16566
          {
 
16567
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
16568
          }// end loop over 't'
 
16569
        }// end loop over 's'
 
16570
      }// end loop over 'r'
 
16571
      
 
16572
      // Transform derivatives back to physical element
 
16573
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16574
      {
 
16575
        for (unsigned int s = 0; s < num_derivatives; s++)
 
16576
        {
 
16577
          values[r] += transform[r][s]*derivatives[s];
 
16578
        }// end loop over 's'
 
16579
      }// end loop over 'r'
 
16580
      
 
16581
      // Delete pointer to array of derivatives on FIAT element
 
16582
      delete [] derivatives;
 
16583
      
 
16584
      // Delete pointer to array of combinations of derivatives and transform
 
16585
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16586
      {
 
16587
        delete [] combinations[r];
 
16588
      }// end loop over 'r'
 
16589
      delete [] combinations;
 
16590
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16591
      {
 
16592
        delete [] transform[r];
 
16593
      }// end loop over 'r'
 
16594
      delete [] transform;
 
16595
        break;
 
16596
      }
 
16597
    case 1:
 
16598
      {
 
16599
        
 
16600
      // Array of basisvalues.
 
16601
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16602
      
 
16603
      // Declare helper variables.
 
16604
      unsigned int rr = 0;
 
16605
      unsigned int ss = 0;
 
16606
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16607
      
 
16608
      // Compute basisvalues.
 
16609
      basisvalues[0] = 1.000000000000000;
 
16610
      basisvalues[1] = tmp0;
 
16611
      for (unsigned int r = 0; r < 1; r++)
 
16612
      {
 
16613
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16614
        ss = r*(r + 1)*(r + 2)/6;
 
16615
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16616
      }// end loop over 'r'
 
16617
      for (unsigned int r = 0; r < 1; r++)
 
16618
      {
 
16619
        for (unsigned int s = 0; s < 1 - r; s++)
 
16620
        {
 
16621
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16622
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16623
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16624
        }// end loop over 's'
 
16625
      }// end loop over 'r'
 
16626
      for (unsigned int r = 0; r < 2; r++)
 
16627
      {
 
16628
        for (unsigned int s = 0; s < 2 - r; s++)
 
16629
        {
 
16630
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16631
          {
 
16632
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16633
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16634
          }// end loop over 't'
 
16635
        }// end loop over 's'
 
16636
      }// end loop over 'r'
 
16637
      
 
16638
      // Table(s) of coefficients.
 
16639
      static const double coefficients0[4] = \
 
16640
      {0.288675134594813, 0.182574185835055, -0.105409255338946, -0.074535599249993};
 
16641
      
 
16642
      // Tables of derivatives of the polynomial base (transpose).
 
16643
      static const double dmats0[4][4] = \
 
16644
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16645
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16646
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16647
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16648
      
 
16649
      static const double dmats1[4][4] = \
 
16650
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16651
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16652
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16653
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16654
      
 
16655
      static const double dmats2[4][4] = \
 
16656
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16657
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16658
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16659
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16660
      
 
16661
      // Compute reference derivatives.
 
16662
      // Declare pointer to array of derivatives on FIAT element.
 
16663
      double *derivatives = new double[num_derivatives];
 
16664
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16665
      {
 
16666
        derivatives[r] = 0.000000000000000;
 
16667
      }// end loop over 'r'
 
16668
      
 
16669
      // Declare derivative matrix (of polynomial basis).
 
16670
      double dmats[4][4] = \
 
16671
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16672
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
16673
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
16674
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
16675
      
 
16676
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16677
      double dmats_old[4][4] = \
 
16678
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16679
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
16680
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
16681
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
16682
      
 
16683
      // Loop possible derivatives.
 
16684
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16685
      {
 
16686
        // Resetting dmats values to compute next derivative.
 
16687
        for (unsigned int t = 0; t < 4; t++)
 
16688
        {
 
16689
          for (unsigned int u = 0; u < 4; u++)
 
16690
          {
 
16691
            dmats[t][u] = 0.000000000000000;
 
16692
            if (t == u)
 
16693
            {
 
16694
            dmats[t][u] = 1.000000000000000;
 
16695
            }
 
16696
            
 
16697
          }// end loop over 'u'
 
16698
        }// end loop over 't'
 
16699
        
 
16700
        // Looping derivative order to generate dmats.
 
16701
        for (unsigned int s = 0; s < n; s++)
 
16702
        {
 
16703
          // Updating dmats_old with new values and resetting dmats.
 
16704
          for (unsigned int t = 0; t < 4; t++)
 
16705
          {
 
16706
            for (unsigned int u = 0; u < 4; u++)
 
16707
            {
 
16708
              dmats_old[t][u] = dmats[t][u];
 
16709
              dmats[t][u] = 0.000000000000000;
 
16710
            }// end loop over 'u'
 
16711
          }// end loop over 't'
 
16712
          
 
16713
          // Update dmats using an inner product.
 
16714
          if (combinations[r][s] == 0)
 
16715
          {
 
16716
          for (unsigned int t = 0; t < 4; t++)
 
16717
          {
 
16718
            for (unsigned int u = 0; u < 4; u++)
 
16719
            {
 
16720
              for (unsigned int tu = 0; tu < 4; tu++)
 
16721
              {
 
16722
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
16723
              }// end loop over 'tu'
 
16724
            }// end loop over 'u'
 
16725
          }// end loop over 't'
 
16726
          }
 
16727
          
 
16728
          if (combinations[r][s] == 1)
 
16729
          {
 
16730
          for (unsigned int t = 0; t < 4; t++)
 
16731
          {
 
16732
            for (unsigned int u = 0; u < 4; u++)
 
16733
            {
 
16734
              for (unsigned int tu = 0; tu < 4; tu++)
 
16735
              {
 
16736
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
16737
              }// end loop over 'tu'
 
16738
            }// end loop over 'u'
 
16739
          }// end loop over 't'
 
16740
          }
 
16741
          
 
16742
          if (combinations[r][s] == 2)
 
16743
          {
 
16744
          for (unsigned int t = 0; t < 4; t++)
 
16745
          {
 
16746
            for (unsigned int u = 0; u < 4; u++)
 
16747
            {
 
16748
              for (unsigned int tu = 0; tu < 4; tu++)
 
16749
              {
 
16750
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
16751
              }// end loop over 'tu'
 
16752
            }// end loop over 'u'
 
16753
          }// end loop over 't'
 
16754
          }
 
16755
          
 
16756
        }// end loop over 's'
 
16757
        for (unsigned int s = 0; s < 4; s++)
 
16758
        {
 
16759
          for (unsigned int t = 0; t < 4; t++)
 
16760
          {
 
16761
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
16762
          }// end loop over 't'
 
16763
        }// end loop over 's'
 
16764
      }// end loop over 'r'
 
16765
      
 
16766
      // Transform derivatives back to physical element
 
16767
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16768
      {
 
16769
        for (unsigned int s = 0; s < num_derivatives; s++)
 
16770
        {
 
16771
          values[r] += transform[r][s]*derivatives[s];
 
16772
        }// end loop over 's'
 
16773
      }// end loop over 'r'
 
16774
      
 
16775
      // Delete pointer to array of derivatives on FIAT element
 
16776
      delete [] derivatives;
 
16777
      
 
16778
      // Delete pointer to array of combinations of derivatives and transform
 
16779
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16780
      {
 
16781
        delete [] combinations[r];
 
16782
      }// end loop over 'r'
 
16783
      delete [] combinations;
 
16784
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16785
      {
 
16786
        delete [] transform[r];
 
16787
      }// end loop over 'r'
 
16788
      delete [] transform;
 
16789
        break;
 
16790
      }
 
16791
    case 2:
 
16792
      {
 
16793
        
 
16794
      // Array of basisvalues.
 
16795
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16796
      
 
16797
      // Declare helper variables.
 
16798
      unsigned int rr = 0;
 
16799
      unsigned int ss = 0;
 
16800
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16801
      
 
16802
      // Compute basisvalues.
 
16803
      basisvalues[0] = 1.000000000000000;
 
16804
      basisvalues[1] = tmp0;
 
16805
      for (unsigned int r = 0; r < 1; r++)
 
16806
      {
 
16807
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
16808
        ss = r*(r + 1)*(r + 2)/6;
 
16809
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
16810
      }// end loop over 'r'
 
16811
      for (unsigned int r = 0; r < 1; r++)
 
16812
      {
 
16813
        for (unsigned int s = 0; s < 1 - r; s++)
 
16814
        {
 
16815
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
16816
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
16817
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
16818
        }// end loop over 's'
 
16819
      }// end loop over 'r'
 
16820
      for (unsigned int r = 0; r < 2; r++)
 
16821
      {
 
16822
        for (unsigned int s = 0; s < 2 - r; s++)
 
16823
        {
 
16824
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
16825
          {
 
16826
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
16827
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
16828
          }// end loop over 't'
 
16829
        }// end loop over 's'
 
16830
      }// end loop over 'r'
 
16831
      
 
16832
      // Table(s) of coefficients.
 
16833
      static const double coefficients0[4] = \
 
16834
      {0.288675134594813, 0.000000000000000, 0.210818510677892, -0.074535599249993};
 
16835
      
 
16836
      // Tables of derivatives of the polynomial base (transpose).
 
16837
      static const double dmats0[4][4] = \
 
16838
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16839
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16840
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16841
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16842
      
 
16843
      static const double dmats1[4][4] = \
 
16844
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16845
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16846
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16847
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16848
      
 
16849
      static const double dmats2[4][4] = \
 
16850
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16851
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16852
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16853
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
16854
      
 
16855
      // Compute reference derivatives.
 
16856
      // Declare pointer to array of derivatives on FIAT element.
 
16857
      double *derivatives = new double[num_derivatives];
 
16858
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16859
      {
 
16860
        derivatives[r] = 0.000000000000000;
 
16861
      }// end loop over 'r'
 
16862
      
 
16863
      // Declare derivative matrix (of polynomial basis).
 
16864
      double dmats[4][4] = \
 
16865
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16866
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
16867
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
16868
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
16869
      
 
16870
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
16871
      double dmats_old[4][4] = \
 
16872
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
16873
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
16874
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
16875
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
16876
      
 
16877
      // Loop possible derivatives.
 
16878
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16879
      {
 
16880
        // Resetting dmats values to compute next derivative.
 
16881
        for (unsigned int t = 0; t < 4; t++)
 
16882
        {
 
16883
          for (unsigned int u = 0; u < 4; u++)
 
16884
          {
 
16885
            dmats[t][u] = 0.000000000000000;
 
16886
            if (t == u)
 
16887
            {
 
16888
            dmats[t][u] = 1.000000000000000;
 
16889
            }
 
16890
            
 
16891
          }// end loop over 'u'
 
16892
        }// end loop over 't'
 
16893
        
 
16894
        // Looping derivative order to generate dmats.
 
16895
        for (unsigned int s = 0; s < n; s++)
 
16896
        {
 
16897
          // Updating dmats_old with new values and resetting dmats.
 
16898
          for (unsigned int t = 0; t < 4; t++)
 
16899
          {
 
16900
            for (unsigned int u = 0; u < 4; u++)
 
16901
            {
 
16902
              dmats_old[t][u] = dmats[t][u];
 
16903
              dmats[t][u] = 0.000000000000000;
 
16904
            }// end loop over 'u'
 
16905
          }// end loop over 't'
 
16906
          
 
16907
          // Update dmats using an inner product.
 
16908
          if (combinations[r][s] == 0)
 
16909
          {
 
16910
          for (unsigned int t = 0; t < 4; t++)
 
16911
          {
 
16912
            for (unsigned int u = 0; u < 4; u++)
 
16913
            {
 
16914
              for (unsigned int tu = 0; tu < 4; tu++)
 
16915
              {
 
16916
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
16917
              }// end loop over 'tu'
 
16918
            }// end loop over 'u'
 
16919
          }// end loop over 't'
 
16920
          }
 
16921
          
 
16922
          if (combinations[r][s] == 1)
 
16923
          {
 
16924
          for (unsigned int t = 0; t < 4; t++)
 
16925
          {
 
16926
            for (unsigned int u = 0; u < 4; u++)
 
16927
            {
 
16928
              for (unsigned int tu = 0; tu < 4; tu++)
 
16929
              {
 
16930
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
16931
              }// end loop over 'tu'
 
16932
            }// end loop over 'u'
 
16933
          }// end loop over 't'
 
16934
          }
 
16935
          
 
16936
          if (combinations[r][s] == 2)
 
16937
          {
 
16938
          for (unsigned int t = 0; t < 4; t++)
 
16939
          {
 
16940
            for (unsigned int u = 0; u < 4; u++)
 
16941
            {
 
16942
              for (unsigned int tu = 0; tu < 4; tu++)
 
16943
              {
 
16944
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
16945
              }// end loop over 'tu'
 
16946
            }// end loop over 'u'
 
16947
          }// end loop over 't'
 
16948
          }
 
16949
          
 
16950
        }// end loop over 's'
 
16951
        for (unsigned int s = 0; s < 4; s++)
 
16952
        {
 
16953
          for (unsigned int t = 0; t < 4; t++)
 
16954
          {
 
16955
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
16956
          }// end loop over 't'
 
16957
        }// end loop over 's'
 
16958
      }// end loop over 'r'
 
16959
      
 
16960
      // Transform derivatives back to physical element
 
16961
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16962
      {
 
16963
        for (unsigned int s = 0; s < num_derivatives; s++)
 
16964
        {
 
16965
          values[r] += transform[r][s]*derivatives[s];
 
16966
        }// end loop over 's'
 
16967
      }// end loop over 'r'
 
16968
      
 
16969
      // Delete pointer to array of derivatives on FIAT element
 
16970
      delete [] derivatives;
 
16971
      
 
16972
      // Delete pointer to array of combinations of derivatives and transform
 
16973
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16974
      {
 
16975
        delete [] combinations[r];
 
16976
      }// end loop over 'r'
 
16977
      delete [] combinations;
 
16978
      for (unsigned int r = 0; r < num_derivatives; r++)
 
16979
      {
 
16980
        delete [] transform[r];
 
16981
      }// end loop over 'r'
 
16982
      delete [] transform;
 
16983
        break;
 
16984
      }
 
16985
    case 3:
 
16986
      {
 
16987
        
 
16988
      // Array of basisvalues.
 
16989
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
16990
      
 
16991
      // Declare helper variables.
 
16992
      unsigned int rr = 0;
 
16993
      unsigned int ss = 0;
 
16994
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
16995
      
 
16996
      // Compute basisvalues.
 
16997
      basisvalues[0] = 1.000000000000000;
 
16998
      basisvalues[1] = tmp0;
 
16999
      for (unsigned int r = 0; r < 1; r++)
 
17000
      {
 
17001
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17002
        ss = r*(r + 1)*(r + 2)/6;
 
17003
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17004
      }// end loop over 'r'
 
17005
      for (unsigned int r = 0; r < 1; r++)
 
17006
      {
 
17007
        for (unsigned int s = 0; s < 1 - r; s++)
 
17008
        {
 
17009
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17010
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17011
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
17012
        }// end loop over 's'
 
17013
      }// end loop over 'r'
 
17014
      for (unsigned int r = 0; r < 2; r++)
 
17015
      {
 
17016
        for (unsigned int s = 0; s < 2 - r; s++)
 
17017
        {
 
17018
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
17019
          {
 
17020
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17021
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
17022
          }// end loop over 't'
 
17023
        }// end loop over 's'
 
17024
      }// end loop over 'r'
 
17025
      
 
17026
      // Table(s) of coefficients.
 
17027
      static const double coefficients0[4] = \
 
17028
      {0.288675134594813, 0.000000000000000, 0.000000000000000, 0.223606797749979};
 
17029
      
 
17030
      // Tables of derivatives of the polynomial base (transpose).
 
17031
      static const double dmats0[4][4] = \
 
17032
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17033
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17034
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17035
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
17036
      
 
17037
      static const double dmats1[4][4] = \
 
17038
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17039
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17040
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17041
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
17042
      
 
17043
      static const double dmats2[4][4] = \
 
17044
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17045
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17046
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17047
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
17048
      
 
17049
      // Compute reference derivatives.
 
17050
      // Declare pointer to array of derivatives on FIAT element.
 
17051
      double *derivatives = new double[num_derivatives];
 
17052
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17053
      {
 
17054
        derivatives[r] = 0.000000000000000;
 
17055
      }// end loop over 'r'
 
17056
      
 
17057
      // Declare derivative matrix (of polynomial basis).
 
17058
      double dmats[4][4] = \
 
17059
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17060
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
17061
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
17062
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
17063
      
 
17064
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
17065
      double dmats_old[4][4] = \
 
17066
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
17067
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
17068
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
17069
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
17070
      
 
17071
      // Loop possible derivatives.
 
17072
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17073
      {
 
17074
        // Resetting dmats values to compute next derivative.
 
17075
        for (unsigned int t = 0; t < 4; t++)
 
17076
        {
 
17077
          for (unsigned int u = 0; u < 4; u++)
 
17078
          {
 
17079
            dmats[t][u] = 0.000000000000000;
 
17080
            if (t == u)
 
17081
            {
 
17082
            dmats[t][u] = 1.000000000000000;
 
17083
            }
 
17084
            
 
17085
          }// end loop over 'u'
 
17086
        }// end loop over 't'
 
17087
        
 
17088
        // Looping derivative order to generate dmats.
 
17089
        for (unsigned int s = 0; s < n; s++)
 
17090
        {
 
17091
          // Updating dmats_old with new values and resetting dmats.
 
17092
          for (unsigned int t = 0; t < 4; t++)
 
17093
          {
 
17094
            for (unsigned int u = 0; u < 4; u++)
 
17095
            {
 
17096
              dmats_old[t][u] = dmats[t][u];
 
17097
              dmats[t][u] = 0.000000000000000;
 
17098
            }// end loop over 'u'
 
17099
          }// end loop over 't'
 
17100
          
 
17101
          // Update dmats using an inner product.
 
17102
          if (combinations[r][s] == 0)
 
17103
          {
 
17104
          for (unsigned int t = 0; t < 4; t++)
 
17105
          {
 
17106
            for (unsigned int u = 0; u < 4; u++)
 
17107
            {
 
17108
              for (unsigned int tu = 0; tu < 4; tu++)
 
17109
              {
 
17110
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
17111
              }// end loop over 'tu'
 
17112
            }// end loop over 'u'
 
17113
          }// end loop over 't'
 
17114
          }
 
17115
          
 
17116
          if (combinations[r][s] == 1)
 
17117
          {
 
17118
          for (unsigned int t = 0; t < 4; t++)
 
17119
          {
 
17120
            for (unsigned int u = 0; u < 4; u++)
 
17121
            {
 
17122
              for (unsigned int tu = 0; tu < 4; tu++)
 
17123
              {
 
17124
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
17125
              }// end loop over 'tu'
 
17126
            }// end loop over 'u'
 
17127
          }// end loop over 't'
 
17128
          }
 
17129
          
 
17130
          if (combinations[r][s] == 2)
 
17131
          {
 
17132
          for (unsigned int t = 0; t < 4; t++)
 
17133
          {
 
17134
            for (unsigned int u = 0; u < 4; u++)
 
17135
            {
 
17136
              for (unsigned int tu = 0; tu < 4; tu++)
 
17137
              {
 
17138
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
17139
              }// end loop over 'tu'
 
17140
            }// end loop over 'u'
 
17141
          }// end loop over 't'
 
17142
          }
 
17143
          
 
17144
        }// end loop over 's'
 
17145
        for (unsigned int s = 0; s < 4; s++)
 
17146
        {
 
17147
          for (unsigned int t = 0; t < 4; t++)
 
17148
          {
 
17149
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
17150
          }// end loop over 't'
 
17151
        }// end loop over 's'
 
17152
      }// end loop over 'r'
 
17153
      
 
17154
      // Transform derivatives back to physical element
 
17155
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17156
      {
 
17157
        for (unsigned int s = 0; s < num_derivatives; s++)
 
17158
        {
 
17159
          values[r] += transform[r][s]*derivatives[s];
 
17160
        }// end loop over 's'
 
17161
      }// end loop over 'r'
 
17162
      
 
17163
      // Delete pointer to array of derivatives on FIAT element
 
17164
      delete [] derivatives;
 
17165
      
 
17166
      // Delete pointer to array of combinations of derivatives and transform
 
17167
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17168
      {
 
17169
        delete [] combinations[r];
 
17170
      }// end loop over 'r'
 
17171
      delete [] combinations;
 
17172
      for (unsigned int r = 0; r < num_derivatives; r++)
 
17173
      {
 
17174
        delete [] transform[r];
 
17175
      }// end loop over 'r'
 
17176
      delete [] transform;
 
17177
        break;
 
17178
      }
 
17179
    }
 
17180
    
 
17181
  }
 
17182
 
 
17183
  /// Evaluate order n derivatives of all basis functions at given point in cell
 
17184
  virtual void evaluate_basis_derivatives_all(unsigned int n,
 
17185
                                              double* values,
 
17186
                                              const double* coordinates,
 
17187
                                              const ufc::cell& c) const
 
17188
  {
 
17189
    // Compute number of derivatives.
 
17190
    unsigned int num_derivatives = 1;
 
17191
    for (unsigned int r = 0; r < n; r++)
 
17192
    {
 
17193
      num_derivatives *= 3;
 
17194
    }// end loop over 'r'
 
17195
    
 
17196
    // Helper variable to hold values of a single dof.
 
17197
    double *dof_values = new double[num_derivatives];
 
17198
    for (unsigned int r = 0; r < num_derivatives; r++)
 
17199
    {
 
17200
      dof_values[r] = 0.000000000000000;
 
17201
    }// end loop over 'r'
 
17202
    
 
17203
    // Loop dofs and call evaluate_basis_derivatives.
 
17204
    for (unsigned int r = 0; r < 4; r++)
 
17205
    {
 
17206
      evaluate_basis_derivatives(r, n, dof_values, coordinates, c);
 
17207
      for (unsigned int s = 0; s < num_derivatives; s++)
 
17208
      {
 
17209
        values[r*num_derivatives + s] = dof_values[s];
 
17210
      }// end loop over 's'
 
17211
    }// end loop over 'r'
 
17212
    
 
17213
    // Delete pointer.
 
17214
    delete [] dof_values;
 
17215
  }
 
17216
 
 
17217
  /// Evaluate linear functional for dof i on the function f
 
17218
  virtual double evaluate_dof(unsigned int i,
 
17219
                              const ufc::function& f,
 
17220
                              const ufc::cell& c) const
 
17221
  {
 
17222
    // Declare variables for result of evaluation.
 
17223
    double vals[1];
 
17224
    
 
17225
    // Declare variable for physical coordinates.
 
17226
    double y[3];
 
17227
    const double * const * x = c.coordinates;
 
17228
    switch (i)
 
17229
    {
 
17230
    case 0:
 
17231
      {
 
17232
        y[0] = x[0][0];
 
17233
      y[1] = x[0][1];
 
17234
      y[2] = x[0][2];
 
17235
      f.evaluate(vals, y, c);
 
17236
      return vals[0];
 
17237
        break;
 
17238
      }
 
17239
    case 1:
 
17240
      {
 
17241
        y[0] = x[1][0];
 
17242
      y[1] = x[1][1];
 
17243
      y[2] = x[1][2];
 
17244
      f.evaluate(vals, y, c);
 
17245
      return vals[0];
 
17246
        break;
 
17247
      }
 
17248
    case 2:
 
17249
      {
 
17250
        y[0] = x[2][0];
 
17251
      y[1] = x[2][1];
 
17252
      y[2] = x[2][2];
 
17253
      f.evaluate(vals, y, c);
 
17254
      return vals[0];
 
17255
        break;
 
17256
      }
 
17257
    case 3:
 
17258
      {
 
17259
        y[0] = x[3][0];
 
17260
      y[1] = x[3][1];
 
17261
      y[2] = x[3][2];
 
17262
      f.evaluate(vals, y, c);
 
17263
      return vals[0];
 
17264
        break;
 
17265
      }
 
17266
    }
 
17267
    
 
17268
    return 0.000000000000000;
 
17269
  }
 
17270
 
 
17271
  /// Evaluate linear functionals for all dofs on the function f
 
17272
  virtual void evaluate_dofs(double* values,
 
17273
                             const ufc::function& f,
 
17274
                             const ufc::cell& c) const
 
17275
  {
 
17276
    // Declare variables for result of evaluation.
 
17277
    double vals[1];
 
17278
    
 
17279
    // Declare variable for physical coordinates.
 
17280
    double y[3];
 
17281
    const double * const * x = c.coordinates;
 
17282
    y[0] = x[0][0];
 
17283
    y[1] = x[0][1];
 
17284
    y[2] = x[0][2];
 
17285
    f.evaluate(vals, y, c);
 
17286
    values[0] = vals[0];
 
17287
    y[0] = x[1][0];
 
17288
    y[1] = x[1][1];
 
17289
    y[2] = x[1][2];
 
17290
    f.evaluate(vals, y, c);
 
17291
    values[1] = vals[0];
 
17292
    y[0] = x[2][0];
 
17293
    y[1] = x[2][1];
 
17294
    y[2] = x[2][2];
 
17295
    f.evaluate(vals, y, c);
 
17296
    values[2] = vals[0];
 
17297
    y[0] = x[3][0];
 
17298
    y[1] = x[3][1];
 
17299
    y[2] = x[3][2];
 
17300
    f.evaluate(vals, y, c);
 
17301
    values[3] = vals[0];
 
17302
  }
 
17303
 
 
17304
  /// Interpolate vertex values from dof values
 
17305
  virtual void interpolate_vertex_values(double* vertex_values,
 
17306
                                         const double* dof_values,
 
17307
                                         const ufc::cell& c) const
 
17308
  {
 
17309
    // Evaluate function and change variables
 
17310
    vertex_values[0] = dof_values[0];
 
17311
    vertex_values[1] = dof_values[1];
 
17312
    vertex_values[2] = dof_values[2];
 
17313
    vertex_values[3] = dof_values[3];
 
17314
  }
 
17315
 
 
17316
  /// Map coordinate xhat from reference cell to coordinate x in cell
 
17317
  virtual void map_from_reference_cell(double* x,
 
17318
                                       const double* xhat,
 
17319
                                       const ufc::cell& c)
 
17320
  {
 
17321
    throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0).");
 
17322
  }
 
17323
 
 
17324
  /// Map from coordinate x in cell to coordinate xhat in reference cell
 
17325
  virtual void map_to_reference_cell(double* xhat,
 
17326
                                     const double* x,
 
17327
                                     const ufc::cell& c)
 
17328
  {
 
17329
    throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0).");
 
17330
  }
 
17331
 
 
17332
  /// Return the number of sub elements (for a mixed element)
 
17333
  virtual unsigned int num_sub_elements() const
 
17334
  {
 
17335
    return 0;
 
17336
  }
 
17337
 
 
17338
  /// Create a new finite element for sub element i (for a mixed element)
 
17339
  virtual ufc::finite_element* create_sub_element(unsigned int i) const
 
17340
  {
 
17341
    return 0;
 
17342
  }
 
17343
 
 
17344
  /// Create a new class instance
 
17345
  virtual ufc::finite_element* create() const
 
17346
  {
 
17347
    return new stokes_finite_element_2();
 
17348
  }
 
17349
 
 
17350
};
 
17351
 
 
17352
/// This class defines the interface for a finite element.
 
17353
 
 
17354
class stokes_finite_element_3: public ufc::finite_element
 
17355
{
 
17356
public:
 
17357
 
 
17358
  /// Constructor
 
17359
  stokes_finite_element_3() : ufc::finite_element()
 
17360
  {
 
17361
    // Do nothing
 
17362
  }
 
17363
 
 
17364
  /// Destructor
 
17365
  virtual ~stokes_finite_element_3()
 
17366
  {
 
17367
    // Do nothing
 
17368
  }
 
17369
 
 
17370
  /// Return a string identifying the finite element
 
17371
  virtual const char* signature() const
 
17372
  {
 
17373
    return "MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) })";
 
17374
  }
 
17375
 
 
17376
  /// Return the cell shape
 
17377
  virtual ufc::shape cell_shape() const
 
17378
  {
 
17379
    return ufc::tetrahedron;
 
17380
  }
 
17381
 
 
17382
  /// Return the topological dimension of the cell shape
 
17383
  virtual unsigned int topological_dimension() const
 
17384
  {
 
17385
    return 3;
 
17386
  }
 
17387
 
 
17388
  /// Return the geometric dimension of the cell shape
 
17389
  virtual unsigned int geometric_dimension() const
 
17390
  {
 
17391
    return 3;
 
17392
  }
 
17393
 
 
17394
  /// Return the dimension of the finite element function space
 
17395
  virtual unsigned int space_dimension() const
 
17396
  {
 
17397
    return 34;
 
17398
  }
 
17399
 
 
17400
  /// Return the rank of the value space
 
17401
  virtual unsigned int value_rank() const
 
17402
  {
 
17403
    return 1;
 
17404
  }
 
17405
 
 
17406
  /// Return the dimension of the value space for axis i
 
17407
  virtual unsigned int value_dimension(unsigned int i) const
 
17408
  {
 
17409
    switch (i)
 
17410
    {
 
17411
    case 0:
 
17412
      {
 
17413
        return 4;
 
17414
        break;
 
17415
      }
 
17416
    }
 
17417
    
 
17418
    return 0;
 
17419
  }
 
17420
 
 
17421
  /// Evaluate basis function i at given point in cell
 
17422
  virtual void evaluate_basis(unsigned int i,
 
17423
                              double* values,
 
17424
                              const double* coordinates,
 
17425
                              const ufc::cell& c) const
 
17426
  {
 
17427
    // Extract vertex coordinates
 
17428
    const double * const * x = c.coordinates;
 
17429
    
 
17430
    // Compute Jacobian of affine map from reference cell
 
17431
    const double J_00 = x[1][0] - x[0][0];
 
17432
    const double J_01 = x[2][0] - x[0][0];
 
17433
    const double J_02 = x[3][0] - x[0][0];
 
17434
    const double J_10 = x[1][1] - x[0][1];
 
17435
    const double J_11 = x[2][1] - x[0][1];
 
17436
    const double J_12 = x[3][1] - x[0][1];
 
17437
    const double J_20 = x[1][2] - x[0][2];
 
17438
    const double J_21 = x[2][2] - x[0][2];
 
17439
    const double J_22 = x[3][2] - x[0][2];
 
17440
    
 
17441
    // Compute sub determinants
 
17442
    const double d_00 = J_11*J_22 - J_12*J_21;
 
17443
    const double d_01 = J_12*J_20 - J_10*J_22;
 
17444
    const double d_02 = J_10*J_21 - J_11*J_20;
 
17445
    const double d_10 = J_02*J_21 - J_01*J_22;
 
17446
    const double d_11 = J_00*J_22 - J_02*J_20;
 
17447
    const double d_12 = J_01*J_20 - J_00*J_21;
 
17448
    const double d_20 = J_01*J_12 - J_02*J_11;
 
17449
    const double d_21 = J_02*J_10 - J_00*J_12;
 
17450
    const double d_22 = J_00*J_11 - J_01*J_10;
 
17451
    
 
17452
    // Compute determinant of Jacobian
 
17453
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
17454
    
 
17455
    // Compute inverse of Jacobian
 
17456
    
 
17457
    // Compute constants
 
17458
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
17459
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
17460
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
17461
    
 
17462
    // Get coordinates and map to the reference (FIAT) element
 
17463
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
17464
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
17465
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
17466
    
 
17467
    
 
17468
    // Reset values.
 
17469
    values[0] = 0.000000000000000;
 
17470
    values[1] = 0.000000000000000;
 
17471
    values[2] = 0.000000000000000;
 
17472
    values[3] = 0.000000000000000;
 
17473
    switch (i)
 
17474
    {
 
17475
    case 0:
 
17476
      {
 
17477
        
 
17478
      // Array of basisvalues.
 
17479
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
17480
      
 
17481
      // Declare helper variables.
 
17482
      unsigned int rr = 0;
 
17483
      unsigned int ss = 0;
 
17484
      unsigned int tt = 0;
 
17485
      double tmp5 = 0.000000000000000;
 
17486
      double tmp6 = 0.000000000000000;
 
17487
      double tmp7 = 0.000000000000000;
 
17488
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
17489
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
17490
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
17491
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
17492
      double tmp4 = tmp3*tmp3;
 
17493
      
 
17494
      // Compute basisvalues.
 
17495
      basisvalues[0] = 1.000000000000000;
 
17496
      basisvalues[1] = tmp0;
 
17497
      for (unsigned int r = 1; r < 2; r++)
 
17498
      {
 
17499
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
17500
        ss = r*(r + 1)*(r + 2)/6;
 
17501
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
17502
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
17503
      }// end loop over 'r'
 
17504
      for (unsigned int r = 0; r < 2; r++)
 
17505
      {
 
17506
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17507
        ss = r*(r + 1)*(r + 2)/6;
 
17508
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17509
      }// end loop over 'r'
 
17510
      for (unsigned int r = 0; r < 1; r++)
 
17511
      {
 
17512
        for (unsigned int s = 1; s < 2 - r; s++)
 
17513
        {
 
17514
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
17515
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17516
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
17517
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17518
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17519
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17520
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
17521
        }// end loop over 's'
 
17522
      }// end loop over 'r'
 
17523
      for (unsigned int r = 0; r < 2; r++)
 
17524
      {
 
17525
        for (unsigned int s = 0; s < 2 - r; s++)
 
17526
        {
 
17527
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17528
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17529
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
17530
        }// end loop over 's'
 
17531
      }// end loop over 'r'
 
17532
      for (unsigned int r = 0; r < 1; r++)
 
17533
      {
 
17534
        for (unsigned int s = 0; s < 1 - r; s++)
 
17535
        {
 
17536
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
17537
          {
 
17538
            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;
 
17539
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17540
            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;
 
17541
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17542
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17543
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17544
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
17545
          }// end loop over 't'
 
17546
        }// end loop over 's'
 
17547
      }// end loop over 'r'
 
17548
      for (unsigned int r = 0; r < 3; r++)
 
17549
      {
 
17550
        for (unsigned int s = 0; s < 3 - r; s++)
 
17551
        {
 
17552
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
17553
          {
 
17554
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17555
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
17556
          }// end loop over 't'
 
17557
        }// end loop over 's'
 
17558
      }// end loop over 'r'
 
17559
      
 
17560
      // Table(s) of coefficients.
 
17561
      static const double coefficients0[10] = \
 
17562
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
17563
      
 
17564
      // Compute value(s).
 
17565
      for (unsigned int r = 0; r < 10; r++)
 
17566
      {
 
17567
        values[0] += coefficients0[r]*basisvalues[r];
 
17568
      }// end loop over 'r'
 
17569
        break;
 
17570
      }
 
17571
    case 1:
 
17572
      {
 
17573
        
 
17574
      // Array of basisvalues.
 
17575
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
17576
      
 
17577
      // Declare helper variables.
 
17578
      unsigned int rr = 0;
 
17579
      unsigned int ss = 0;
 
17580
      unsigned int tt = 0;
 
17581
      double tmp5 = 0.000000000000000;
 
17582
      double tmp6 = 0.000000000000000;
 
17583
      double tmp7 = 0.000000000000000;
 
17584
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
17585
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
17586
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
17587
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
17588
      double tmp4 = tmp3*tmp3;
 
17589
      
 
17590
      // Compute basisvalues.
 
17591
      basisvalues[0] = 1.000000000000000;
 
17592
      basisvalues[1] = tmp0;
 
17593
      for (unsigned int r = 1; r < 2; r++)
 
17594
      {
 
17595
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
17596
        ss = r*(r + 1)*(r + 2)/6;
 
17597
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
17598
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
17599
      }// end loop over 'r'
 
17600
      for (unsigned int r = 0; r < 2; r++)
 
17601
      {
 
17602
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17603
        ss = r*(r + 1)*(r + 2)/6;
 
17604
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17605
      }// end loop over 'r'
 
17606
      for (unsigned int r = 0; r < 1; r++)
 
17607
      {
 
17608
        for (unsigned int s = 1; s < 2 - r; s++)
 
17609
        {
 
17610
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
17611
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17612
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
17613
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17614
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17615
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17616
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
17617
        }// end loop over 's'
 
17618
      }// end loop over 'r'
 
17619
      for (unsigned int r = 0; r < 2; r++)
 
17620
      {
 
17621
        for (unsigned int s = 0; s < 2 - r; s++)
 
17622
        {
 
17623
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17624
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17625
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
17626
        }// end loop over 's'
 
17627
      }// end loop over 'r'
 
17628
      for (unsigned int r = 0; r < 1; r++)
 
17629
      {
 
17630
        for (unsigned int s = 0; s < 1 - r; s++)
 
17631
        {
 
17632
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
17633
          {
 
17634
            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;
 
17635
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17636
            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;
 
17637
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17638
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17639
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17640
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
17641
          }// end loop over 't'
 
17642
        }// end loop over 's'
 
17643
      }// end loop over 'r'
 
17644
      for (unsigned int r = 0; r < 3; r++)
 
17645
      {
 
17646
        for (unsigned int s = 0; s < 3 - r; s++)
 
17647
        {
 
17648
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
17649
          {
 
17650
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17651
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
17652
          }// end loop over 't'
 
17653
        }// end loop over 's'
 
17654
      }// end loop over 'r'
 
17655
      
 
17656
      // Table(s) of coefficients.
 
17657
      static const double coefficients0[10] = \
 
17658
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
17659
      
 
17660
      // Compute value(s).
 
17661
      for (unsigned int r = 0; r < 10; r++)
 
17662
      {
 
17663
        values[0] += coefficients0[r]*basisvalues[r];
 
17664
      }// end loop over 'r'
 
17665
        break;
 
17666
      }
 
17667
    case 2:
 
17668
      {
 
17669
        
 
17670
      // Array of basisvalues.
 
17671
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
17672
      
 
17673
      // Declare helper variables.
 
17674
      unsigned int rr = 0;
 
17675
      unsigned int ss = 0;
 
17676
      unsigned int tt = 0;
 
17677
      double tmp5 = 0.000000000000000;
 
17678
      double tmp6 = 0.000000000000000;
 
17679
      double tmp7 = 0.000000000000000;
 
17680
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
17681
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
17682
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
17683
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
17684
      double tmp4 = tmp3*tmp3;
 
17685
      
 
17686
      // Compute basisvalues.
 
17687
      basisvalues[0] = 1.000000000000000;
 
17688
      basisvalues[1] = tmp0;
 
17689
      for (unsigned int r = 1; r < 2; r++)
 
17690
      {
 
17691
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
17692
        ss = r*(r + 1)*(r + 2)/6;
 
17693
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
17694
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
17695
      }// end loop over 'r'
 
17696
      for (unsigned int r = 0; r < 2; r++)
 
17697
      {
 
17698
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17699
        ss = r*(r + 1)*(r + 2)/6;
 
17700
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17701
      }// end loop over 'r'
 
17702
      for (unsigned int r = 0; r < 1; r++)
 
17703
      {
 
17704
        for (unsigned int s = 1; s < 2 - r; s++)
 
17705
        {
 
17706
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
17707
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17708
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
17709
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17710
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17711
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17712
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
17713
        }// end loop over 's'
 
17714
      }// end loop over 'r'
 
17715
      for (unsigned int r = 0; r < 2; r++)
 
17716
      {
 
17717
        for (unsigned int s = 0; s < 2 - r; s++)
 
17718
        {
 
17719
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17720
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17721
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
17722
        }// end loop over 's'
 
17723
      }// end loop over 'r'
 
17724
      for (unsigned int r = 0; r < 1; r++)
 
17725
      {
 
17726
        for (unsigned int s = 0; s < 1 - r; s++)
 
17727
        {
 
17728
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
17729
          {
 
17730
            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;
 
17731
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17732
            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;
 
17733
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17734
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17735
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17736
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
17737
          }// end loop over 't'
 
17738
        }// end loop over 's'
 
17739
      }// end loop over 'r'
 
17740
      for (unsigned int r = 0; r < 3; r++)
 
17741
      {
 
17742
        for (unsigned int s = 0; s < 3 - r; s++)
 
17743
        {
 
17744
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
17745
          {
 
17746
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17747
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
17748
          }// end loop over 't'
 
17749
        }// end loop over 's'
 
17750
      }// end loop over 'r'
 
17751
      
 
17752
      // Table(s) of coefficients.
 
17753
      static const double coefficients0[10] = \
 
17754
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
17755
      
 
17756
      // Compute value(s).
 
17757
      for (unsigned int r = 0; r < 10; r++)
 
17758
      {
 
17759
        values[0] += coefficients0[r]*basisvalues[r];
 
17760
      }// end loop over 'r'
 
17761
        break;
 
17762
      }
 
17763
    case 3:
 
17764
      {
 
17765
        
 
17766
      // Array of basisvalues.
 
17767
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
17768
      
 
17769
      // Declare helper variables.
 
17770
      unsigned int rr = 0;
 
17771
      unsigned int ss = 0;
 
17772
      unsigned int tt = 0;
 
17773
      double tmp5 = 0.000000000000000;
 
17774
      double tmp6 = 0.000000000000000;
 
17775
      double tmp7 = 0.000000000000000;
 
17776
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
17777
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
17778
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
17779
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
17780
      double tmp4 = tmp3*tmp3;
 
17781
      
 
17782
      // Compute basisvalues.
 
17783
      basisvalues[0] = 1.000000000000000;
 
17784
      basisvalues[1] = tmp0;
 
17785
      for (unsigned int r = 1; r < 2; r++)
 
17786
      {
 
17787
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
17788
        ss = r*(r + 1)*(r + 2)/6;
 
17789
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
17790
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
17791
      }// end loop over 'r'
 
17792
      for (unsigned int r = 0; r < 2; r++)
 
17793
      {
 
17794
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17795
        ss = r*(r + 1)*(r + 2)/6;
 
17796
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17797
      }// end loop over 'r'
 
17798
      for (unsigned int r = 0; r < 1; r++)
 
17799
      {
 
17800
        for (unsigned int s = 1; s < 2 - r; s++)
 
17801
        {
 
17802
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
17803
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17804
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
17805
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17806
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17807
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17808
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
17809
        }// end loop over 's'
 
17810
      }// end loop over 'r'
 
17811
      for (unsigned int r = 0; r < 2; r++)
 
17812
      {
 
17813
        for (unsigned int s = 0; s < 2 - r; s++)
 
17814
        {
 
17815
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17816
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17817
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
17818
        }// end loop over 's'
 
17819
      }// end loop over 'r'
 
17820
      for (unsigned int r = 0; r < 1; r++)
 
17821
      {
 
17822
        for (unsigned int s = 0; s < 1 - r; s++)
 
17823
        {
 
17824
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
17825
          {
 
17826
            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;
 
17827
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17828
            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;
 
17829
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17830
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17831
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17832
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
17833
          }// end loop over 't'
 
17834
        }// end loop over 's'
 
17835
      }// end loop over 'r'
 
17836
      for (unsigned int r = 0; r < 3; r++)
 
17837
      {
 
17838
        for (unsigned int s = 0; s < 3 - r; s++)
 
17839
        {
 
17840
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
17841
          {
 
17842
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17843
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
17844
          }// end loop over 't'
 
17845
        }// end loop over 's'
 
17846
      }// end loop over 'r'
 
17847
      
 
17848
      // Table(s) of coefficients.
 
17849
      static const double coefficients0[10] = \
 
17850
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
17851
      
 
17852
      // Compute value(s).
 
17853
      for (unsigned int r = 0; r < 10; r++)
 
17854
      {
 
17855
        values[0] += coefficients0[r]*basisvalues[r];
 
17856
      }// end loop over 'r'
 
17857
        break;
 
17858
      }
 
17859
    case 4:
 
17860
      {
 
17861
        
 
17862
      // Array of basisvalues.
 
17863
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
17864
      
 
17865
      // Declare helper variables.
 
17866
      unsigned int rr = 0;
 
17867
      unsigned int ss = 0;
 
17868
      unsigned int tt = 0;
 
17869
      double tmp5 = 0.000000000000000;
 
17870
      double tmp6 = 0.000000000000000;
 
17871
      double tmp7 = 0.000000000000000;
 
17872
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
17873
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
17874
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
17875
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
17876
      double tmp4 = tmp3*tmp3;
 
17877
      
 
17878
      // Compute basisvalues.
 
17879
      basisvalues[0] = 1.000000000000000;
 
17880
      basisvalues[1] = tmp0;
 
17881
      for (unsigned int r = 1; r < 2; r++)
 
17882
      {
 
17883
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
17884
        ss = r*(r + 1)*(r + 2)/6;
 
17885
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
17886
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
17887
      }// end loop over 'r'
 
17888
      for (unsigned int r = 0; r < 2; r++)
 
17889
      {
 
17890
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17891
        ss = r*(r + 1)*(r + 2)/6;
 
17892
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17893
      }// end loop over 'r'
 
17894
      for (unsigned int r = 0; r < 1; r++)
 
17895
      {
 
17896
        for (unsigned int s = 1; s < 2 - r; s++)
 
17897
        {
 
17898
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
17899
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17900
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
17901
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17902
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17903
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17904
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
17905
        }// end loop over 's'
 
17906
      }// end loop over 'r'
 
17907
      for (unsigned int r = 0; r < 2; r++)
 
17908
      {
 
17909
        for (unsigned int s = 0; s < 2 - r; s++)
 
17910
        {
 
17911
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
17912
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17913
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
17914
        }// end loop over 's'
 
17915
      }// end loop over 'r'
 
17916
      for (unsigned int r = 0; r < 1; r++)
 
17917
      {
 
17918
        for (unsigned int s = 0; s < 1 - r; s++)
 
17919
        {
 
17920
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
17921
          {
 
17922
            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;
 
17923
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17924
            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;
 
17925
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17926
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17927
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
17928
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
17929
          }// end loop over 't'
 
17930
        }// end loop over 's'
 
17931
      }// end loop over 'r'
 
17932
      for (unsigned int r = 0; r < 3; r++)
 
17933
      {
 
17934
        for (unsigned int s = 0; s < 3 - r; s++)
 
17935
        {
 
17936
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
17937
          {
 
17938
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
17939
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
17940
          }// end loop over 't'
 
17941
        }// end loop over 's'
 
17942
      }// end loop over 'r'
 
17943
      
 
17944
      // Table(s) of coefficients.
 
17945
      static const double coefficients0[10] = \
 
17946
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
17947
      
 
17948
      // Compute value(s).
 
17949
      for (unsigned int r = 0; r < 10; r++)
 
17950
      {
 
17951
        values[0] += coefficients0[r]*basisvalues[r];
 
17952
      }// end loop over 'r'
 
17953
        break;
 
17954
      }
 
17955
    case 5:
 
17956
      {
 
17957
        
 
17958
      // Array of basisvalues.
 
17959
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
17960
      
 
17961
      // Declare helper variables.
 
17962
      unsigned int rr = 0;
 
17963
      unsigned int ss = 0;
 
17964
      unsigned int tt = 0;
 
17965
      double tmp5 = 0.000000000000000;
 
17966
      double tmp6 = 0.000000000000000;
 
17967
      double tmp7 = 0.000000000000000;
 
17968
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
17969
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
17970
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
17971
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
17972
      double tmp4 = tmp3*tmp3;
 
17973
      
 
17974
      // Compute basisvalues.
 
17975
      basisvalues[0] = 1.000000000000000;
 
17976
      basisvalues[1] = tmp0;
 
17977
      for (unsigned int r = 1; r < 2; r++)
 
17978
      {
 
17979
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
17980
        ss = r*(r + 1)*(r + 2)/6;
 
17981
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
17982
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
17983
      }// end loop over 'r'
 
17984
      for (unsigned int r = 0; r < 2; r++)
 
17985
      {
 
17986
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
17987
        ss = r*(r + 1)*(r + 2)/6;
 
17988
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
17989
      }// end loop over 'r'
 
17990
      for (unsigned int r = 0; r < 1; r++)
 
17991
      {
 
17992
        for (unsigned int s = 1; s < 2 - r; s++)
 
17993
        {
 
17994
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
17995
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
17996
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
17997
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17998
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
17999
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18000
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18001
        }// end loop over 's'
 
18002
      }// end loop over 'r'
 
18003
      for (unsigned int r = 0; r < 2; r++)
 
18004
      {
 
18005
        for (unsigned int s = 0; s < 2 - r; s++)
 
18006
        {
 
18007
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18008
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18009
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18010
        }// end loop over 's'
 
18011
      }// end loop over 'r'
 
18012
      for (unsigned int r = 0; r < 1; r++)
 
18013
      {
 
18014
        for (unsigned int s = 0; s < 1 - r; s++)
 
18015
        {
 
18016
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18017
          {
 
18018
            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;
 
18019
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18020
            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;
 
18021
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18022
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18023
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18024
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18025
          }// end loop over 't'
 
18026
        }// end loop over 's'
 
18027
      }// end loop over 'r'
 
18028
      for (unsigned int r = 0; r < 3; r++)
 
18029
      {
 
18030
        for (unsigned int s = 0; s < 3 - r; s++)
 
18031
        {
 
18032
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18033
          {
 
18034
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18035
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18036
          }// end loop over 't'
 
18037
        }// end loop over 's'
 
18038
      }// end loop over 'r'
 
18039
      
 
18040
      // Table(s) of coefficients.
 
18041
      static const double coefficients0[10] = \
 
18042
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
18043
      
 
18044
      // Compute value(s).
 
18045
      for (unsigned int r = 0; r < 10; r++)
 
18046
      {
 
18047
        values[0] += coefficients0[r]*basisvalues[r];
 
18048
      }// end loop over 'r'
 
18049
        break;
 
18050
      }
 
18051
    case 6:
 
18052
      {
 
18053
        
 
18054
      // Array of basisvalues.
 
18055
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18056
      
 
18057
      // Declare helper variables.
 
18058
      unsigned int rr = 0;
 
18059
      unsigned int ss = 0;
 
18060
      unsigned int tt = 0;
 
18061
      double tmp5 = 0.000000000000000;
 
18062
      double tmp6 = 0.000000000000000;
 
18063
      double tmp7 = 0.000000000000000;
 
18064
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18065
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18066
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18067
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18068
      double tmp4 = tmp3*tmp3;
 
18069
      
 
18070
      // Compute basisvalues.
 
18071
      basisvalues[0] = 1.000000000000000;
 
18072
      basisvalues[1] = tmp0;
 
18073
      for (unsigned int r = 1; r < 2; r++)
 
18074
      {
 
18075
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18076
        ss = r*(r + 1)*(r + 2)/6;
 
18077
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18078
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18079
      }// end loop over 'r'
 
18080
      for (unsigned int r = 0; r < 2; r++)
 
18081
      {
 
18082
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18083
        ss = r*(r + 1)*(r + 2)/6;
 
18084
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18085
      }// end loop over 'r'
 
18086
      for (unsigned int r = 0; r < 1; r++)
 
18087
      {
 
18088
        for (unsigned int s = 1; s < 2 - r; s++)
 
18089
        {
 
18090
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18091
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18092
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18093
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18094
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18095
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18096
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18097
        }// end loop over 's'
 
18098
      }// end loop over 'r'
 
18099
      for (unsigned int r = 0; r < 2; r++)
 
18100
      {
 
18101
        for (unsigned int s = 0; s < 2 - r; s++)
 
18102
        {
 
18103
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18104
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18105
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18106
        }// end loop over 's'
 
18107
      }// end loop over 'r'
 
18108
      for (unsigned int r = 0; r < 1; r++)
 
18109
      {
 
18110
        for (unsigned int s = 0; s < 1 - r; s++)
 
18111
        {
 
18112
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18113
          {
 
18114
            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;
 
18115
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18116
            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;
 
18117
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18118
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18119
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18120
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18121
          }// end loop over 't'
 
18122
        }// end loop over 's'
 
18123
      }// end loop over 'r'
 
18124
      for (unsigned int r = 0; r < 3; r++)
 
18125
      {
 
18126
        for (unsigned int s = 0; s < 3 - r; s++)
 
18127
        {
 
18128
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18129
          {
 
18130
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18131
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18132
          }// end loop over 't'
 
18133
        }// end loop over 's'
 
18134
      }// end loop over 'r'
 
18135
      
 
18136
      // Table(s) of coefficients.
 
18137
      static const double coefficients0[10] = \
 
18138
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
18139
      
 
18140
      // Compute value(s).
 
18141
      for (unsigned int r = 0; r < 10; r++)
 
18142
      {
 
18143
        values[0] += coefficients0[r]*basisvalues[r];
 
18144
      }// end loop over 'r'
 
18145
        break;
 
18146
      }
 
18147
    case 7:
 
18148
      {
 
18149
        
 
18150
      // Array of basisvalues.
 
18151
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18152
      
 
18153
      // Declare helper variables.
 
18154
      unsigned int rr = 0;
 
18155
      unsigned int ss = 0;
 
18156
      unsigned int tt = 0;
 
18157
      double tmp5 = 0.000000000000000;
 
18158
      double tmp6 = 0.000000000000000;
 
18159
      double tmp7 = 0.000000000000000;
 
18160
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18161
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18162
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18163
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18164
      double tmp4 = tmp3*tmp3;
 
18165
      
 
18166
      // Compute basisvalues.
 
18167
      basisvalues[0] = 1.000000000000000;
 
18168
      basisvalues[1] = tmp0;
 
18169
      for (unsigned int r = 1; r < 2; r++)
 
18170
      {
 
18171
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18172
        ss = r*(r + 1)*(r + 2)/6;
 
18173
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18174
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18175
      }// end loop over 'r'
 
18176
      for (unsigned int r = 0; r < 2; r++)
 
18177
      {
 
18178
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18179
        ss = r*(r + 1)*(r + 2)/6;
 
18180
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18181
      }// end loop over 'r'
 
18182
      for (unsigned int r = 0; r < 1; r++)
 
18183
      {
 
18184
        for (unsigned int s = 1; s < 2 - r; s++)
 
18185
        {
 
18186
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18187
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18188
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18189
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18190
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18191
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18192
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18193
        }// end loop over 's'
 
18194
      }// end loop over 'r'
 
18195
      for (unsigned int r = 0; r < 2; r++)
 
18196
      {
 
18197
        for (unsigned int s = 0; s < 2 - r; s++)
 
18198
        {
 
18199
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18200
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18201
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18202
        }// end loop over 's'
 
18203
      }// end loop over 'r'
 
18204
      for (unsigned int r = 0; r < 1; r++)
 
18205
      {
 
18206
        for (unsigned int s = 0; s < 1 - r; s++)
 
18207
        {
 
18208
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18209
          {
 
18210
            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;
 
18211
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18212
            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;
 
18213
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18214
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18215
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18216
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18217
          }// end loop over 't'
 
18218
        }// end loop over 's'
 
18219
      }// end loop over 'r'
 
18220
      for (unsigned int r = 0; r < 3; r++)
 
18221
      {
 
18222
        for (unsigned int s = 0; s < 3 - r; s++)
 
18223
        {
 
18224
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18225
          {
 
18226
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18227
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18228
          }// end loop over 't'
 
18229
        }// end loop over 's'
 
18230
      }// end loop over 'r'
 
18231
      
 
18232
      // Table(s) of coefficients.
 
18233
      static const double coefficients0[10] = \
 
18234
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
18235
      
 
18236
      // Compute value(s).
 
18237
      for (unsigned int r = 0; r < 10; r++)
 
18238
      {
 
18239
        values[0] += coefficients0[r]*basisvalues[r];
 
18240
      }// end loop over 'r'
 
18241
        break;
 
18242
      }
 
18243
    case 8:
 
18244
      {
 
18245
        
 
18246
      // Array of basisvalues.
 
18247
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18248
      
 
18249
      // Declare helper variables.
 
18250
      unsigned int rr = 0;
 
18251
      unsigned int ss = 0;
 
18252
      unsigned int tt = 0;
 
18253
      double tmp5 = 0.000000000000000;
 
18254
      double tmp6 = 0.000000000000000;
 
18255
      double tmp7 = 0.000000000000000;
 
18256
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18257
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18258
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18259
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18260
      double tmp4 = tmp3*tmp3;
 
18261
      
 
18262
      // Compute basisvalues.
 
18263
      basisvalues[0] = 1.000000000000000;
 
18264
      basisvalues[1] = tmp0;
 
18265
      for (unsigned int r = 1; r < 2; r++)
 
18266
      {
 
18267
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18268
        ss = r*(r + 1)*(r + 2)/6;
 
18269
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18270
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18271
      }// end loop over 'r'
 
18272
      for (unsigned int r = 0; r < 2; r++)
 
18273
      {
 
18274
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18275
        ss = r*(r + 1)*(r + 2)/6;
 
18276
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18277
      }// end loop over 'r'
 
18278
      for (unsigned int r = 0; r < 1; r++)
 
18279
      {
 
18280
        for (unsigned int s = 1; s < 2 - r; s++)
 
18281
        {
 
18282
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18283
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18284
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18285
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18286
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18287
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18288
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18289
        }// end loop over 's'
 
18290
      }// end loop over 'r'
 
18291
      for (unsigned int r = 0; r < 2; r++)
 
18292
      {
 
18293
        for (unsigned int s = 0; s < 2 - r; s++)
 
18294
        {
 
18295
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18296
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18297
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18298
        }// end loop over 's'
 
18299
      }// end loop over 'r'
 
18300
      for (unsigned int r = 0; r < 1; r++)
 
18301
      {
 
18302
        for (unsigned int s = 0; s < 1 - r; s++)
 
18303
        {
 
18304
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18305
          {
 
18306
            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;
 
18307
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18308
            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;
 
18309
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18310
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18311
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18312
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18313
          }// end loop over 't'
 
18314
        }// end loop over 's'
 
18315
      }// end loop over 'r'
 
18316
      for (unsigned int r = 0; r < 3; r++)
 
18317
      {
 
18318
        for (unsigned int s = 0; s < 3 - r; s++)
 
18319
        {
 
18320
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18321
          {
 
18322
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18323
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18324
          }// end loop over 't'
 
18325
        }// end loop over 's'
 
18326
      }// end loop over 'r'
 
18327
      
 
18328
      // Table(s) of coefficients.
 
18329
      static const double coefficients0[10] = \
 
18330
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
18331
      
 
18332
      // Compute value(s).
 
18333
      for (unsigned int r = 0; r < 10; r++)
 
18334
      {
 
18335
        values[0] += coefficients0[r]*basisvalues[r];
 
18336
      }// end loop over 'r'
 
18337
        break;
 
18338
      }
 
18339
    case 9:
 
18340
      {
 
18341
        
 
18342
      // Array of basisvalues.
 
18343
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18344
      
 
18345
      // Declare helper variables.
 
18346
      unsigned int rr = 0;
 
18347
      unsigned int ss = 0;
 
18348
      unsigned int tt = 0;
 
18349
      double tmp5 = 0.000000000000000;
 
18350
      double tmp6 = 0.000000000000000;
 
18351
      double tmp7 = 0.000000000000000;
 
18352
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18353
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18354
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18355
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18356
      double tmp4 = tmp3*tmp3;
 
18357
      
 
18358
      // Compute basisvalues.
 
18359
      basisvalues[0] = 1.000000000000000;
 
18360
      basisvalues[1] = tmp0;
 
18361
      for (unsigned int r = 1; r < 2; r++)
 
18362
      {
 
18363
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18364
        ss = r*(r + 1)*(r + 2)/6;
 
18365
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18366
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18367
      }// end loop over 'r'
 
18368
      for (unsigned int r = 0; r < 2; r++)
 
18369
      {
 
18370
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18371
        ss = r*(r + 1)*(r + 2)/6;
 
18372
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18373
      }// end loop over 'r'
 
18374
      for (unsigned int r = 0; r < 1; r++)
 
18375
      {
 
18376
        for (unsigned int s = 1; s < 2 - r; s++)
 
18377
        {
 
18378
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18379
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18380
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18381
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18382
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18383
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18384
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18385
        }// end loop over 's'
 
18386
      }// end loop over 'r'
 
18387
      for (unsigned int r = 0; r < 2; r++)
 
18388
      {
 
18389
        for (unsigned int s = 0; s < 2 - r; s++)
 
18390
        {
 
18391
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18392
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18393
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18394
        }// end loop over 's'
 
18395
      }// end loop over 'r'
 
18396
      for (unsigned int r = 0; r < 1; r++)
 
18397
      {
 
18398
        for (unsigned int s = 0; s < 1 - r; s++)
 
18399
        {
 
18400
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18401
          {
 
18402
            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;
 
18403
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18404
            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;
 
18405
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18406
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18407
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18408
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18409
          }// end loop over 't'
 
18410
        }// end loop over 's'
 
18411
      }// end loop over 'r'
 
18412
      for (unsigned int r = 0; r < 3; r++)
 
18413
      {
 
18414
        for (unsigned int s = 0; s < 3 - r; s++)
 
18415
        {
 
18416
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18417
          {
 
18418
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18419
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18420
          }// end loop over 't'
 
18421
        }// end loop over 's'
 
18422
      }// end loop over 'r'
 
18423
      
 
18424
      // Table(s) of coefficients.
 
18425
      static const double coefficients0[10] = \
 
18426
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
18427
      
 
18428
      // Compute value(s).
 
18429
      for (unsigned int r = 0; r < 10; r++)
 
18430
      {
 
18431
        values[0] += coefficients0[r]*basisvalues[r];
 
18432
      }// end loop over 'r'
 
18433
        break;
 
18434
      }
 
18435
    case 10:
 
18436
      {
 
18437
        
 
18438
      // Array of basisvalues.
 
18439
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18440
      
 
18441
      // Declare helper variables.
 
18442
      unsigned int rr = 0;
 
18443
      unsigned int ss = 0;
 
18444
      unsigned int tt = 0;
 
18445
      double tmp5 = 0.000000000000000;
 
18446
      double tmp6 = 0.000000000000000;
 
18447
      double tmp7 = 0.000000000000000;
 
18448
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18449
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18450
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18451
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18452
      double tmp4 = tmp3*tmp3;
 
18453
      
 
18454
      // Compute basisvalues.
 
18455
      basisvalues[0] = 1.000000000000000;
 
18456
      basisvalues[1] = tmp0;
 
18457
      for (unsigned int r = 1; r < 2; r++)
 
18458
      {
 
18459
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18460
        ss = r*(r + 1)*(r + 2)/6;
 
18461
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18462
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18463
      }// end loop over 'r'
 
18464
      for (unsigned int r = 0; r < 2; r++)
 
18465
      {
 
18466
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18467
        ss = r*(r + 1)*(r + 2)/6;
 
18468
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18469
      }// end loop over 'r'
 
18470
      for (unsigned int r = 0; r < 1; r++)
 
18471
      {
 
18472
        for (unsigned int s = 1; s < 2 - r; s++)
 
18473
        {
 
18474
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18475
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18476
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18477
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18478
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18479
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18480
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18481
        }// end loop over 's'
 
18482
      }// end loop over 'r'
 
18483
      for (unsigned int r = 0; r < 2; r++)
 
18484
      {
 
18485
        for (unsigned int s = 0; s < 2 - r; s++)
 
18486
        {
 
18487
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18488
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18489
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18490
        }// end loop over 's'
 
18491
      }// end loop over 'r'
 
18492
      for (unsigned int r = 0; r < 1; r++)
 
18493
      {
 
18494
        for (unsigned int s = 0; s < 1 - r; s++)
 
18495
        {
 
18496
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18497
          {
 
18498
            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;
 
18499
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18500
            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;
 
18501
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18502
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18503
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18504
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18505
          }// end loop over 't'
 
18506
        }// end loop over 's'
 
18507
      }// end loop over 'r'
 
18508
      for (unsigned int r = 0; r < 3; r++)
 
18509
      {
 
18510
        for (unsigned int s = 0; s < 3 - r; s++)
 
18511
        {
 
18512
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18513
          {
 
18514
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18515
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18516
          }// end loop over 't'
 
18517
        }// end loop over 's'
 
18518
      }// end loop over 'r'
 
18519
      
 
18520
      // Table(s) of coefficients.
 
18521
      static const double coefficients0[10] = \
 
18522
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
18523
      
 
18524
      // Compute value(s).
 
18525
      for (unsigned int r = 0; r < 10; r++)
 
18526
      {
 
18527
        values[1] += coefficients0[r]*basisvalues[r];
 
18528
      }// end loop over 'r'
 
18529
        break;
 
18530
      }
 
18531
    case 11:
 
18532
      {
 
18533
        
 
18534
      // Array of basisvalues.
 
18535
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18536
      
 
18537
      // Declare helper variables.
 
18538
      unsigned int rr = 0;
 
18539
      unsigned int ss = 0;
 
18540
      unsigned int tt = 0;
 
18541
      double tmp5 = 0.000000000000000;
 
18542
      double tmp6 = 0.000000000000000;
 
18543
      double tmp7 = 0.000000000000000;
 
18544
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18545
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18546
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18547
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18548
      double tmp4 = tmp3*tmp3;
 
18549
      
 
18550
      // Compute basisvalues.
 
18551
      basisvalues[0] = 1.000000000000000;
 
18552
      basisvalues[1] = tmp0;
 
18553
      for (unsigned int r = 1; r < 2; r++)
 
18554
      {
 
18555
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18556
        ss = r*(r + 1)*(r + 2)/6;
 
18557
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18558
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18559
      }// end loop over 'r'
 
18560
      for (unsigned int r = 0; r < 2; r++)
 
18561
      {
 
18562
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18563
        ss = r*(r + 1)*(r + 2)/6;
 
18564
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18565
      }// end loop over 'r'
 
18566
      for (unsigned int r = 0; r < 1; r++)
 
18567
      {
 
18568
        for (unsigned int s = 1; s < 2 - r; s++)
 
18569
        {
 
18570
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18571
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18572
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18573
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18574
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18575
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18576
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18577
        }// end loop over 's'
 
18578
      }// end loop over 'r'
 
18579
      for (unsigned int r = 0; r < 2; r++)
 
18580
      {
 
18581
        for (unsigned int s = 0; s < 2 - r; s++)
 
18582
        {
 
18583
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18584
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18585
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18586
        }// end loop over 's'
 
18587
      }// end loop over 'r'
 
18588
      for (unsigned int r = 0; r < 1; r++)
 
18589
      {
 
18590
        for (unsigned int s = 0; s < 1 - r; s++)
 
18591
        {
 
18592
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18593
          {
 
18594
            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;
 
18595
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18596
            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;
 
18597
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18598
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18599
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18600
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18601
          }// end loop over 't'
 
18602
        }// end loop over 's'
 
18603
      }// end loop over 'r'
 
18604
      for (unsigned int r = 0; r < 3; r++)
 
18605
      {
 
18606
        for (unsigned int s = 0; s < 3 - r; s++)
 
18607
        {
 
18608
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18609
          {
 
18610
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18611
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18612
          }// end loop over 't'
 
18613
        }// end loop over 's'
 
18614
      }// end loop over 'r'
 
18615
      
 
18616
      // Table(s) of coefficients.
 
18617
      static const double coefficients0[10] = \
 
18618
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
18619
      
 
18620
      // Compute value(s).
 
18621
      for (unsigned int r = 0; r < 10; r++)
 
18622
      {
 
18623
        values[1] += coefficients0[r]*basisvalues[r];
 
18624
      }// end loop over 'r'
 
18625
        break;
 
18626
      }
 
18627
    case 12:
 
18628
      {
 
18629
        
 
18630
      // Array of basisvalues.
 
18631
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18632
      
 
18633
      // Declare helper variables.
 
18634
      unsigned int rr = 0;
 
18635
      unsigned int ss = 0;
 
18636
      unsigned int tt = 0;
 
18637
      double tmp5 = 0.000000000000000;
 
18638
      double tmp6 = 0.000000000000000;
 
18639
      double tmp7 = 0.000000000000000;
 
18640
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18641
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18642
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18643
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18644
      double tmp4 = tmp3*tmp3;
 
18645
      
 
18646
      // Compute basisvalues.
 
18647
      basisvalues[0] = 1.000000000000000;
 
18648
      basisvalues[1] = tmp0;
 
18649
      for (unsigned int r = 1; r < 2; r++)
 
18650
      {
 
18651
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18652
        ss = r*(r + 1)*(r + 2)/6;
 
18653
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18654
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18655
      }// end loop over 'r'
 
18656
      for (unsigned int r = 0; r < 2; r++)
 
18657
      {
 
18658
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18659
        ss = r*(r + 1)*(r + 2)/6;
 
18660
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18661
      }// end loop over 'r'
 
18662
      for (unsigned int r = 0; r < 1; r++)
 
18663
      {
 
18664
        for (unsigned int s = 1; s < 2 - r; s++)
 
18665
        {
 
18666
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18667
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18668
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18669
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18670
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18671
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18672
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18673
        }// end loop over 's'
 
18674
      }// end loop over 'r'
 
18675
      for (unsigned int r = 0; r < 2; r++)
 
18676
      {
 
18677
        for (unsigned int s = 0; s < 2 - r; s++)
 
18678
        {
 
18679
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18680
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18681
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18682
        }// end loop over 's'
 
18683
      }// end loop over 'r'
 
18684
      for (unsigned int r = 0; r < 1; r++)
 
18685
      {
 
18686
        for (unsigned int s = 0; s < 1 - r; s++)
 
18687
        {
 
18688
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18689
          {
 
18690
            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;
 
18691
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18692
            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;
 
18693
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18694
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18695
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18696
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18697
          }// end loop over 't'
 
18698
        }// end loop over 's'
 
18699
      }// end loop over 'r'
 
18700
      for (unsigned int r = 0; r < 3; r++)
 
18701
      {
 
18702
        for (unsigned int s = 0; s < 3 - r; s++)
 
18703
        {
 
18704
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18705
          {
 
18706
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18707
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18708
          }// end loop over 't'
 
18709
        }// end loop over 's'
 
18710
      }// end loop over 'r'
 
18711
      
 
18712
      // Table(s) of coefficients.
 
18713
      static const double coefficients0[10] = \
 
18714
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
18715
      
 
18716
      // Compute value(s).
 
18717
      for (unsigned int r = 0; r < 10; r++)
 
18718
      {
 
18719
        values[1] += coefficients0[r]*basisvalues[r];
 
18720
      }// end loop over 'r'
 
18721
        break;
 
18722
      }
 
18723
    case 13:
 
18724
      {
 
18725
        
 
18726
      // Array of basisvalues.
 
18727
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18728
      
 
18729
      // Declare helper variables.
 
18730
      unsigned int rr = 0;
 
18731
      unsigned int ss = 0;
 
18732
      unsigned int tt = 0;
 
18733
      double tmp5 = 0.000000000000000;
 
18734
      double tmp6 = 0.000000000000000;
 
18735
      double tmp7 = 0.000000000000000;
 
18736
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18737
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18738
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18739
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18740
      double tmp4 = tmp3*tmp3;
 
18741
      
 
18742
      // Compute basisvalues.
 
18743
      basisvalues[0] = 1.000000000000000;
 
18744
      basisvalues[1] = tmp0;
 
18745
      for (unsigned int r = 1; r < 2; r++)
 
18746
      {
 
18747
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18748
        ss = r*(r + 1)*(r + 2)/6;
 
18749
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18750
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18751
      }// end loop over 'r'
 
18752
      for (unsigned int r = 0; r < 2; r++)
 
18753
      {
 
18754
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18755
        ss = r*(r + 1)*(r + 2)/6;
 
18756
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18757
      }// end loop over 'r'
 
18758
      for (unsigned int r = 0; r < 1; r++)
 
18759
      {
 
18760
        for (unsigned int s = 1; s < 2 - r; s++)
 
18761
        {
 
18762
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18763
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18764
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18765
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18766
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18767
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18768
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18769
        }// end loop over 's'
 
18770
      }// end loop over 'r'
 
18771
      for (unsigned int r = 0; r < 2; r++)
 
18772
      {
 
18773
        for (unsigned int s = 0; s < 2 - r; s++)
 
18774
        {
 
18775
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18776
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18777
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18778
        }// end loop over 's'
 
18779
      }// end loop over 'r'
 
18780
      for (unsigned int r = 0; r < 1; r++)
 
18781
      {
 
18782
        for (unsigned int s = 0; s < 1 - r; s++)
 
18783
        {
 
18784
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18785
          {
 
18786
            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;
 
18787
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18788
            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;
 
18789
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18790
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18791
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18792
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18793
          }// end loop over 't'
 
18794
        }// end loop over 's'
 
18795
      }// end loop over 'r'
 
18796
      for (unsigned int r = 0; r < 3; r++)
 
18797
      {
 
18798
        for (unsigned int s = 0; s < 3 - r; s++)
 
18799
        {
 
18800
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18801
          {
 
18802
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18803
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18804
          }// end loop over 't'
 
18805
        }// end loop over 's'
 
18806
      }// end loop over 'r'
 
18807
      
 
18808
      // Table(s) of coefficients.
 
18809
      static const double coefficients0[10] = \
 
18810
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
18811
      
 
18812
      // Compute value(s).
 
18813
      for (unsigned int r = 0; r < 10; r++)
 
18814
      {
 
18815
        values[1] += coefficients0[r]*basisvalues[r];
 
18816
      }// end loop over 'r'
 
18817
        break;
 
18818
      }
 
18819
    case 14:
 
18820
      {
 
18821
        
 
18822
      // Array of basisvalues.
 
18823
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18824
      
 
18825
      // Declare helper variables.
 
18826
      unsigned int rr = 0;
 
18827
      unsigned int ss = 0;
 
18828
      unsigned int tt = 0;
 
18829
      double tmp5 = 0.000000000000000;
 
18830
      double tmp6 = 0.000000000000000;
 
18831
      double tmp7 = 0.000000000000000;
 
18832
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18833
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18834
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18835
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18836
      double tmp4 = tmp3*tmp3;
 
18837
      
 
18838
      // Compute basisvalues.
 
18839
      basisvalues[0] = 1.000000000000000;
 
18840
      basisvalues[1] = tmp0;
 
18841
      for (unsigned int r = 1; r < 2; r++)
 
18842
      {
 
18843
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18844
        ss = r*(r + 1)*(r + 2)/6;
 
18845
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18846
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18847
      }// end loop over 'r'
 
18848
      for (unsigned int r = 0; r < 2; r++)
 
18849
      {
 
18850
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18851
        ss = r*(r + 1)*(r + 2)/6;
 
18852
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18853
      }// end loop over 'r'
 
18854
      for (unsigned int r = 0; r < 1; r++)
 
18855
      {
 
18856
        for (unsigned int s = 1; s < 2 - r; s++)
 
18857
        {
 
18858
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18859
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18860
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18861
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18862
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18863
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18864
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18865
        }// end loop over 's'
 
18866
      }// end loop over 'r'
 
18867
      for (unsigned int r = 0; r < 2; r++)
 
18868
      {
 
18869
        for (unsigned int s = 0; s < 2 - r; s++)
 
18870
        {
 
18871
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18872
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18873
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18874
        }// end loop over 's'
 
18875
      }// end loop over 'r'
 
18876
      for (unsigned int r = 0; r < 1; r++)
 
18877
      {
 
18878
        for (unsigned int s = 0; s < 1 - r; s++)
 
18879
        {
 
18880
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18881
          {
 
18882
            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;
 
18883
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18884
            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;
 
18885
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18886
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18887
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18888
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18889
          }// end loop over 't'
 
18890
        }// end loop over 's'
 
18891
      }// end loop over 'r'
 
18892
      for (unsigned int r = 0; r < 3; r++)
 
18893
      {
 
18894
        for (unsigned int s = 0; s < 3 - r; s++)
 
18895
        {
 
18896
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18897
          {
 
18898
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18899
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18900
          }// end loop over 't'
 
18901
        }// end loop over 's'
 
18902
      }// end loop over 'r'
 
18903
      
 
18904
      // Table(s) of coefficients.
 
18905
      static const double coefficients0[10] = \
 
18906
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
18907
      
 
18908
      // Compute value(s).
 
18909
      for (unsigned int r = 0; r < 10; r++)
 
18910
      {
 
18911
        values[1] += coefficients0[r]*basisvalues[r];
 
18912
      }// end loop over 'r'
 
18913
        break;
 
18914
      }
 
18915
    case 15:
 
18916
      {
 
18917
        
 
18918
      // Array of basisvalues.
 
18919
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
18920
      
 
18921
      // Declare helper variables.
 
18922
      unsigned int rr = 0;
 
18923
      unsigned int ss = 0;
 
18924
      unsigned int tt = 0;
 
18925
      double tmp5 = 0.000000000000000;
 
18926
      double tmp6 = 0.000000000000000;
 
18927
      double tmp7 = 0.000000000000000;
 
18928
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
18929
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
18930
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
18931
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
18932
      double tmp4 = tmp3*tmp3;
 
18933
      
 
18934
      // Compute basisvalues.
 
18935
      basisvalues[0] = 1.000000000000000;
 
18936
      basisvalues[1] = tmp0;
 
18937
      for (unsigned int r = 1; r < 2; r++)
 
18938
      {
 
18939
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
18940
        ss = r*(r + 1)*(r + 2)/6;
 
18941
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
18942
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
18943
      }// end loop over 'r'
 
18944
      for (unsigned int r = 0; r < 2; r++)
 
18945
      {
 
18946
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
18947
        ss = r*(r + 1)*(r + 2)/6;
 
18948
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
18949
      }// end loop over 'r'
 
18950
      for (unsigned int r = 0; r < 1; r++)
 
18951
      {
 
18952
        for (unsigned int s = 1; s < 2 - r; s++)
 
18953
        {
 
18954
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
18955
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18956
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
18957
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18958
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18959
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
18960
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
18961
        }// end loop over 's'
 
18962
      }// end loop over 'r'
 
18963
      for (unsigned int r = 0; r < 2; r++)
 
18964
      {
 
18965
        for (unsigned int s = 0; s < 2 - r; s++)
 
18966
        {
 
18967
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
18968
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
18969
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
18970
        }// end loop over 's'
 
18971
      }// end loop over 'r'
 
18972
      for (unsigned int r = 0; r < 1; r++)
 
18973
      {
 
18974
        for (unsigned int s = 0; s < 1 - r; s++)
 
18975
        {
 
18976
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
18977
          {
 
18978
            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;
 
18979
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18980
            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;
 
18981
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18982
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18983
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
18984
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
18985
          }// end loop over 't'
 
18986
        }// end loop over 's'
 
18987
      }// end loop over 'r'
 
18988
      for (unsigned int r = 0; r < 3; r++)
 
18989
      {
 
18990
        for (unsigned int s = 0; s < 3 - r; s++)
 
18991
        {
 
18992
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
18993
          {
 
18994
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
18995
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
18996
          }// end loop over 't'
 
18997
        }// end loop over 's'
 
18998
      }// end loop over 'r'
 
18999
      
 
19000
      // Table(s) of coefficients.
 
19001
      static const double coefficients0[10] = \
 
19002
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
19003
      
 
19004
      // Compute value(s).
 
19005
      for (unsigned int r = 0; r < 10; r++)
 
19006
      {
 
19007
        values[1] += coefficients0[r]*basisvalues[r];
 
19008
      }// end loop over 'r'
 
19009
        break;
 
19010
      }
 
19011
    case 16:
 
19012
      {
 
19013
        
 
19014
      // Array of basisvalues.
 
19015
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19016
      
 
19017
      // Declare helper variables.
 
19018
      unsigned int rr = 0;
 
19019
      unsigned int ss = 0;
 
19020
      unsigned int tt = 0;
 
19021
      double tmp5 = 0.000000000000000;
 
19022
      double tmp6 = 0.000000000000000;
 
19023
      double tmp7 = 0.000000000000000;
 
19024
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19025
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19026
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19027
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19028
      double tmp4 = tmp3*tmp3;
 
19029
      
 
19030
      // Compute basisvalues.
 
19031
      basisvalues[0] = 1.000000000000000;
 
19032
      basisvalues[1] = tmp0;
 
19033
      for (unsigned int r = 1; r < 2; r++)
 
19034
      {
 
19035
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19036
        ss = r*(r + 1)*(r + 2)/6;
 
19037
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19038
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19039
      }// end loop over 'r'
 
19040
      for (unsigned int r = 0; r < 2; r++)
 
19041
      {
 
19042
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19043
        ss = r*(r + 1)*(r + 2)/6;
 
19044
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19045
      }// end loop over 'r'
 
19046
      for (unsigned int r = 0; r < 1; r++)
 
19047
      {
 
19048
        for (unsigned int s = 1; s < 2 - r; s++)
 
19049
        {
 
19050
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19051
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19052
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19053
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19054
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19055
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19056
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19057
        }// end loop over 's'
 
19058
      }// end loop over 'r'
 
19059
      for (unsigned int r = 0; r < 2; r++)
 
19060
      {
 
19061
        for (unsigned int s = 0; s < 2 - r; s++)
 
19062
        {
 
19063
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19064
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19065
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19066
        }// end loop over 's'
 
19067
      }// end loop over 'r'
 
19068
      for (unsigned int r = 0; r < 1; r++)
 
19069
      {
 
19070
        for (unsigned int s = 0; s < 1 - r; s++)
 
19071
        {
 
19072
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19073
          {
 
19074
            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;
 
19075
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19076
            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;
 
19077
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19078
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19079
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19080
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19081
          }// end loop over 't'
 
19082
        }// end loop over 's'
 
19083
      }// end loop over 'r'
 
19084
      for (unsigned int r = 0; r < 3; r++)
 
19085
      {
 
19086
        for (unsigned int s = 0; s < 3 - r; s++)
 
19087
        {
 
19088
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19089
          {
 
19090
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19091
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19092
          }// end loop over 't'
 
19093
        }// end loop over 's'
 
19094
      }// end loop over 'r'
 
19095
      
 
19096
      // Table(s) of coefficients.
 
19097
      static const double coefficients0[10] = \
 
19098
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
19099
      
 
19100
      // Compute value(s).
 
19101
      for (unsigned int r = 0; r < 10; r++)
 
19102
      {
 
19103
        values[1] += coefficients0[r]*basisvalues[r];
 
19104
      }// end loop over 'r'
 
19105
        break;
 
19106
      }
 
19107
    case 17:
 
19108
      {
 
19109
        
 
19110
      // Array of basisvalues.
 
19111
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19112
      
 
19113
      // Declare helper variables.
 
19114
      unsigned int rr = 0;
 
19115
      unsigned int ss = 0;
 
19116
      unsigned int tt = 0;
 
19117
      double tmp5 = 0.000000000000000;
 
19118
      double tmp6 = 0.000000000000000;
 
19119
      double tmp7 = 0.000000000000000;
 
19120
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19121
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19122
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19123
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19124
      double tmp4 = tmp3*tmp3;
 
19125
      
 
19126
      // Compute basisvalues.
 
19127
      basisvalues[0] = 1.000000000000000;
 
19128
      basisvalues[1] = tmp0;
 
19129
      for (unsigned int r = 1; r < 2; r++)
 
19130
      {
 
19131
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19132
        ss = r*(r + 1)*(r + 2)/6;
 
19133
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19134
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19135
      }// end loop over 'r'
 
19136
      for (unsigned int r = 0; r < 2; r++)
 
19137
      {
 
19138
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19139
        ss = r*(r + 1)*(r + 2)/6;
 
19140
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19141
      }// end loop over 'r'
 
19142
      for (unsigned int r = 0; r < 1; r++)
 
19143
      {
 
19144
        for (unsigned int s = 1; s < 2 - r; s++)
 
19145
        {
 
19146
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19147
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19148
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19149
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19150
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19151
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19152
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19153
        }// end loop over 's'
 
19154
      }// end loop over 'r'
 
19155
      for (unsigned int r = 0; r < 2; r++)
 
19156
      {
 
19157
        for (unsigned int s = 0; s < 2 - r; s++)
 
19158
        {
 
19159
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19160
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19161
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19162
        }// end loop over 's'
 
19163
      }// end loop over 'r'
 
19164
      for (unsigned int r = 0; r < 1; r++)
 
19165
      {
 
19166
        for (unsigned int s = 0; s < 1 - r; s++)
 
19167
        {
 
19168
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19169
          {
 
19170
            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;
 
19171
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19172
            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;
 
19173
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19174
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19175
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19176
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19177
          }// end loop over 't'
 
19178
        }// end loop over 's'
 
19179
      }// end loop over 'r'
 
19180
      for (unsigned int r = 0; r < 3; r++)
 
19181
      {
 
19182
        for (unsigned int s = 0; s < 3 - r; s++)
 
19183
        {
 
19184
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19185
          {
 
19186
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19187
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19188
          }// end loop over 't'
 
19189
        }// end loop over 's'
 
19190
      }// end loop over 'r'
 
19191
      
 
19192
      // Table(s) of coefficients.
 
19193
      static const double coefficients0[10] = \
 
19194
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
19195
      
 
19196
      // Compute value(s).
 
19197
      for (unsigned int r = 0; r < 10; r++)
 
19198
      {
 
19199
        values[1] += coefficients0[r]*basisvalues[r];
 
19200
      }// end loop over 'r'
 
19201
        break;
 
19202
      }
 
19203
    case 18:
 
19204
      {
 
19205
        
 
19206
      // Array of basisvalues.
 
19207
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19208
      
 
19209
      // Declare helper variables.
 
19210
      unsigned int rr = 0;
 
19211
      unsigned int ss = 0;
 
19212
      unsigned int tt = 0;
 
19213
      double tmp5 = 0.000000000000000;
 
19214
      double tmp6 = 0.000000000000000;
 
19215
      double tmp7 = 0.000000000000000;
 
19216
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19217
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19218
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19219
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19220
      double tmp4 = tmp3*tmp3;
 
19221
      
 
19222
      // Compute basisvalues.
 
19223
      basisvalues[0] = 1.000000000000000;
 
19224
      basisvalues[1] = tmp0;
 
19225
      for (unsigned int r = 1; r < 2; r++)
 
19226
      {
 
19227
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19228
        ss = r*(r + 1)*(r + 2)/6;
 
19229
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19230
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19231
      }// end loop over 'r'
 
19232
      for (unsigned int r = 0; r < 2; r++)
 
19233
      {
 
19234
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19235
        ss = r*(r + 1)*(r + 2)/6;
 
19236
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19237
      }// end loop over 'r'
 
19238
      for (unsigned int r = 0; r < 1; r++)
 
19239
      {
 
19240
        for (unsigned int s = 1; s < 2 - r; s++)
 
19241
        {
 
19242
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19243
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19244
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19245
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19246
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19247
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19248
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19249
        }// end loop over 's'
 
19250
      }// end loop over 'r'
 
19251
      for (unsigned int r = 0; r < 2; r++)
 
19252
      {
 
19253
        for (unsigned int s = 0; s < 2 - r; s++)
 
19254
        {
 
19255
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19256
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19257
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19258
        }// end loop over 's'
 
19259
      }// end loop over 'r'
 
19260
      for (unsigned int r = 0; r < 1; r++)
 
19261
      {
 
19262
        for (unsigned int s = 0; s < 1 - r; s++)
 
19263
        {
 
19264
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19265
          {
 
19266
            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;
 
19267
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19268
            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;
 
19269
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19270
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19271
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19272
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19273
          }// end loop over 't'
 
19274
        }// end loop over 's'
 
19275
      }// end loop over 'r'
 
19276
      for (unsigned int r = 0; r < 3; r++)
 
19277
      {
 
19278
        for (unsigned int s = 0; s < 3 - r; s++)
 
19279
        {
 
19280
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19281
          {
 
19282
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19283
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19284
          }// end loop over 't'
 
19285
        }// end loop over 's'
 
19286
      }// end loop over 'r'
 
19287
      
 
19288
      // Table(s) of coefficients.
 
19289
      static const double coefficients0[10] = \
 
19290
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
19291
      
 
19292
      // Compute value(s).
 
19293
      for (unsigned int r = 0; r < 10; r++)
 
19294
      {
 
19295
        values[1] += coefficients0[r]*basisvalues[r];
 
19296
      }// end loop over 'r'
 
19297
        break;
 
19298
      }
 
19299
    case 19:
 
19300
      {
 
19301
        
 
19302
      // Array of basisvalues.
 
19303
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19304
      
 
19305
      // Declare helper variables.
 
19306
      unsigned int rr = 0;
 
19307
      unsigned int ss = 0;
 
19308
      unsigned int tt = 0;
 
19309
      double tmp5 = 0.000000000000000;
 
19310
      double tmp6 = 0.000000000000000;
 
19311
      double tmp7 = 0.000000000000000;
 
19312
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19313
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19314
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19315
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19316
      double tmp4 = tmp3*tmp3;
 
19317
      
 
19318
      // Compute basisvalues.
 
19319
      basisvalues[0] = 1.000000000000000;
 
19320
      basisvalues[1] = tmp0;
 
19321
      for (unsigned int r = 1; r < 2; r++)
 
19322
      {
 
19323
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19324
        ss = r*(r + 1)*(r + 2)/6;
 
19325
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19326
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19327
      }// end loop over 'r'
 
19328
      for (unsigned int r = 0; r < 2; r++)
 
19329
      {
 
19330
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19331
        ss = r*(r + 1)*(r + 2)/6;
 
19332
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19333
      }// end loop over 'r'
 
19334
      for (unsigned int r = 0; r < 1; r++)
 
19335
      {
 
19336
        for (unsigned int s = 1; s < 2 - r; s++)
 
19337
        {
 
19338
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19339
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19340
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19341
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19342
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19343
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19344
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19345
        }// end loop over 's'
 
19346
      }// end loop over 'r'
 
19347
      for (unsigned int r = 0; r < 2; r++)
 
19348
      {
 
19349
        for (unsigned int s = 0; s < 2 - r; s++)
 
19350
        {
 
19351
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19352
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19353
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19354
        }// end loop over 's'
 
19355
      }// end loop over 'r'
 
19356
      for (unsigned int r = 0; r < 1; r++)
 
19357
      {
 
19358
        for (unsigned int s = 0; s < 1 - r; s++)
 
19359
        {
 
19360
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19361
          {
 
19362
            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;
 
19363
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19364
            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;
 
19365
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19366
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19367
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19368
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19369
          }// end loop over 't'
 
19370
        }// end loop over 's'
 
19371
      }// end loop over 'r'
 
19372
      for (unsigned int r = 0; r < 3; r++)
 
19373
      {
 
19374
        for (unsigned int s = 0; s < 3 - r; s++)
 
19375
        {
 
19376
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19377
          {
 
19378
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19379
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19380
          }// end loop over 't'
 
19381
        }// end loop over 's'
 
19382
      }// end loop over 'r'
 
19383
      
 
19384
      // Table(s) of coefficients.
 
19385
      static const double coefficients0[10] = \
 
19386
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
19387
      
 
19388
      // Compute value(s).
 
19389
      for (unsigned int r = 0; r < 10; r++)
 
19390
      {
 
19391
        values[1] += coefficients0[r]*basisvalues[r];
 
19392
      }// end loop over 'r'
 
19393
        break;
 
19394
      }
 
19395
    case 20:
 
19396
      {
 
19397
        
 
19398
      // Array of basisvalues.
 
19399
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19400
      
 
19401
      // Declare helper variables.
 
19402
      unsigned int rr = 0;
 
19403
      unsigned int ss = 0;
 
19404
      unsigned int tt = 0;
 
19405
      double tmp5 = 0.000000000000000;
 
19406
      double tmp6 = 0.000000000000000;
 
19407
      double tmp7 = 0.000000000000000;
 
19408
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19409
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19410
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19411
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19412
      double tmp4 = tmp3*tmp3;
 
19413
      
 
19414
      // Compute basisvalues.
 
19415
      basisvalues[0] = 1.000000000000000;
 
19416
      basisvalues[1] = tmp0;
 
19417
      for (unsigned int r = 1; r < 2; r++)
 
19418
      {
 
19419
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19420
        ss = r*(r + 1)*(r + 2)/6;
 
19421
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19422
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19423
      }// end loop over 'r'
 
19424
      for (unsigned int r = 0; r < 2; r++)
 
19425
      {
 
19426
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19427
        ss = r*(r + 1)*(r + 2)/6;
 
19428
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19429
      }// end loop over 'r'
 
19430
      for (unsigned int r = 0; r < 1; r++)
 
19431
      {
 
19432
        for (unsigned int s = 1; s < 2 - r; s++)
 
19433
        {
 
19434
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19435
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19436
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19437
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19438
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19439
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19440
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19441
        }// end loop over 's'
 
19442
      }// end loop over 'r'
 
19443
      for (unsigned int r = 0; r < 2; r++)
 
19444
      {
 
19445
        for (unsigned int s = 0; s < 2 - r; s++)
 
19446
        {
 
19447
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19448
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19449
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19450
        }// end loop over 's'
 
19451
      }// end loop over 'r'
 
19452
      for (unsigned int r = 0; r < 1; r++)
 
19453
      {
 
19454
        for (unsigned int s = 0; s < 1 - r; s++)
 
19455
        {
 
19456
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19457
          {
 
19458
            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;
 
19459
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19460
            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;
 
19461
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19462
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19463
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19464
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19465
          }// end loop over 't'
 
19466
        }// end loop over 's'
 
19467
      }// end loop over 'r'
 
19468
      for (unsigned int r = 0; r < 3; r++)
 
19469
      {
 
19470
        for (unsigned int s = 0; s < 3 - r; s++)
 
19471
        {
 
19472
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19473
          {
 
19474
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19475
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19476
          }// end loop over 't'
 
19477
        }// end loop over 's'
 
19478
      }// end loop over 'r'
 
19479
      
 
19480
      // Table(s) of coefficients.
 
19481
      static const double coefficients0[10] = \
 
19482
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
19483
      
 
19484
      // Compute value(s).
 
19485
      for (unsigned int r = 0; r < 10; r++)
 
19486
      {
 
19487
        values[2] += coefficients0[r]*basisvalues[r];
 
19488
      }// end loop over 'r'
 
19489
        break;
 
19490
      }
 
19491
    case 21:
 
19492
      {
 
19493
        
 
19494
      // Array of basisvalues.
 
19495
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19496
      
 
19497
      // Declare helper variables.
 
19498
      unsigned int rr = 0;
 
19499
      unsigned int ss = 0;
 
19500
      unsigned int tt = 0;
 
19501
      double tmp5 = 0.000000000000000;
 
19502
      double tmp6 = 0.000000000000000;
 
19503
      double tmp7 = 0.000000000000000;
 
19504
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19505
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19506
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19507
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19508
      double tmp4 = tmp3*tmp3;
 
19509
      
 
19510
      // Compute basisvalues.
 
19511
      basisvalues[0] = 1.000000000000000;
 
19512
      basisvalues[1] = tmp0;
 
19513
      for (unsigned int r = 1; r < 2; r++)
 
19514
      {
 
19515
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19516
        ss = r*(r + 1)*(r + 2)/6;
 
19517
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19518
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19519
      }// end loop over 'r'
 
19520
      for (unsigned int r = 0; r < 2; r++)
 
19521
      {
 
19522
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19523
        ss = r*(r + 1)*(r + 2)/6;
 
19524
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19525
      }// end loop over 'r'
 
19526
      for (unsigned int r = 0; r < 1; r++)
 
19527
      {
 
19528
        for (unsigned int s = 1; s < 2 - r; s++)
 
19529
        {
 
19530
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19531
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19532
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19533
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19534
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19535
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19536
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19537
        }// end loop over 's'
 
19538
      }// end loop over 'r'
 
19539
      for (unsigned int r = 0; r < 2; r++)
 
19540
      {
 
19541
        for (unsigned int s = 0; s < 2 - r; s++)
 
19542
        {
 
19543
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19544
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19545
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19546
        }// end loop over 's'
 
19547
      }// end loop over 'r'
 
19548
      for (unsigned int r = 0; r < 1; r++)
 
19549
      {
 
19550
        for (unsigned int s = 0; s < 1 - r; s++)
 
19551
        {
 
19552
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19553
          {
 
19554
            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;
 
19555
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19556
            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;
 
19557
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19558
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19559
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19560
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19561
          }// end loop over 't'
 
19562
        }// end loop over 's'
 
19563
      }// end loop over 'r'
 
19564
      for (unsigned int r = 0; r < 3; r++)
 
19565
      {
 
19566
        for (unsigned int s = 0; s < 3 - r; s++)
 
19567
        {
 
19568
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19569
          {
 
19570
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19571
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19572
          }// end loop over 't'
 
19573
        }// end loop over 's'
 
19574
      }// end loop over 'r'
 
19575
      
 
19576
      // Table(s) of coefficients.
 
19577
      static const double coefficients0[10] = \
 
19578
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
19579
      
 
19580
      // Compute value(s).
 
19581
      for (unsigned int r = 0; r < 10; r++)
 
19582
      {
 
19583
        values[2] += coefficients0[r]*basisvalues[r];
 
19584
      }// end loop over 'r'
 
19585
        break;
 
19586
      }
 
19587
    case 22:
 
19588
      {
 
19589
        
 
19590
      // Array of basisvalues.
 
19591
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19592
      
 
19593
      // Declare helper variables.
 
19594
      unsigned int rr = 0;
 
19595
      unsigned int ss = 0;
 
19596
      unsigned int tt = 0;
 
19597
      double tmp5 = 0.000000000000000;
 
19598
      double tmp6 = 0.000000000000000;
 
19599
      double tmp7 = 0.000000000000000;
 
19600
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19601
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19602
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19603
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19604
      double tmp4 = tmp3*tmp3;
 
19605
      
 
19606
      // Compute basisvalues.
 
19607
      basisvalues[0] = 1.000000000000000;
 
19608
      basisvalues[1] = tmp0;
 
19609
      for (unsigned int r = 1; r < 2; r++)
 
19610
      {
 
19611
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19612
        ss = r*(r + 1)*(r + 2)/6;
 
19613
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19614
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19615
      }// end loop over 'r'
 
19616
      for (unsigned int r = 0; r < 2; r++)
 
19617
      {
 
19618
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19619
        ss = r*(r + 1)*(r + 2)/6;
 
19620
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19621
      }// end loop over 'r'
 
19622
      for (unsigned int r = 0; r < 1; r++)
 
19623
      {
 
19624
        for (unsigned int s = 1; s < 2 - r; s++)
 
19625
        {
 
19626
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19627
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19628
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19629
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19630
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19631
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19632
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19633
        }// end loop over 's'
 
19634
      }// end loop over 'r'
 
19635
      for (unsigned int r = 0; r < 2; r++)
 
19636
      {
 
19637
        for (unsigned int s = 0; s < 2 - r; s++)
 
19638
        {
 
19639
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19640
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19641
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19642
        }// end loop over 's'
 
19643
      }// end loop over 'r'
 
19644
      for (unsigned int r = 0; r < 1; r++)
 
19645
      {
 
19646
        for (unsigned int s = 0; s < 1 - r; s++)
 
19647
        {
 
19648
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19649
          {
 
19650
            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;
 
19651
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19652
            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;
 
19653
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19654
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19655
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19656
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19657
          }// end loop over 't'
 
19658
        }// end loop over 's'
 
19659
      }// end loop over 'r'
 
19660
      for (unsigned int r = 0; r < 3; r++)
 
19661
      {
 
19662
        for (unsigned int s = 0; s < 3 - r; s++)
 
19663
        {
 
19664
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19665
          {
 
19666
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19667
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19668
          }// end loop over 't'
 
19669
        }// end loop over 's'
 
19670
      }// end loop over 'r'
 
19671
      
 
19672
      // Table(s) of coefficients.
 
19673
      static const double coefficients0[10] = \
 
19674
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
19675
      
 
19676
      // Compute value(s).
 
19677
      for (unsigned int r = 0; r < 10; r++)
 
19678
      {
 
19679
        values[2] += coefficients0[r]*basisvalues[r];
 
19680
      }// end loop over 'r'
 
19681
        break;
 
19682
      }
 
19683
    case 23:
 
19684
      {
 
19685
        
 
19686
      // Array of basisvalues.
 
19687
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19688
      
 
19689
      // Declare helper variables.
 
19690
      unsigned int rr = 0;
 
19691
      unsigned int ss = 0;
 
19692
      unsigned int tt = 0;
 
19693
      double tmp5 = 0.000000000000000;
 
19694
      double tmp6 = 0.000000000000000;
 
19695
      double tmp7 = 0.000000000000000;
 
19696
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19697
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19698
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19699
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19700
      double tmp4 = tmp3*tmp3;
 
19701
      
 
19702
      // Compute basisvalues.
 
19703
      basisvalues[0] = 1.000000000000000;
 
19704
      basisvalues[1] = tmp0;
 
19705
      for (unsigned int r = 1; r < 2; r++)
 
19706
      {
 
19707
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19708
        ss = r*(r + 1)*(r + 2)/6;
 
19709
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19710
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19711
      }// end loop over 'r'
 
19712
      for (unsigned int r = 0; r < 2; r++)
 
19713
      {
 
19714
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19715
        ss = r*(r + 1)*(r + 2)/6;
 
19716
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19717
      }// end loop over 'r'
 
19718
      for (unsigned int r = 0; r < 1; r++)
 
19719
      {
 
19720
        for (unsigned int s = 1; s < 2 - r; s++)
 
19721
        {
 
19722
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19723
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19724
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19725
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19726
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19727
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19728
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19729
        }// end loop over 's'
 
19730
      }// end loop over 'r'
 
19731
      for (unsigned int r = 0; r < 2; r++)
 
19732
      {
 
19733
        for (unsigned int s = 0; s < 2 - r; s++)
 
19734
        {
 
19735
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19736
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19737
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19738
        }// end loop over 's'
 
19739
      }// end loop over 'r'
 
19740
      for (unsigned int r = 0; r < 1; r++)
 
19741
      {
 
19742
        for (unsigned int s = 0; s < 1 - r; s++)
 
19743
        {
 
19744
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19745
          {
 
19746
            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;
 
19747
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19748
            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;
 
19749
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19750
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19751
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19752
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19753
          }// end loop over 't'
 
19754
        }// end loop over 's'
 
19755
      }// end loop over 'r'
 
19756
      for (unsigned int r = 0; r < 3; r++)
 
19757
      {
 
19758
        for (unsigned int s = 0; s < 3 - r; s++)
 
19759
        {
 
19760
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19761
          {
 
19762
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19763
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19764
          }// end loop over 't'
 
19765
        }// end loop over 's'
 
19766
      }// end loop over 'r'
 
19767
      
 
19768
      // Table(s) of coefficients.
 
19769
      static const double coefficients0[10] = \
 
19770
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
19771
      
 
19772
      // Compute value(s).
 
19773
      for (unsigned int r = 0; r < 10; r++)
 
19774
      {
 
19775
        values[2] += coefficients0[r]*basisvalues[r];
 
19776
      }// end loop over 'r'
 
19777
        break;
 
19778
      }
 
19779
    case 24:
 
19780
      {
 
19781
        
 
19782
      // Array of basisvalues.
 
19783
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19784
      
 
19785
      // Declare helper variables.
 
19786
      unsigned int rr = 0;
 
19787
      unsigned int ss = 0;
 
19788
      unsigned int tt = 0;
 
19789
      double tmp5 = 0.000000000000000;
 
19790
      double tmp6 = 0.000000000000000;
 
19791
      double tmp7 = 0.000000000000000;
 
19792
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19793
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19794
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19795
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19796
      double tmp4 = tmp3*tmp3;
 
19797
      
 
19798
      // Compute basisvalues.
 
19799
      basisvalues[0] = 1.000000000000000;
 
19800
      basisvalues[1] = tmp0;
 
19801
      for (unsigned int r = 1; r < 2; r++)
 
19802
      {
 
19803
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19804
        ss = r*(r + 1)*(r + 2)/6;
 
19805
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19806
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19807
      }// end loop over 'r'
 
19808
      for (unsigned int r = 0; r < 2; r++)
 
19809
      {
 
19810
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19811
        ss = r*(r + 1)*(r + 2)/6;
 
19812
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19813
      }// end loop over 'r'
 
19814
      for (unsigned int r = 0; r < 1; r++)
 
19815
      {
 
19816
        for (unsigned int s = 1; s < 2 - r; s++)
 
19817
        {
 
19818
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19819
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19820
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19821
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19822
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19823
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19824
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19825
        }// end loop over 's'
 
19826
      }// end loop over 'r'
 
19827
      for (unsigned int r = 0; r < 2; r++)
 
19828
      {
 
19829
        for (unsigned int s = 0; s < 2 - r; s++)
 
19830
        {
 
19831
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19832
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19833
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19834
        }// end loop over 's'
 
19835
      }// end loop over 'r'
 
19836
      for (unsigned int r = 0; r < 1; r++)
 
19837
      {
 
19838
        for (unsigned int s = 0; s < 1 - r; s++)
 
19839
        {
 
19840
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19841
          {
 
19842
            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;
 
19843
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19844
            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;
 
19845
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19846
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19847
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19848
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19849
          }// end loop over 't'
 
19850
        }// end loop over 's'
 
19851
      }// end loop over 'r'
 
19852
      for (unsigned int r = 0; r < 3; r++)
 
19853
      {
 
19854
        for (unsigned int s = 0; s < 3 - r; s++)
 
19855
        {
 
19856
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19857
          {
 
19858
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19859
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19860
          }// end loop over 't'
 
19861
        }// end loop over 's'
 
19862
      }// end loop over 'r'
 
19863
      
 
19864
      // Table(s) of coefficients.
 
19865
      static const double coefficients0[10] = \
 
19866
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
19867
      
 
19868
      // Compute value(s).
 
19869
      for (unsigned int r = 0; r < 10; r++)
 
19870
      {
 
19871
        values[2] += coefficients0[r]*basisvalues[r];
 
19872
      }// end loop over 'r'
 
19873
        break;
 
19874
      }
 
19875
    case 25:
 
19876
      {
 
19877
        
 
19878
      // Array of basisvalues.
 
19879
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19880
      
 
19881
      // Declare helper variables.
 
19882
      unsigned int rr = 0;
 
19883
      unsigned int ss = 0;
 
19884
      unsigned int tt = 0;
 
19885
      double tmp5 = 0.000000000000000;
 
19886
      double tmp6 = 0.000000000000000;
 
19887
      double tmp7 = 0.000000000000000;
 
19888
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19889
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19890
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19891
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19892
      double tmp4 = tmp3*tmp3;
 
19893
      
 
19894
      // Compute basisvalues.
 
19895
      basisvalues[0] = 1.000000000000000;
 
19896
      basisvalues[1] = tmp0;
 
19897
      for (unsigned int r = 1; r < 2; r++)
 
19898
      {
 
19899
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19900
        ss = r*(r + 1)*(r + 2)/6;
 
19901
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19902
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19903
      }// end loop over 'r'
 
19904
      for (unsigned int r = 0; r < 2; r++)
 
19905
      {
 
19906
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
19907
        ss = r*(r + 1)*(r + 2)/6;
 
19908
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
19909
      }// end loop over 'r'
 
19910
      for (unsigned int r = 0; r < 1; r++)
 
19911
      {
 
19912
        for (unsigned int s = 1; s < 2 - r; s++)
 
19913
        {
 
19914
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
19915
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19916
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
19917
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19918
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19919
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
19920
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
19921
        }// end loop over 's'
 
19922
      }// end loop over 'r'
 
19923
      for (unsigned int r = 0; r < 2; r++)
 
19924
      {
 
19925
        for (unsigned int s = 0; s < 2 - r; s++)
 
19926
        {
 
19927
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
19928
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
19929
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
19930
        }// end loop over 's'
 
19931
      }// end loop over 'r'
 
19932
      for (unsigned int r = 0; r < 1; r++)
 
19933
      {
 
19934
        for (unsigned int s = 0; s < 1 - r; s++)
 
19935
        {
 
19936
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
19937
          {
 
19938
            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;
 
19939
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19940
            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;
 
19941
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19942
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19943
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
19944
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
19945
          }// end loop over 't'
 
19946
        }// end loop over 's'
 
19947
      }// end loop over 'r'
 
19948
      for (unsigned int r = 0; r < 3; r++)
 
19949
      {
 
19950
        for (unsigned int s = 0; s < 3 - r; s++)
 
19951
        {
 
19952
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
19953
          {
 
19954
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
19955
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
19956
          }// end loop over 't'
 
19957
        }// end loop over 's'
 
19958
      }// end loop over 'r'
 
19959
      
 
19960
      // Table(s) of coefficients.
 
19961
      static const double coefficients0[10] = \
 
19962
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
19963
      
 
19964
      // Compute value(s).
 
19965
      for (unsigned int r = 0; r < 10; r++)
 
19966
      {
 
19967
        values[2] += coefficients0[r]*basisvalues[r];
 
19968
      }// end loop over 'r'
 
19969
        break;
 
19970
      }
 
19971
    case 26:
 
19972
      {
 
19973
        
 
19974
      // Array of basisvalues.
 
19975
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
19976
      
 
19977
      // Declare helper variables.
 
19978
      unsigned int rr = 0;
 
19979
      unsigned int ss = 0;
 
19980
      unsigned int tt = 0;
 
19981
      double tmp5 = 0.000000000000000;
 
19982
      double tmp6 = 0.000000000000000;
 
19983
      double tmp7 = 0.000000000000000;
 
19984
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
19985
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
19986
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
19987
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
19988
      double tmp4 = tmp3*tmp3;
 
19989
      
 
19990
      // Compute basisvalues.
 
19991
      basisvalues[0] = 1.000000000000000;
 
19992
      basisvalues[1] = tmp0;
 
19993
      for (unsigned int r = 1; r < 2; r++)
 
19994
      {
 
19995
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
19996
        ss = r*(r + 1)*(r + 2)/6;
 
19997
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
19998
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
19999
      }// end loop over 'r'
 
20000
      for (unsigned int r = 0; r < 2; r++)
 
20001
      {
 
20002
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20003
        ss = r*(r + 1)*(r + 2)/6;
 
20004
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20005
      }// end loop over 'r'
 
20006
      for (unsigned int r = 0; r < 1; r++)
 
20007
      {
 
20008
        for (unsigned int s = 1; s < 2 - r; s++)
 
20009
        {
 
20010
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
20011
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20012
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
20013
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20014
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20015
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20016
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
20017
        }// end loop over 's'
 
20018
      }// end loop over 'r'
 
20019
      for (unsigned int r = 0; r < 2; r++)
 
20020
      {
 
20021
        for (unsigned int s = 0; s < 2 - r; s++)
 
20022
        {
 
20023
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20024
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20025
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20026
        }// end loop over 's'
 
20027
      }// end loop over 'r'
 
20028
      for (unsigned int r = 0; r < 1; r++)
 
20029
      {
 
20030
        for (unsigned int s = 0; s < 1 - r; s++)
 
20031
        {
 
20032
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
20033
          {
 
20034
            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;
 
20035
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20036
            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;
 
20037
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20038
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20039
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20040
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
20041
          }// end loop over 't'
 
20042
        }// end loop over 's'
 
20043
      }// end loop over 'r'
 
20044
      for (unsigned int r = 0; r < 3; r++)
 
20045
      {
 
20046
        for (unsigned int s = 0; s < 3 - r; s++)
 
20047
        {
 
20048
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
20049
          {
 
20050
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20051
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20052
          }// end loop over 't'
 
20053
        }// end loop over 's'
 
20054
      }// end loop over 'r'
 
20055
      
 
20056
      // Table(s) of coefficients.
 
20057
      static const double coefficients0[10] = \
 
20058
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
20059
      
 
20060
      // Compute value(s).
 
20061
      for (unsigned int r = 0; r < 10; r++)
 
20062
      {
 
20063
        values[2] += coefficients0[r]*basisvalues[r];
 
20064
      }// end loop over 'r'
 
20065
        break;
 
20066
      }
 
20067
    case 27:
 
20068
      {
 
20069
        
 
20070
      // Array of basisvalues.
 
20071
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20072
      
 
20073
      // Declare helper variables.
 
20074
      unsigned int rr = 0;
 
20075
      unsigned int ss = 0;
 
20076
      unsigned int tt = 0;
 
20077
      double tmp5 = 0.000000000000000;
 
20078
      double tmp6 = 0.000000000000000;
 
20079
      double tmp7 = 0.000000000000000;
 
20080
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20081
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
20082
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
20083
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
20084
      double tmp4 = tmp3*tmp3;
 
20085
      
 
20086
      // Compute basisvalues.
 
20087
      basisvalues[0] = 1.000000000000000;
 
20088
      basisvalues[1] = tmp0;
 
20089
      for (unsigned int r = 1; r < 2; r++)
 
20090
      {
 
20091
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
20092
        ss = r*(r + 1)*(r + 2)/6;
 
20093
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
20094
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
20095
      }// end loop over 'r'
 
20096
      for (unsigned int r = 0; r < 2; r++)
 
20097
      {
 
20098
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20099
        ss = r*(r + 1)*(r + 2)/6;
 
20100
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20101
      }// end loop over 'r'
 
20102
      for (unsigned int r = 0; r < 1; r++)
 
20103
      {
 
20104
        for (unsigned int s = 1; s < 2 - r; s++)
 
20105
        {
 
20106
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
20107
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20108
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
20109
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20110
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20111
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20112
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
20113
        }// end loop over 's'
 
20114
      }// end loop over 'r'
 
20115
      for (unsigned int r = 0; r < 2; r++)
 
20116
      {
 
20117
        for (unsigned int s = 0; s < 2 - r; s++)
 
20118
        {
 
20119
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20120
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20121
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20122
        }// end loop over 's'
 
20123
      }// end loop over 'r'
 
20124
      for (unsigned int r = 0; r < 1; r++)
 
20125
      {
 
20126
        for (unsigned int s = 0; s < 1 - r; s++)
 
20127
        {
 
20128
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
20129
          {
 
20130
            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;
 
20131
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20132
            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;
 
20133
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20134
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20135
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20136
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
20137
          }// end loop over 't'
 
20138
        }// end loop over 's'
 
20139
      }// end loop over 'r'
 
20140
      for (unsigned int r = 0; r < 3; r++)
 
20141
      {
 
20142
        for (unsigned int s = 0; s < 3 - r; s++)
 
20143
        {
 
20144
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
20145
          {
 
20146
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20147
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20148
          }// end loop over 't'
 
20149
        }// end loop over 's'
 
20150
      }// end loop over 'r'
 
20151
      
 
20152
      // Table(s) of coefficients.
 
20153
      static const double coefficients0[10] = \
 
20154
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
20155
      
 
20156
      // Compute value(s).
 
20157
      for (unsigned int r = 0; r < 10; r++)
 
20158
      {
 
20159
        values[2] += coefficients0[r]*basisvalues[r];
 
20160
      }// end loop over 'r'
 
20161
        break;
 
20162
      }
 
20163
    case 28:
 
20164
      {
 
20165
        
 
20166
      // Array of basisvalues.
 
20167
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20168
      
 
20169
      // Declare helper variables.
 
20170
      unsigned int rr = 0;
 
20171
      unsigned int ss = 0;
 
20172
      unsigned int tt = 0;
 
20173
      double tmp5 = 0.000000000000000;
 
20174
      double tmp6 = 0.000000000000000;
 
20175
      double tmp7 = 0.000000000000000;
 
20176
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20177
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
20178
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
20179
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
20180
      double tmp4 = tmp3*tmp3;
 
20181
      
 
20182
      // Compute basisvalues.
 
20183
      basisvalues[0] = 1.000000000000000;
 
20184
      basisvalues[1] = tmp0;
 
20185
      for (unsigned int r = 1; r < 2; r++)
 
20186
      {
 
20187
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
20188
        ss = r*(r + 1)*(r + 2)/6;
 
20189
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
20190
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
20191
      }// end loop over 'r'
 
20192
      for (unsigned int r = 0; r < 2; r++)
 
20193
      {
 
20194
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20195
        ss = r*(r + 1)*(r + 2)/6;
 
20196
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20197
      }// end loop over 'r'
 
20198
      for (unsigned int r = 0; r < 1; r++)
 
20199
      {
 
20200
        for (unsigned int s = 1; s < 2 - r; s++)
 
20201
        {
 
20202
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
20203
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20204
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
20205
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20206
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20207
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20208
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
20209
        }// end loop over 's'
 
20210
      }// end loop over 'r'
 
20211
      for (unsigned int r = 0; r < 2; r++)
 
20212
      {
 
20213
        for (unsigned int s = 0; s < 2 - r; s++)
 
20214
        {
 
20215
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20216
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20217
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20218
        }// end loop over 's'
 
20219
      }// end loop over 'r'
 
20220
      for (unsigned int r = 0; r < 1; r++)
 
20221
      {
 
20222
        for (unsigned int s = 0; s < 1 - r; s++)
 
20223
        {
 
20224
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
20225
          {
 
20226
            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;
 
20227
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20228
            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;
 
20229
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20230
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20231
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20232
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
20233
          }// end loop over 't'
 
20234
        }// end loop over 's'
 
20235
      }// end loop over 'r'
 
20236
      for (unsigned int r = 0; r < 3; r++)
 
20237
      {
 
20238
        for (unsigned int s = 0; s < 3 - r; s++)
 
20239
        {
 
20240
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
20241
          {
 
20242
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20243
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20244
          }// end loop over 't'
 
20245
        }// end loop over 's'
 
20246
      }// end loop over 'r'
 
20247
      
 
20248
      // Table(s) of coefficients.
 
20249
      static const double coefficients0[10] = \
 
20250
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
20251
      
 
20252
      // Compute value(s).
 
20253
      for (unsigned int r = 0; r < 10; r++)
 
20254
      {
 
20255
        values[2] += coefficients0[r]*basisvalues[r];
 
20256
      }// end loop over 'r'
 
20257
        break;
 
20258
      }
 
20259
    case 29:
 
20260
      {
 
20261
        
 
20262
      // Array of basisvalues.
 
20263
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20264
      
 
20265
      // Declare helper variables.
 
20266
      unsigned int rr = 0;
 
20267
      unsigned int ss = 0;
 
20268
      unsigned int tt = 0;
 
20269
      double tmp5 = 0.000000000000000;
 
20270
      double tmp6 = 0.000000000000000;
 
20271
      double tmp7 = 0.000000000000000;
 
20272
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20273
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
20274
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
20275
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
20276
      double tmp4 = tmp3*tmp3;
 
20277
      
 
20278
      // Compute basisvalues.
 
20279
      basisvalues[0] = 1.000000000000000;
 
20280
      basisvalues[1] = tmp0;
 
20281
      for (unsigned int r = 1; r < 2; r++)
 
20282
      {
 
20283
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
20284
        ss = r*(r + 1)*(r + 2)/6;
 
20285
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
20286
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
20287
      }// end loop over 'r'
 
20288
      for (unsigned int r = 0; r < 2; r++)
 
20289
      {
 
20290
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20291
        ss = r*(r + 1)*(r + 2)/6;
 
20292
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20293
      }// end loop over 'r'
 
20294
      for (unsigned int r = 0; r < 1; r++)
 
20295
      {
 
20296
        for (unsigned int s = 1; s < 2 - r; s++)
 
20297
        {
 
20298
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
20299
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20300
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
20301
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20302
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20303
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20304
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
20305
        }// end loop over 's'
 
20306
      }// end loop over 'r'
 
20307
      for (unsigned int r = 0; r < 2; r++)
 
20308
      {
 
20309
        for (unsigned int s = 0; s < 2 - r; s++)
 
20310
        {
 
20311
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20312
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20313
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20314
        }// end loop over 's'
 
20315
      }// end loop over 'r'
 
20316
      for (unsigned int r = 0; r < 1; r++)
 
20317
      {
 
20318
        for (unsigned int s = 0; s < 1 - r; s++)
 
20319
        {
 
20320
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
20321
          {
 
20322
            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;
 
20323
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20324
            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;
 
20325
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20326
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20327
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20328
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
20329
          }// end loop over 't'
 
20330
        }// end loop over 's'
 
20331
      }// end loop over 'r'
 
20332
      for (unsigned int r = 0; r < 3; r++)
 
20333
      {
 
20334
        for (unsigned int s = 0; s < 3 - r; s++)
 
20335
        {
 
20336
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
20337
          {
 
20338
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20339
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20340
          }// end loop over 't'
 
20341
        }// end loop over 's'
 
20342
      }// end loop over 'r'
 
20343
      
 
20344
      // Table(s) of coefficients.
 
20345
      static const double coefficients0[10] = \
 
20346
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
20347
      
 
20348
      // Compute value(s).
 
20349
      for (unsigned int r = 0; r < 10; r++)
 
20350
      {
 
20351
        values[2] += coefficients0[r]*basisvalues[r];
 
20352
      }// end loop over 'r'
 
20353
        break;
 
20354
      }
 
20355
    case 30:
 
20356
      {
 
20357
        
 
20358
      // Array of basisvalues.
 
20359
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20360
      
 
20361
      // Declare helper variables.
 
20362
      unsigned int rr = 0;
 
20363
      unsigned int ss = 0;
 
20364
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20365
      
 
20366
      // Compute basisvalues.
 
20367
      basisvalues[0] = 1.000000000000000;
 
20368
      basisvalues[1] = tmp0;
 
20369
      for (unsigned int r = 0; r < 1; r++)
 
20370
      {
 
20371
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20372
        ss = r*(r + 1)*(r + 2)/6;
 
20373
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20374
      }// end loop over 'r'
 
20375
      for (unsigned int r = 0; r < 1; r++)
 
20376
      {
 
20377
        for (unsigned int s = 0; s < 1 - r; s++)
 
20378
        {
 
20379
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20380
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20381
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20382
        }// end loop over 's'
 
20383
      }// end loop over 'r'
 
20384
      for (unsigned int r = 0; r < 2; r++)
 
20385
      {
 
20386
        for (unsigned int s = 0; s < 2 - r; s++)
 
20387
        {
 
20388
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20389
          {
 
20390
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20391
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20392
          }// end loop over 't'
 
20393
        }// end loop over 's'
 
20394
      }// end loop over 'r'
 
20395
      
 
20396
      // Table(s) of coefficients.
 
20397
      static const double coefficients0[4] = \
 
20398
      {0.288675134594813, -0.182574185835055, -0.105409255338946, -0.074535599249993};
 
20399
      
 
20400
      // Compute value(s).
 
20401
      for (unsigned int r = 0; r < 4; r++)
 
20402
      {
 
20403
        values[3] += coefficients0[r]*basisvalues[r];
 
20404
      }// end loop over 'r'
 
20405
        break;
 
20406
      }
 
20407
    case 31:
 
20408
      {
 
20409
        
 
20410
      // Array of basisvalues.
 
20411
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20412
      
 
20413
      // Declare helper variables.
 
20414
      unsigned int rr = 0;
 
20415
      unsigned int ss = 0;
 
20416
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20417
      
 
20418
      // Compute basisvalues.
 
20419
      basisvalues[0] = 1.000000000000000;
 
20420
      basisvalues[1] = tmp0;
 
20421
      for (unsigned int r = 0; r < 1; r++)
 
20422
      {
 
20423
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20424
        ss = r*(r + 1)*(r + 2)/6;
 
20425
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20426
      }// end loop over 'r'
 
20427
      for (unsigned int r = 0; r < 1; r++)
 
20428
      {
 
20429
        for (unsigned int s = 0; s < 1 - r; s++)
 
20430
        {
 
20431
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20432
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20433
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20434
        }// end loop over 's'
 
20435
      }// end loop over 'r'
 
20436
      for (unsigned int r = 0; r < 2; r++)
 
20437
      {
 
20438
        for (unsigned int s = 0; s < 2 - r; s++)
 
20439
        {
 
20440
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20441
          {
 
20442
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20443
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20444
          }// end loop over 't'
 
20445
        }// end loop over 's'
 
20446
      }// end loop over 'r'
 
20447
      
 
20448
      // Table(s) of coefficients.
 
20449
      static const double coefficients0[4] = \
 
20450
      {0.288675134594813, 0.182574185835055, -0.105409255338946, -0.074535599249993};
 
20451
      
 
20452
      // Compute value(s).
 
20453
      for (unsigned int r = 0; r < 4; r++)
 
20454
      {
 
20455
        values[3] += coefficients0[r]*basisvalues[r];
 
20456
      }// end loop over 'r'
 
20457
        break;
 
20458
      }
 
20459
    case 32:
 
20460
      {
 
20461
        
 
20462
      // Array of basisvalues.
 
20463
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20464
      
 
20465
      // Declare helper variables.
 
20466
      unsigned int rr = 0;
 
20467
      unsigned int ss = 0;
 
20468
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20469
      
 
20470
      // Compute basisvalues.
 
20471
      basisvalues[0] = 1.000000000000000;
 
20472
      basisvalues[1] = tmp0;
 
20473
      for (unsigned int r = 0; r < 1; r++)
 
20474
      {
 
20475
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20476
        ss = r*(r + 1)*(r + 2)/6;
 
20477
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20478
      }// end loop over 'r'
 
20479
      for (unsigned int r = 0; r < 1; r++)
 
20480
      {
 
20481
        for (unsigned int s = 0; s < 1 - r; s++)
 
20482
        {
 
20483
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20484
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20485
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20486
        }// end loop over 's'
 
20487
      }// end loop over 'r'
 
20488
      for (unsigned int r = 0; r < 2; r++)
 
20489
      {
 
20490
        for (unsigned int s = 0; s < 2 - r; s++)
 
20491
        {
 
20492
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20493
          {
 
20494
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20495
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20496
          }// end loop over 't'
 
20497
        }// end loop over 's'
 
20498
      }// end loop over 'r'
 
20499
      
 
20500
      // Table(s) of coefficients.
 
20501
      static const double coefficients0[4] = \
 
20502
      {0.288675134594813, 0.000000000000000, 0.210818510677892, -0.074535599249993};
 
20503
      
 
20504
      // Compute value(s).
 
20505
      for (unsigned int r = 0; r < 4; r++)
 
20506
      {
 
20507
        values[3] += coefficients0[r]*basisvalues[r];
 
20508
      }// end loop over 'r'
 
20509
        break;
 
20510
      }
 
20511
    case 33:
 
20512
      {
 
20513
        
 
20514
      // Array of basisvalues.
 
20515
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20516
      
 
20517
      // Declare helper variables.
 
20518
      unsigned int rr = 0;
 
20519
      unsigned int ss = 0;
 
20520
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20521
      
 
20522
      // Compute basisvalues.
 
20523
      basisvalues[0] = 1.000000000000000;
 
20524
      basisvalues[1] = tmp0;
 
20525
      for (unsigned int r = 0; r < 1; r++)
 
20526
      {
 
20527
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20528
        ss = r*(r + 1)*(r + 2)/6;
 
20529
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20530
      }// end loop over 'r'
 
20531
      for (unsigned int r = 0; r < 1; r++)
 
20532
      {
 
20533
        for (unsigned int s = 0; s < 1 - r; s++)
 
20534
        {
 
20535
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20536
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20537
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20538
        }// end loop over 's'
 
20539
      }// end loop over 'r'
 
20540
      for (unsigned int r = 0; r < 2; r++)
 
20541
      {
 
20542
        for (unsigned int s = 0; s < 2 - r; s++)
 
20543
        {
 
20544
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
20545
          {
 
20546
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20547
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20548
          }// end loop over 't'
 
20549
        }// end loop over 's'
 
20550
      }// end loop over 'r'
 
20551
      
 
20552
      // Table(s) of coefficients.
 
20553
      static const double coefficients0[4] = \
 
20554
      {0.288675134594813, 0.000000000000000, 0.000000000000000, 0.223606797749979};
 
20555
      
 
20556
      // Compute value(s).
 
20557
      for (unsigned int r = 0; r < 4; r++)
 
20558
      {
 
20559
        values[3] += coefficients0[r]*basisvalues[r];
 
20560
      }// end loop over 'r'
 
20561
        break;
 
20562
      }
 
20563
    }
 
20564
    
 
20565
  }
 
20566
 
 
20567
  /// Evaluate all basis functions at given point in cell
 
20568
  virtual void evaluate_basis_all(double* values,
 
20569
                                  const double* coordinates,
 
20570
                                  const ufc::cell& c) const
 
20571
  {
 
20572
    // Helper variable to hold values of a single dof.
 
20573
    double dof_values[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20574
    
 
20575
    // Loop dofs and call evaluate_basis.
 
20576
    for (unsigned int r = 0; r < 34; r++)
 
20577
    {
 
20578
      evaluate_basis(r, dof_values, coordinates, c);
 
20579
      for (unsigned int s = 0; s < 4; s++)
 
20580
      {
 
20581
        values[r*4 + s] = dof_values[s];
 
20582
      }// end loop over 's'
 
20583
    }// end loop over 'r'
 
20584
  }
 
20585
 
 
20586
  /// Evaluate order n derivatives of basis function i at given point in cell
 
20587
  virtual void evaluate_basis_derivatives(unsigned int i,
 
20588
                                          unsigned int n,
 
20589
                                          double* values,
 
20590
                                          const double* coordinates,
 
20591
                                          const ufc::cell& c) const
 
20592
  {
 
20593
    // Extract vertex coordinates
 
20594
    const double * const * x = c.coordinates;
 
20595
    
 
20596
    // Compute Jacobian of affine map from reference cell
 
20597
    const double J_00 = x[1][0] - x[0][0];
 
20598
    const double J_01 = x[2][0] - x[0][0];
 
20599
    const double J_02 = x[3][0] - x[0][0];
 
20600
    const double J_10 = x[1][1] - x[0][1];
 
20601
    const double J_11 = x[2][1] - x[0][1];
 
20602
    const double J_12 = x[3][1] - x[0][1];
 
20603
    const double J_20 = x[1][2] - x[0][2];
 
20604
    const double J_21 = x[2][2] - x[0][2];
 
20605
    const double J_22 = x[3][2] - x[0][2];
 
20606
    
 
20607
    // Compute sub determinants
 
20608
    const double d_00 = J_11*J_22 - J_12*J_21;
 
20609
    const double d_01 = J_12*J_20 - J_10*J_22;
 
20610
    const double d_02 = J_10*J_21 - J_11*J_20;
 
20611
    const double d_10 = J_02*J_21 - J_01*J_22;
 
20612
    const double d_11 = J_00*J_22 - J_02*J_20;
 
20613
    const double d_12 = J_01*J_20 - J_00*J_21;
 
20614
    const double d_20 = J_01*J_12 - J_02*J_11;
 
20615
    const double d_21 = J_02*J_10 - J_00*J_12;
 
20616
    const double d_22 = J_00*J_11 - J_01*J_10;
 
20617
    
 
20618
    // Compute determinant of Jacobian
 
20619
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
20620
    
 
20621
    // Compute inverse of Jacobian
 
20622
    const double K_00 = d_00 / detJ;
 
20623
    const double K_01 = d_10 / detJ;
 
20624
    const double K_02 = d_20 / detJ;
 
20625
    const double K_10 = d_01 / detJ;
 
20626
    const double K_11 = d_11 / detJ;
 
20627
    const double K_12 = d_21 / detJ;
 
20628
    const double K_20 = d_02 / detJ;
 
20629
    const double K_21 = d_12 / detJ;
 
20630
    const double K_22 = d_22 / detJ;
 
20631
    
 
20632
    // Compute constants
 
20633
    const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
 
20634
    const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
 
20635
    const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
 
20636
    
 
20637
    // Get coordinates and map to the reference (FIAT) element
 
20638
    double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
 
20639
    double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
 
20640
    double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
 
20641
    
 
20642
    
 
20643
    // Compute number of derivatives.
 
20644
    unsigned int num_derivatives = 1;
 
20645
    for (unsigned int r = 0; r < n; r++)
 
20646
    {
 
20647
      num_derivatives *= 3;
 
20648
    }// end loop over 'r'
 
20649
    
 
20650
    // Declare pointer to two dimensional array that holds combinations of derivatives and initialise
 
20651
    unsigned int **combinations = new unsigned int *[num_derivatives];
 
20652
    for (unsigned int row = 0; row < num_derivatives; row++)
 
20653
    {
 
20654
      combinations[row] = new unsigned int [n];
 
20655
      for (unsigned int col = 0; col < n; col++)
 
20656
        combinations[row][col] = 0;
 
20657
    }
 
20658
    
 
20659
    // Generate combinations of derivatives
 
20660
    for (unsigned int row = 1; row < num_derivatives; row++)
 
20661
    {
 
20662
      for (unsigned int num = 0; num < row; num++)
 
20663
      {
 
20664
        for (unsigned int col = n-1; col+1 > 0; col--)
 
20665
        {
 
20666
          if (combinations[row][col] + 1 > 2)
 
20667
            combinations[row][col] = 0;
 
20668
          else
 
20669
          {
 
20670
            combinations[row][col] += 1;
 
20671
            break;
 
20672
          }
 
20673
        }
 
20674
      }
 
20675
    }
 
20676
    
 
20677
    // Compute inverse of Jacobian
 
20678
    const double Jinv[3][3] = {{K_00, K_01, K_02}, {K_10, K_11, K_12}, {K_20, K_21, K_22}};
 
20679
    
 
20680
    // Declare transformation matrix
 
20681
    // Declare pointer to two dimensional array and initialise
 
20682
    double **transform = new double *[num_derivatives];
 
20683
    
 
20684
    for (unsigned int j = 0; j < num_derivatives; j++)
 
20685
    {
 
20686
      transform[j] = new double [num_derivatives];
 
20687
      for (unsigned int k = 0; k < num_derivatives; k++)
 
20688
        transform[j][k] = 1;
 
20689
    }
 
20690
    
 
20691
    // Construct transformation matrix
 
20692
    for (unsigned int row = 0; row < num_derivatives; row++)
 
20693
    {
 
20694
      for (unsigned int col = 0; col < num_derivatives; col++)
 
20695
      {
 
20696
        for (unsigned int k = 0; k < n; k++)
 
20697
          transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
 
20698
      }
 
20699
    }
 
20700
    
 
20701
    // Reset values. Assuming that values is always an array.
 
20702
    for (unsigned int r = 0; r < 4*num_derivatives; r++)
 
20703
    {
 
20704
      values[r] = 0.000000000000000;
 
20705
    }// end loop over 'r'
 
20706
    
 
20707
    switch (i)
 
20708
    {
 
20709
    case 0:
 
20710
      {
 
20711
        
 
20712
      // Array of basisvalues.
 
20713
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20714
      
 
20715
      // Declare helper variables.
 
20716
      unsigned int rr = 0;
 
20717
      unsigned int ss = 0;
 
20718
      unsigned int tt = 0;
 
20719
      double tmp5 = 0.000000000000000;
 
20720
      double tmp6 = 0.000000000000000;
 
20721
      double tmp7 = 0.000000000000000;
 
20722
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20723
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
20724
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
20725
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
20726
      double tmp4 = tmp3*tmp3;
 
20727
      
 
20728
      // Compute basisvalues.
 
20729
      basisvalues[0] = 1.000000000000000;
 
20730
      basisvalues[1] = tmp0;
 
20731
      for (unsigned int r = 1; r < 2; r++)
 
20732
      {
 
20733
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
20734
        ss = r*(r + 1)*(r + 2)/6;
 
20735
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
20736
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
20737
      }// end loop over 'r'
 
20738
      for (unsigned int r = 0; r < 2; r++)
 
20739
      {
 
20740
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
20741
        ss = r*(r + 1)*(r + 2)/6;
 
20742
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
20743
      }// end loop over 'r'
 
20744
      for (unsigned int r = 0; r < 1; r++)
 
20745
      {
 
20746
        for (unsigned int s = 1; s < 2 - r; s++)
 
20747
        {
 
20748
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
20749
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20750
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
20751
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20752
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20753
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
20754
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
20755
        }// end loop over 's'
 
20756
      }// end loop over 'r'
 
20757
      for (unsigned int r = 0; r < 2; r++)
 
20758
      {
 
20759
        for (unsigned int s = 0; s < 2 - r; s++)
 
20760
        {
 
20761
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
20762
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
20763
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
20764
        }// end loop over 's'
 
20765
      }// end loop over 'r'
 
20766
      for (unsigned int r = 0; r < 1; r++)
 
20767
      {
 
20768
        for (unsigned int s = 0; s < 1 - r; s++)
 
20769
        {
 
20770
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
20771
          {
 
20772
            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;
 
20773
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20774
            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;
 
20775
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20776
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20777
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
20778
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
20779
          }// end loop over 't'
 
20780
        }// end loop over 's'
 
20781
      }// end loop over 'r'
 
20782
      for (unsigned int r = 0; r < 3; r++)
 
20783
      {
 
20784
        for (unsigned int s = 0; s < 3 - r; s++)
 
20785
        {
 
20786
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
20787
          {
 
20788
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
20789
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
20790
          }// end loop over 't'
 
20791
        }// end loop over 's'
 
20792
      }// end loop over 'r'
 
20793
      
 
20794
      // Table(s) of coefficients.
 
20795
      static const double coefficients0[10] = \
 
20796
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
20797
      
 
20798
      // Tables of derivatives of the polynomial base (transpose).
 
20799
      static const double dmats0[10][10] = \
 
20800
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20801
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20802
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20803
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20804
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20805
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20806
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20807
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20808
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20809
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
20810
      
 
20811
      static const double dmats1[10][10] = \
 
20812
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20813
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20814
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20815
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20816
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20817
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20818
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20819
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20820
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20821
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
20822
      
 
20823
      static const double dmats2[10][10] = \
 
20824
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20825
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20826
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20827
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20828
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20829
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20830
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20831
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20832
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20833
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
20834
      
 
20835
      // Compute reference derivatives.
 
20836
      // Declare pointer to array of derivatives on FIAT element.
 
20837
      double *derivatives = new double[num_derivatives];
 
20838
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20839
      {
 
20840
        derivatives[r] = 0.000000000000000;
 
20841
      }// end loop over 'r'
 
20842
      
 
20843
      // Declare derivative matrix (of polynomial basis).
 
20844
      double dmats[10][10] = \
 
20845
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20846
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20847
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20848
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20849
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20850
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20851
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20852
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
20853
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
20854
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
20855
      
 
20856
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
20857
      double dmats_old[10][10] = \
 
20858
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20859
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20860
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20861
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20862
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20863
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20864
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
20865
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
20866
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
20867
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
20868
      
 
20869
      // Loop possible derivatives.
 
20870
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20871
      {
 
20872
        // Resetting dmats values to compute next derivative.
 
20873
        for (unsigned int t = 0; t < 10; t++)
 
20874
        {
 
20875
          for (unsigned int u = 0; u < 10; u++)
 
20876
          {
 
20877
            dmats[t][u] = 0.000000000000000;
 
20878
            if (t == u)
 
20879
            {
 
20880
            dmats[t][u] = 1.000000000000000;
 
20881
            }
 
20882
            
 
20883
          }// end loop over 'u'
 
20884
        }// end loop over 't'
 
20885
        
 
20886
        // Looping derivative order to generate dmats.
 
20887
        for (unsigned int s = 0; s < n; s++)
 
20888
        {
 
20889
          // Updating dmats_old with new values and resetting dmats.
 
20890
          for (unsigned int t = 0; t < 10; t++)
 
20891
          {
 
20892
            for (unsigned int u = 0; u < 10; u++)
 
20893
            {
 
20894
              dmats_old[t][u] = dmats[t][u];
 
20895
              dmats[t][u] = 0.000000000000000;
 
20896
            }// end loop over 'u'
 
20897
          }// end loop over 't'
 
20898
          
 
20899
          // Update dmats using an inner product.
 
20900
          if (combinations[r][s] == 0)
 
20901
          {
 
20902
          for (unsigned int t = 0; t < 10; t++)
 
20903
          {
 
20904
            for (unsigned int u = 0; u < 10; u++)
 
20905
            {
 
20906
              for (unsigned int tu = 0; tu < 10; tu++)
 
20907
              {
 
20908
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
20909
              }// end loop over 'tu'
 
20910
            }// end loop over 'u'
 
20911
          }// end loop over 't'
 
20912
          }
 
20913
          
 
20914
          if (combinations[r][s] == 1)
 
20915
          {
 
20916
          for (unsigned int t = 0; t < 10; t++)
 
20917
          {
 
20918
            for (unsigned int u = 0; u < 10; u++)
 
20919
            {
 
20920
              for (unsigned int tu = 0; tu < 10; tu++)
 
20921
              {
 
20922
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
20923
              }// end loop over 'tu'
 
20924
            }// end loop over 'u'
 
20925
          }// end loop over 't'
 
20926
          }
 
20927
          
 
20928
          if (combinations[r][s] == 2)
 
20929
          {
 
20930
          for (unsigned int t = 0; t < 10; t++)
 
20931
          {
 
20932
            for (unsigned int u = 0; u < 10; u++)
 
20933
            {
 
20934
              for (unsigned int tu = 0; tu < 10; tu++)
 
20935
              {
 
20936
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
20937
              }// end loop over 'tu'
 
20938
            }// end loop over 'u'
 
20939
          }// end loop over 't'
 
20940
          }
 
20941
          
 
20942
        }// end loop over 's'
 
20943
        for (unsigned int s = 0; s < 10; s++)
 
20944
        {
 
20945
          for (unsigned int t = 0; t < 10; t++)
 
20946
          {
 
20947
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
20948
          }// end loop over 't'
 
20949
        }// end loop over 's'
 
20950
      }// end loop over 'r'
 
20951
      
 
20952
      // Transform derivatives back to physical element
 
20953
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20954
      {
 
20955
        for (unsigned int s = 0; s < num_derivatives; s++)
 
20956
        {
 
20957
          values[r] += transform[r][s]*derivatives[s];
 
20958
        }// end loop over 's'
 
20959
      }// end loop over 'r'
 
20960
      
 
20961
      // Delete pointer to array of derivatives on FIAT element
 
20962
      delete [] derivatives;
 
20963
      
 
20964
      // Delete pointer to array of combinations of derivatives and transform
 
20965
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20966
      {
 
20967
        delete [] combinations[r];
 
20968
      }// end loop over 'r'
 
20969
      delete [] combinations;
 
20970
      for (unsigned int r = 0; r < num_derivatives; r++)
 
20971
      {
 
20972
        delete [] transform[r];
 
20973
      }// end loop over 'r'
 
20974
      delete [] transform;
 
20975
        break;
 
20976
      }
 
20977
    case 1:
 
20978
      {
 
20979
        
 
20980
      // Array of basisvalues.
 
20981
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
20982
      
 
20983
      // Declare helper variables.
 
20984
      unsigned int rr = 0;
 
20985
      unsigned int ss = 0;
 
20986
      unsigned int tt = 0;
 
20987
      double tmp5 = 0.000000000000000;
 
20988
      double tmp6 = 0.000000000000000;
 
20989
      double tmp7 = 0.000000000000000;
 
20990
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
20991
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
20992
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
20993
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
20994
      double tmp4 = tmp3*tmp3;
 
20995
      
 
20996
      // Compute basisvalues.
 
20997
      basisvalues[0] = 1.000000000000000;
 
20998
      basisvalues[1] = tmp0;
 
20999
      for (unsigned int r = 1; r < 2; r++)
 
21000
      {
 
21001
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
21002
        ss = r*(r + 1)*(r + 2)/6;
 
21003
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
21004
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
21005
      }// end loop over 'r'
 
21006
      for (unsigned int r = 0; r < 2; r++)
 
21007
      {
 
21008
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21009
        ss = r*(r + 1)*(r + 2)/6;
 
21010
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
21011
      }// end loop over 'r'
 
21012
      for (unsigned int r = 0; r < 1; r++)
 
21013
      {
 
21014
        for (unsigned int s = 1; s < 2 - r; s++)
 
21015
        {
 
21016
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
21017
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21018
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
21019
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21020
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21021
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21022
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
21023
        }// end loop over 's'
 
21024
      }// end loop over 'r'
 
21025
      for (unsigned int r = 0; r < 2; r++)
 
21026
      {
 
21027
        for (unsigned int s = 0; s < 2 - r; s++)
 
21028
        {
 
21029
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21030
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21031
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
21032
        }// end loop over 's'
 
21033
      }// end loop over 'r'
 
21034
      for (unsigned int r = 0; r < 1; r++)
 
21035
      {
 
21036
        for (unsigned int s = 0; s < 1 - r; s++)
 
21037
        {
 
21038
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
21039
          {
 
21040
            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;
 
21041
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21042
            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;
 
21043
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21044
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21045
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21046
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
21047
          }// end loop over 't'
 
21048
        }// end loop over 's'
 
21049
      }// end loop over 'r'
 
21050
      for (unsigned int r = 0; r < 3; r++)
 
21051
      {
 
21052
        for (unsigned int s = 0; s < 3 - r; s++)
 
21053
        {
 
21054
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
21055
          {
 
21056
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21057
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
21058
          }// end loop over 't'
 
21059
        }// end loop over 's'
 
21060
      }// end loop over 'r'
 
21061
      
 
21062
      // Table(s) of coefficients.
 
21063
      static const double coefficients0[10] = \
 
21064
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
21065
      
 
21066
      // Tables of derivatives of the polynomial base (transpose).
 
21067
      static const double dmats0[10][10] = \
 
21068
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21069
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21070
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21071
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21072
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21073
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21074
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21075
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21076
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21077
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21078
      
 
21079
      static const double dmats1[10][10] = \
 
21080
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21081
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21082
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21083
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21084
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21085
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21086
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21087
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21088
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21089
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21090
      
 
21091
      static const double dmats2[10][10] = \
 
21092
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21093
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21094
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21095
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21096
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21097
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21098
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21099
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21100
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21101
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21102
      
 
21103
      // Compute reference derivatives.
 
21104
      // Declare pointer to array of derivatives on FIAT element.
 
21105
      double *derivatives = new double[num_derivatives];
 
21106
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21107
      {
 
21108
        derivatives[r] = 0.000000000000000;
 
21109
      }// end loop over 'r'
 
21110
      
 
21111
      // Declare derivative matrix (of polynomial basis).
 
21112
      double dmats[10][10] = \
 
21113
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21114
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21115
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21116
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21117
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21118
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21119
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21120
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21121
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21122
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21123
      
 
21124
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21125
      double dmats_old[10][10] = \
 
21126
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21127
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21128
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21129
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21130
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21131
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21132
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21133
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21134
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21135
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21136
      
 
21137
      // Loop possible derivatives.
 
21138
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21139
      {
 
21140
        // Resetting dmats values to compute next derivative.
 
21141
        for (unsigned int t = 0; t < 10; t++)
 
21142
        {
 
21143
          for (unsigned int u = 0; u < 10; u++)
 
21144
          {
 
21145
            dmats[t][u] = 0.000000000000000;
 
21146
            if (t == u)
 
21147
            {
 
21148
            dmats[t][u] = 1.000000000000000;
 
21149
            }
 
21150
            
 
21151
          }// end loop over 'u'
 
21152
        }// end loop over 't'
 
21153
        
 
21154
        // Looping derivative order to generate dmats.
 
21155
        for (unsigned int s = 0; s < n; s++)
 
21156
        {
 
21157
          // Updating dmats_old with new values and resetting dmats.
 
21158
          for (unsigned int t = 0; t < 10; t++)
 
21159
          {
 
21160
            for (unsigned int u = 0; u < 10; u++)
 
21161
            {
 
21162
              dmats_old[t][u] = dmats[t][u];
 
21163
              dmats[t][u] = 0.000000000000000;
 
21164
            }// end loop over 'u'
 
21165
          }// end loop over 't'
 
21166
          
 
21167
          // Update dmats using an inner product.
 
21168
          if (combinations[r][s] == 0)
 
21169
          {
 
21170
          for (unsigned int t = 0; t < 10; t++)
 
21171
          {
 
21172
            for (unsigned int u = 0; u < 10; u++)
 
21173
            {
 
21174
              for (unsigned int tu = 0; tu < 10; tu++)
 
21175
              {
 
21176
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21177
              }// end loop over 'tu'
 
21178
            }// end loop over 'u'
 
21179
          }// end loop over 't'
 
21180
          }
 
21181
          
 
21182
          if (combinations[r][s] == 1)
 
21183
          {
 
21184
          for (unsigned int t = 0; t < 10; t++)
 
21185
          {
 
21186
            for (unsigned int u = 0; u < 10; u++)
 
21187
            {
 
21188
              for (unsigned int tu = 0; tu < 10; tu++)
 
21189
              {
 
21190
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21191
              }// end loop over 'tu'
 
21192
            }// end loop over 'u'
 
21193
          }// end loop over 't'
 
21194
          }
 
21195
          
 
21196
          if (combinations[r][s] == 2)
 
21197
          {
 
21198
          for (unsigned int t = 0; t < 10; t++)
 
21199
          {
 
21200
            for (unsigned int u = 0; u < 10; u++)
 
21201
            {
 
21202
              for (unsigned int tu = 0; tu < 10; tu++)
 
21203
              {
 
21204
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21205
              }// end loop over 'tu'
 
21206
            }// end loop over 'u'
 
21207
          }// end loop over 't'
 
21208
          }
 
21209
          
 
21210
        }// end loop over 's'
 
21211
        for (unsigned int s = 0; s < 10; s++)
 
21212
        {
 
21213
          for (unsigned int t = 0; t < 10; t++)
 
21214
          {
 
21215
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21216
          }// end loop over 't'
 
21217
        }// end loop over 's'
 
21218
      }// end loop over 'r'
 
21219
      
 
21220
      // Transform derivatives back to physical element
 
21221
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21222
      {
 
21223
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21224
        {
 
21225
          values[r] += transform[r][s]*derivatives[s];
 
21226
        }// end loop over 's'
 
21227
      }// end loop over 'r'
 
21228
      
 
21229
      // Delete pointer to array of derivatives on FIAT element
 
21230
      delete [] derivatives;
 
21231
      
 
21232
      // Delete pointer to array of combinations of derivatives and transform
 
21233
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21234
      {
 
21235
        delete [] combinations[r];
 
21236
      }// end loop over 'r'
 
21237
      delete [] combinations;
 
21238
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21239
      {
 
21240
        delete [] transform[r];
 
21241
      }// end loop over 'r'
 
21242
      delete [] transform;
 
21243
        break;
 
21244
      }
 
21245
    case 2:
 
21246
      {
 
21247
        
 
21248
      // Array of basisvalues.
 
21249
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
21250
      
 
21251
      // Declare helper variables.
 
21252
      unsigned int rr = 0;
 
21253
      unsigned int ss = 0;
 
21254
      unsigned int tt = 0;
 
21255
      double tmp5 = 0.000000000000000;
 
21256
      double tmp6 = 0.000000000000000;
 
21257
      double tmp7 = 0.000000000000000;
 
21258
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
21259
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
21260
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
21261
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
21262
      double tmp4 = tmp3*tmp3;
 
21263
      
 
21264
      // Compute basisvalues.
 
21265
      basisvalues[0] = 1.000000000000000;
 
21266
      basisvalues[1] = tmp0;
 
21267
      for (unsigned int r = 1; r < 2; r++)
 
21268
      {
 
21269
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
21270
        ss = r*(r + 1)*(r + 2)/6;
 
21271
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
21272
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
21273
      }// end loop over 'r'
 
21274
      for (unsigned int r = 0; r < 2; r++)
 
21275
      {
 
21276
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21277
        ss = r*(r + 1)*(r + 2)/6;
 
21278
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
21279
      }// end loop over 'r'
 
21280
      for (unsigned int r = 0; r < 1; r++)
 
21281
      {
 
21282
        for (unsigned int s = 1; s < 2 - r; s++)
 
21283
        {
 
21284
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
21285
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21286
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
21287
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21288
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21289
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21290
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
21291
        }// end loop over 's'
 
21292
      }// end loop over 'r'
 
21293
      for (unsigned int r = 0; r < 2; r++)
 
21294
      {
 
21295
        for (unsigned int s = 0; s < 2 - r; s++)
 
21296
        {
 
21297
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21298
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21299
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
21300
        }// end loop over 's'
 
21301
      }// end loop over 'r'
 
21302
      for (unsigned int r = 0; r < 1; r++)
 
21303
      {
 
21304
        for (unsigned int s = 0; s < 1 - r; s++)
 
21305
        {
 
21306
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
21307
          {
 
21308
            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;
 
21309
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21310
            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;
 
21311
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21312
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21313
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21314
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
21315
          }// end loop over 't'
 
21316
        }// end loop over 's'
 
21317
      }// end loop over 'r'
 
21318
      for (unsigned int r = 0; r < 3; r++)
 
21319
      {
 
21320
        for (unsigned int s = 0; s < 3 - r; s++)
 
21321
        {
 
21322
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
21323
          {
 
21324
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21325
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
21326
          }// end loop over 't'
 
21327
        }// end loop over 's'
 
21328
      }// end loop over 'r'
 
21329
      
 
21330
      // Table(s) of coefficients.
 
21331
      static const double coefficients0[10] = \
 
21332
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
21333
      
 
21334
      // Tables of derivatives of the polynomial base (transpose).
 
21335
      static const double dmats0[10][10] = \
 
21336
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21337
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21338
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21339
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21340
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21341
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21342
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21343
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21344
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21345
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21346
      
 
21347
      static const double dmats1[10][10] = \
 
21348
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21349
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21350
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21351
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21352
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21353
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21354
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21355
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21356
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21357
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21358
      
 
21359
      static const double dmats2[10][10] = \
 
21360
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21361
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21362
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21363
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21364
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21365
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21366
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21367
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21368
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21369
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21370
      
 
21371
      // Compute reference derivatives.
 
21372
      // Declare pointer to array of derivatives on FIAT element.
 
21373
      double *derivatives = new double[num_derivatives];
 
21374
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21375
      {
 
21376
        derivatives[r] = 0.000000000000000;
 
21377
      }// end loop over 'r'
 
21378
      
 
21379
      // Declare derivative matrix (of polynomial basis).
 
21380
      double dmats[10][10] = \
 
21381
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21382
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21383
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21384
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21385
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21386
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21387
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21388
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21389
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21390
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21391
      
 
21392
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21393
      double dmats_old[10][10] = \
 
21394
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21395
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21396
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21397
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21398
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21399
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21400
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21401
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21402
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21403
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21404
      
 
21405
      // Loop possible derivatives.
 
21406
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21407
      {
 
21408
        // Resetting dmats values to compute next derivative.
 
21409
        for (unsigned int t = 0; t < 10; t++)
 
21410
        {
 
21411
          for (unsigned int u = 0; u < 10; u++)
 
21412
          {
 
21413
            dmats[t][u] = 0.000000000000000;
 
21414
            if (t == u)
 
21415
            {
 
21416
            dmats[t][u] = 1.000000000000000;
 
21417
            }
 
21418
            
 
21419
          }// end loop over 'u'
 
21420
        }// end loop over 't'
 
21421
        
 
21422
        // Looping derivative order to generate dmats.
 
21423
        for (unsigned int s = 0; s < n; s++)
 
21424
        {
 
21425
          // Updating dmats_old with new values and resetting dmats.
 
21426
          for (unsigned int t = 0; t < 10; t++)
 
21427
          {
 
21428
            for (unsigned int u = 0; u < 10; u++)
 
21429
            {
 
21430
              dmats_old[t][u] = dmats[t][u];
 
21431
              dmats[t][u] = 0.000000000000000;
 
21432
            }// end loop over 'u'
 
21433
          }// end loop over 't'
 
21434
          
 
21435
          // Update dmats using an inner product.
 
21436
          if (combinations[r][s] == 0)
 
21437
          {
 
21438
          for (unsigned int t = 0; t < 10; t++)
 
21439
          {
 
21440
            for (unsigned int u = 0; u < 10; u++)
 
21441
            {
 
21442
              for (unsigned int tu = 0; tu < 10; tu++)
 
21443
              {
 
21444
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21445
              }// end loop over 'tu'
 
21446
            }// end loop over 'u'
 
21447
          }// end loop over 't'
 
21448
          }
 
21449
          
 
21450
          if (combinations[r][s] == 1)
 
21451
          {
 
21452
          for (unsigned int t = 0; t < 10; t++)
 
21453
          {
 
21454
            for (unsigned int u = 0; u < 10; u++)
 
21455
            {
 
21456
              for (unsigned int tu = 0; tu < 10; tu++)
 
21457
              {
 
21458
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21459
              }// end loop over 'tu'
 
21460
            }// end loop over 'u'
 
21461
          }// end loop over 't'
 
21462
          }
 
21463
          
 
21464
          if (combinations[r][s] == 2)
 
21465
          {
 
21466
          for (unsigned int t = 0; t < 10; t++)
 
21467
          {
 
21468
            for (unsigned int u = 0; u < 10; u++)
 
21469
            {
 
21470
              for (unsigned int tu = 0; tu < 10; tu++)
 
21471
              {
 
21472
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21473
              }// end loop over 'tu'
 
21474
            }// end loop over 'u'
 
21475
          }// end loop over 't'
 
21476
          }
 
21477
          
 
21478
        }// end loop over 's'
 
21479
        for (unsigned int s = 0; s < 10; s++)
 
21480
        {
 
21481
          for (unsigned int t = 0; t < 10; t++)
 
21482
          {
 
21483
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21484
          }// end loop over 't'
 
21485
        }// end loop over 's'
 
21486
      }// end loop over 'r'
 
21487
      
 
21488
      // Transform derivatives back to physical element
 
21489
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21490
      {
 
21491
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21492
        {
 
21493
          values[r] += transform[r][s]*derivatives[s];
 
21494
        }// end loop over 's'
 
21495
      }// end loop over 'r'
 
21496
      
 
21497
      // Delete pointer to array of derivatives on FIAT element
 
21498
      delete [] derivatives;
 
21499
      
 
21500
      // Delete pointer to array of combinations of derivatives and transform
 
21501
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21502
      {
 
21503
        delete [] combinations[r];
 
21504
      }// end loop over 'r'
 
21505
      delete [] combinations;
 
21506
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21507
      {
 
21508
        delete [] transform[r];
 
21509
      }// end loop over 'r'
 
21510
      delete [] transform;
 
21511
        break;
 
21512
      }
 
21513
    case 3:
 
21514
      {
 
21515
        
 
21516
      // Array of basisvalues.
 
21517
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
21518
      
 
21519
      // Declare helper variables.
 
21520
      unsigned int rr = 0;
 
21521
      unsigned int ss = 0;
 
21522
      unsigned int tt = 0;
 
21523
      double tmp5 = 0.000000000000000;
 
21524
      double tmp6 = 0.000000000000000;
 
21525
      double tmp7 = 0.000000000000000;
 
21526
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
21527
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
21528
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
21529
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
21530
      double tmp4 = tmp3*tmp3;
 
21531
      
 
21532
      // Compute basisvalues.
 
21533
      basisvalues[0] = 1.000000000000000;
 
21534
      basisvalues[1] = tmp0;
 
21535
      for (unsigned int r = 1; r < 2; r++)
 
21536
      {
 
21537
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
21538
        ss = r*(r + 1)*(r + 2)/6;
 
21539
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
21540
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
21541
      }// end loop over 'r'
 
21542
      for (unsigned int r = 0; r < 2; r++)
 
21543
      {
 
21544
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21545
        ss = r*(r + 1)*(r + 2)/6;
 
21546
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
21547
      }// end loop over 'r'
 
21548
      for (unsigned int r = 0; r < 1; r++)
 
21549
      {
 
21550
        for (unsigned int s = 1; s < 2 - r; s++)
 
21551
        {
 
21552
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
21553
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21554
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
21555
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21556
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21557
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21558
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
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
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21566
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21567
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
21568
        }// end loop over 's'
 
21569
      }// end loop over 'r'
 
21570
      for (unsigned int r = 0; r < 1; r++)
 
21571
      {
 
21572
        for (unsigned int s = 0; s < 1 - r; s++)
 
21573
        {
 
21574
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
21575
          {
 
21576
            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;
 
21577
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21578
            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;
 
21579
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21580
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21581
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21582
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
21583
          }// end loop over 't'
 
21584
        }// end loop over 's'
 
21585
      }// end loop over 'r'
 
21586
      for (unsigned int r = 0; r < 3; r++)
 
21587
      {
 
21588
        for (unsigned int s = 0; s < 3 - r; s++)
 
21589
        {
 
21590
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
21591
          {
 
21592
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21593
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
21594
          }// end loop over 't'
 
21595
        }// end loop over 's'
 
21596
      }// end loop over 'r'
 
21597
      
 
21598
      // Table(s) of coefficients.
 
21599
      static const double coefficients0[10] = \
 
21600
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
21601
      
 
21602
      // Tables of derivatives of the polynomial base (transpose).
 
21603
      static const double dmats0[10][10] = \
 
21604
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21605
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21606
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21607
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21608
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21609
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21610
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21611
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21612
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21613
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21614
      
 
21615
      static const double dmats1[10][10] = \
 
21616
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21617
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21618
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21619
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21620
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21621
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21622
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21623
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21624
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21625
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21626
      
 
21627
      static const double dmats2[10][10] = \
 
21628
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21629
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21630
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21631
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21632
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21633
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21634
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21635
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21636
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21637
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21638
      
 
21639
      // Compute reference derivatives.
 
21640
      // Declare pointer to array of derivatives on FIAT element.
 
21641
      double *derivatives = new double[num_derivatives];
 
21642
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21643
      {
 
21644
        derivatives[r] = 0.000000000000000;
 
21645
      }// end loop over 'r'
 
21646
      
 
21647
      // Declare derivative matrix (of polynomial basis).
 
21648
      double dmats[10][10] = \
 
21649
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21650
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21651
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21652
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21653
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21654
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21655
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21656
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21657
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21658
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21659
      
 
21660
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21661
      double dmats_old[10][10] = \
 
21662
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21663
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21664
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21665
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21666
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21667
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21668
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21669
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21670
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21671
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21672
      
 
21673
      // Loop possible derivatives.
 
21674
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21675
      {
 
21676
        // Resetting dmats values to compute next derivative.
 
21677
        for (unsigned int t = 0; t < 10; t++)
 
21678
        {
 
21679
          for (unsigned int u = 0; u < 10; u++)
 
21680
          {
 
21681
            dmats[t][u] = 0.000000000000000;
 
21682
            if (t == u)
 
21683
            {
 
21684
            dmats[t][u] = 1.000000000000000;
 
21685
            }
 
21686
            
 
21687
          }// end loop over 'u'
 
21688
        }// end loop over 't'
 
21689
        
 
21690
        // Looping derivative order to generate dmats.
 
21691
        for (unsigned int s = 0; s < n; s++)
 
21692
        {
 
21693
          // Updating dmats_old with new values and resetting dmats.
 
21694
          for (unsigned int t = 0; t < 10; t++)
 
21695
          {
 
21696
            for (unsigned int u = 0; u < 10; u++)
 
21697
            {
 
21698
              dmats_old[t][u] = dmats[t][u];
 
21699
              dmats[t][u] = 0.000000000000000;
 
21700
            }// end loop over 'u'
 
21701
          }// end loop over 't'
 
21702
          
 
21703
          // Update dmats using an inner product.
 
21704
          if (combinations[r][s] == 0)
 
21705
          {
 
21706
          for (unsigned int t = 0; t < 10; t++)
 
21707
          {
 
21708
            for (unsigned int u = 0; u < 10; u++)
 
21709
            {
 
21710
              for (unsigned int tu = 0; tu < 10; tu++)
 
21711
              {
 
21712
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21713
              }// end loop over 'tu'
 
21714
            }// end loop over 'u'
 
21715
          }// end loop over 't'
 
21716
          }
 
21717
          
 
21718
          if (combinations[r][s] == 1)
 
21719
          {
 
21720
          for (unsigned int t = 0; t < 10; t++)
 
21721
          {
 
21722
            for (unsigned int u = 0; u < 10; u++)
 
21723
            {
 
21724
              for (unsigned int tu = 0; tu < 10; tu++)
 
21725
              {
 
21726
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21727
              }// end loop over 'tu'
 
21728
            }// end loop over 'u'
 
21729
          }// end loop over 't'
 
21730
          }
 
21731
          
 
21732
          if (combinations[r][s] == 2)
 
21733
          {
 
21734
          for (unsigned int t = 0; t < 10; t++)
 
21735
          {
 
21736
            for (unsigned int u = 0; u < 10; u++)
 
21737
            {
 
21738
              for (unsigned int tu = 0; tu < 10; tu++)
 
21739
              {
 
21740
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
21741
              }// end loop over 'tu'
 
21742
            }// end loop over 'u'
 
21743
          }// end loop over 't'
 
21744
          }
 
21745
          
 
21746
        }// end loop over 's'
 
21747
        for (unsigned int s = 0; s < 10; s++)
 
21748
        {
 
21749
          for (unsigned int t = 0; t < 10; t++)
 
21750
          {
 
21751
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
21752
          }// end loop over 't'
 
21753
        }// end loop over 's'
 
21754
      }// end loop over 'r'
 
21755
      
 
21756
      // Transform derivatives back to physical element
 
21757
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21758
      {
 
21759
        for (unsigned int s = 0; s < num_derivatives; s++)
 
21760
        {
 
21761
          values[r] += transform[r][s]*derivatives[s];
 
21762
        }// end loop over 's'
 
21763
      }// end loop over 'r'
 
21764
      
 
21765
      // Delete pointer to array of derivatives on FIAT element
 
21766
      delete [] derivatives;
 
21767
      
 
21768
      // Delete pointer to array of combinations of derivatives and transform
 
21769
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21770
      {
 
21771
        delete [] combinations[r];
 
21772
      }// end loop over 'r'
 
21773
      delete [] combinations;
 
21774
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21775
      {
 
21776
        delete [] transform[r];
 
21777
      }// end loop over 'r'
 
21778
      delete [] transform;
 
21779
        break;
 
21780
      }
 
21781
    case 4:
 
21782
      {
 
21783
        
 
21784
      // Array of basisvalues.
 
21785
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
21786
      
 
21787
      // Declare helper variables.
 
21788
      unsigned int rr = 0;
 
21789
      unsigned int ss = 0;
 
21790
      unsigned int tt = 0;
 
21791
      double tmp5 = 0.000000000000000;
 
21792
      double tmp6 = 0.000000000000000;
 
21793
      double tmp7 = 0.000000000000000;
 
21794
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
21795
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
21796
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
21797
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
21798
      double tmp4 = tmp3*tmp3;
 
21799
      
 
21800
      // Compute basisvalues.
 
21801
      basisvalues[0] = 1.000000000000000;
 
21802
      basisvalues[1] = tmp0;
 
21803
      for (unsigned int r = 1; r < 2; r++)
 
21804
      {
 
21805
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
21806
        ss = r*(r + 1)*(r + 2)/6;
 
21807
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
21808
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
21809
      }// end loop over 'r'
 
21810
      for (unsigned int r = 0; r < 2; r++)
 
21811
      {
 
21812
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
21813
        ss = r*(r + 1)*(r + 2)/6;
 
21814
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
21815
      }// end loop over 'r'
 
21816
      for (unsigned int r = 0; r < 1; r++)
 
21817
      {
 
21818
        for (unsigned int s = 1; s < 2 - r; s++)
 
21819
        {
 
21820
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
21821
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21822
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
21823
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21824
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21825
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
21826
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
21827
        }// end loop over 's'
 
21828
      }// end loop over 'r'
 
21829
      for (unsigned int r = 0; r < 2; r++)
 
21830
      {
 
21831
        for (unsigned int s = 0; s < 2 - r; s++)
 
21832
        {
 
21833
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
21834
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
21835
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
21836
        }// end loop over 's'
 
21837
      }// end loop over 'r'
 
21838
      for (unsigned int r = 0; r < 1; r++)
 
21839
      {
 
21840
        for (unsigned int s = 0; s < 1 - r; s++)
 
21841
        {
 
21842
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
21843
          {
 
21844
            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;
 
21845
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21846
            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;
 
21847
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21848
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21849
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
21850
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
21851
          }// end loop over 't'
 
21852
        }// end loop over 's'
 
21853
      }// end loop over 'r'
 
21854
      for (unsigned int r = 0; r < 3; r++)
 
21855
      {
 
21856
        for (unsigned int s = 0; s < 3 - r; s++)
 
21857
        {
 
21858
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
21859
          {
 
21860
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
21861
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
21862
          }// end loop over 't'
 
21863
        }// end loop over 's'
 
21864
      }// end loop over 'r'
 
21865
      
 
21866
      // Table(s) of coefficients.
 
21867
      static const double coefficients0[10] = \
 
21868
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
21869
      
 
21870
      // Tables of derivatives of the polynomial base (transpose).
 
21871
      static const double dmats0[10][10] = \
 
21872
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21873
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21874
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21875
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21876
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21877
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21878
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21879
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21880
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21881
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21882
      
 
21883
      static const double dmats1[10][10] = \
 
21884
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21885
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21886
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21887
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21888
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21889
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21890
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21891
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21892
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21893
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21894
      
 
21895
      static const double dmats2[10][10] = \
 
21896
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21897
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21898
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21899
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21900
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21901
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21902
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21903
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21904
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21905
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
21906
      
 
21907
      // Compute reference derivatives.
 
21908
      // Declare pointer to array of derivatives on FIAT element.
 
21909
      double *derivatives = new double[num_derivatives];
 
21910
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21911
      {
 
21912
        derivatives[r] = 0.000000000000000;
 
21913
      }// end loop over 'r'
 
21914
      
 
21915
      // Declare derivative matrix (of polynomial basis).
 
21916
      double dmats[10][10] = \
 
21917
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21918
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21919
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21920
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21921
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21922
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21923
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21924
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21925
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21926
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21927
      
 
21928
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
21929
      double dmats_old[10][10] = \
 
21930
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21931
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21932
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21933
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21934
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21935
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21936
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
21937
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
21938
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
21939
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
21940
      
 
21941
      // Loop possible derivatives.
 
21942
      for (unsigned int r = 0; r < num_derivatives; r++)
 
21943
      {
 
21944
        // Resetting dmats values to compute next derivative.
 
21945
        for (unsigned int t = 0; t < 10; t++)
 
21946
        {
 
21947
          for (unsigned int u = 0; u < 10; u++)
 
21948
          {
 
21949
            dmats[t][u] = 0.000000000000000;
 
21950
            if (t == u)
 
21951
            {
 
21952
            dmats[t][u] = 1.000000000000000;
 
21953
            }
 
21954
            
 
21955
          }// end loop over 'u'
 
21956
        }// end loop over 't'
 
21957
        
 
21958
        // Looping derivative order to generate dmats.
 
21959
        for (unsigned int s = 0; s < n; s++)
 
21960
        {
 
21961
          // Updating dmats_old with new values and resetting dmats.
 
21962
          for (unsigned int t = 0; t < 10; t++)
 
21963
          {
 
21964
            for (unsigned int u = 0; u < 10; u++)
 
21965
            {
 
21966
              dmats_old[t][u] = dmats[t][u];
 
21967
              dmats[t][u] = 0.000000000000000;
 
21968
            }// end loop over 'u'
 
21969
          }// end loop over 't'
 
21970
          
 
21971
          // Update dmats using an inner product.
 
21972
          if (combinations[r][s] == 0)
 
21973
          {
 
21974
          for (unsigned int t = 0; t < 10; t++)
 
21975
          {
 
21976
            for (unsigned int u = 0; u < 10; u++)
 
21977
            {
 
21978
              for (unsigned int tu = 0; tu < 10; tu++)
 
21979
              {
 
21980
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
21981
              }// end loop over 'tu'
 
21982
            }// end loop over 'u'
 
21983
          }// end loop over 't'
 
21984
          }
 
21985
          
 
21986
          if (combinations[r][s] == 1)
 
21987
          {
 
21988
          for (unsigned int t = 0; t < 10; t++)
 
21989
          {
 
21990
            for (unsigned int u = 0; u < 10; u++)
 
21991
            {
 
21992
              for (unsigned int tu = 0; tu < 10; tu++)
 
21993
              {
 
21994
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
21995
              }// end loop over 'tu'
 
21996
            }// end loop over 'u'
 
21997
          }// end loop over 't'
 
21998
          }
 
21999
          
 
22000
          if (combinations[r][s] == 2)
 
22001
          {
 
22002
          for (unsigned int t = 0; t < 10; t++)
 
22003
          {
 
22004
            for (unsigned int u = 0; u < 10; u++)
 
22005
            {
 
22006
              for (unsigned int tu = 0; tu < 10; tu++)
 
22007
              {
 
22008
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
22009
              }// end loop over 'tu'
 
22010
            }// end loop over 'u'
 
22011
          }// end loop over 't'
 
22012
          }
 
22013
          
 
22014
        }// end loop over 's'
 
22015
        for (unsigned int s = 0; s < 10; s++)
 
22016
        {
 
22017
          for (unsigned int t = 0; t < 10; t++)
 
22018
          {
 
22019
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
22020
          }// end loop over 't'
 
22021
        }// end loop over 's'
 
22022
      }// end loop over 'r'
 
22023
      
 
22024
      // Transform derivatives back to physical element
 
22025
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22026
      {
 
22027
        for (unsigned int s = 0; s < num_derivatives; s++)
 
22028
        {
 
22029
          values[r] += transform[r][s]*derivatives[s];
 
22030
        }// end loop over 's'
 
22031
      }// end loop over 'r'
 
22032
      
 
22033
      // Delete pointer to array of derivatives on FIAT element
 
22034
      delete [] derivatives;
 
22035
      
 
22036
      // Delete pointer to array of combinations of derivatives and transform
 
22037
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22038
      {
 
22039
        delete [] combinations[r];
 
22040
      }// end loop over 'r'
 
22041
      delete [] combinations;
 
22042
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22043
      {
 
22044
        delete [] transform[r];
 
22045
      }// end loop over 'r'
 
22046
      delete [] transform;
 
22047
        break;
 
22048
      }
 
22049
    case 5:
 
22050
      {
 
22051
        
 
22052
      // Array of basisvalues.
 
22053
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
22054
      
 
22055
      // Declare helper variables.
 
22056
      unsigned int rr = 0;
 
22057
      unsigned int ss = 0;
 
22058
      unsigned int tt = 0;
 
22059
      double tmp5 = 0.000000000000000;
 
22060
      double tmp6 = 0.000000000000000;
 
22061
      double tmp7 = 0.000000000000000;
 
22062
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
22063
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
22064
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
22065
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
22066
      double tmp4 = tmp3*tmp3;
 
22067
      
 
22068
      // Compute basisvalues.
 
22069
      basisvalues[0] = 1.000000000000000;
 
22070
      basisvalues[1] = tmp0;
 
22071
      for (unsigned int r = 1; r < 2; r++)
 
22072
      {
 
22073
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
22074
        ss = r*(r + 1)*(r + 2)/6;
 
22075
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
22076
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
22077
      }// end loop over 'r'
 
22078
      for (unsigned int r = 0; r < 2; r++)
 
22079
      {
 
22080
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
22081
        ss = r*(r + 1)*(r + 2)/6;
 
22082
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
22083
      }// end loop over 'r'
 
22084
      for (unsigned int r = 0; r < 1; r++)
 
22085
      {
 
22086
        for (unsigned int s = 1; s < 2 - r; s++)
 
22087
        {
 
22088
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
22089
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22090
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
22091
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22092
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22093
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22094
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
22095
        }// end loop over 's'
 
22096
      }// end loop over 'r'
 
22097
      for (unsigned int r = 0; r < 2; r++)
 
22098
      {
 
22099
        for (unsigned int s = 0; s < 2 - r; s++)
 
22100
        {
 
22101
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
22102
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22103
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
22104
        }// end loop over 's'
 
22105
      }// end loop over 'r'
 
22106
      for (unsigned int r = 0; r < 1; r++)
 
22107
      {
 
22108
        for (unsigned int s = 0; s < 1 - r; s++)
 
22109
        {
 
22110
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
22111
          {
 
22112
            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;
 
22113
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22114
            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;
 
22115
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22116
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22117
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22118
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
22119
          }// end loop over 't'
 
22120
        }// end loop over 's'
 
22121
      }// end loop over 'r'
 
22122
      for (unsigned int r = 0; r < 3; r++)
 
22123
      {
 
22124
        for (unsigned int s = 0; s < 3 - r; s++)
 
22125
        {
 
22126
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
22127
          {
 
22128
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22129
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
22130
          }// end loop over 't'
 
22131
        }// end loop over 's'
 
22132
      }// end loop over 'r'
 
22133
      
 
22134
      // Table(s) of coefficients.
 
22135
      static const double coefficients0[10] = \
 
22136
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
22137
      
 
22138
      // Tables of derivatives of the polynomial base (transpose).
 
22139
      static const double dmats0[10][10] = \
 
22140
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22141
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22142
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22143
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22144
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22145
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22146
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22147
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22148
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22149
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22150
      
 
22151
      static const double dmats1[10][10] = \
 
22152
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22153
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22154
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22155
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22156
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22157
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22158
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22159
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22160
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22161
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22162
      
 
22163
      static const double dmats2[10][10] = \
 
22164
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22165
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22166
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22167
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22168
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22169
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22170
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22171
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22172
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22173
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22174
      
 
22175
      // Compute reference derivatives.
 
22176
      // Declare pointer to array of derivatives on FIAT element.
 
22177
      double *derivatives = new double[num_derivatives];
 
22178
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22179
      {
 
22180
        derivatives[r] = 0.000000000000000;
 
22181
      }// end loop over 'r'
 
22182
      
 
22183
      // Declare derivative matrix (of polynomial basis).
 
22184
      double dmats[10][10] = \
 
22185
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22186
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22187
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22188
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22189
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22190
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22191
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22192
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22193
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22194
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22195
      
 
22196
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
22197
      double dmats_old[10][10] = \
 
22198
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22199
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22200
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22201
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22202
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22203
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22204
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22205
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22206
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22207
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22208
      
 
22209
      // Loop possible derivatives.
 
22210
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22211
      {
 
22212
        // Resetting dmats values to compute next derivative.
 
22213
        for (unsigned int t = 0; t < 10; t++)
 
22214
        {
 
22215
          for (unsigned int u = 0; u < 10; u++)
 
22216
          {
 
22217
            dmats[t][u] = 0.000000000000000;
 
22218
            if (t == u)
 
22219
            {
 
22220
            dmats[t][u] = 1.000000000000000;
 
22221
            }
 
22222
            
 
22223
          }// end loop over 'u'
 
22224
        }// end loop over 't'
 
22225
        
 
22226
        // Looping derivative order to generate dmats.
 
22227
        for (unsigned int s = 0; s < n; s++)
 
22228
        {
 
22229
          // Updating dmats_old with new values and resetting dmats.
 
22230
          for (unsigned int t = 0; t < 10; t++)
 
22231
          {
 
22232
            for (unsigned int u = 0; u < 10; u++)
 
22233
            {
 
22234
              dmats_old[t][u] = dmats[t][u];
 
22235
              dmats[t][u] = 0.000000000000000;
 
22236
            }// end loop over 'u'
 
22237
          }// end loop over 't'
 
22238
          
 
22239
          // Update dmats using an inner product.
 
22240
          if (combinations[r][s] == 0)
 
22241
          {
 
22242
          for (unsigned int t = 0; t < 10; t++)
 
22243
          {
 
22244
            for (unsigned int u = 0; u < 10; u++)
 
22245
            {
 
22246
              for (unsigned int tu = 0; tu < 10; tu++)
 
22247
              {
 
22248
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
22249
              }// end loop over 'tu'
 
22250
            }// end loop over 'u'
 
22251
          }// end loop over 't'
 
22252
          }
 
22253
          
 
22254
          if (combinations[r][s] == 1)
 
22255
          {
 
22256
          for (unsigned int t = 0; t < 10; t++)
 
22257
          {
 
22258
            for (unsigned int u = 0; u < 10; u++)
 
22259
            {
 
22260
              for (unsigned int tu = 0; tu < 10; tu++)
 
22261
              {
 
22262
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
22263
              }// end loop over 'tu'
 
22264
            }// end loop over 'u'
 
22265
          }// end loop over 't'
 
22266
          }
 
22267
          
 
22268
          if (combinations[r][s] == 2)
 
22269
          {
 
22270
          for (unsigned int t = 0; t < 10; t++)
 
22271
          {
 
22272
            for (unsigned int u = 0; u < 10; u++)
 
22273
            {
 
22274
              for (unsigned int tu = 0; tu < 10; tu++)
 
22275
              {
 
22276
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
22277
              }// end loop over 'tu'
 
22278
            }// end loop over 'u'
 
22279
          }// end loop over 't'
 
22280
          }
 
22281
          
 
22282
        }// end loop over 's'
 
22283
        for (unsigned int s = 0; s < 10; s++)
 
22284
        {
 
22285
          for (unsigned int t = 0; t < 10; t++)
 
22286
          {
 
22287
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
22288
          }// end loop over 't'
 
22289
        }// end loop over 's'
 
22290
      }// end loop over 'r'
 
22291
      
 
22292
      // Transform derivatives back to physical element
 
22293
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22294
      {
 
22295
        for (unsigned int s = 0; s < num_derivatives; s++)
 
22296
        {
 
22297
          values[r] += transform[r][s]*derivatives[s];
 
22298
        }// end loop over 's'
 
22299
      }// end loop over 'r'
 
22300
      
 
22301
      // Delete pointer to array of derivatives on FIAT element
 
22302
      delete [] derivatives;
 
22303
      
 
22304
      // Delete pointer to array of combinations of derivatives and transform
 
22305
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22306
      {
 
22307
        delete [] combinations[r];
 
22308
      }// end loop over 'r'
 
22309
      delete [] combinations;
 
22310
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22311
      {
 
22312
        delete [] transform[r];
 
22313
      }// end loop over 'r'
 
22314
      delete [] transform;
 
22315
        break;
 
22316
      }
 
22317
    case 6:
 
22318
      {
 
22319
        
 
22320
      // Array of basisvalues.
 
22321
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
22322
      
 
22323
      // Declare helper variables.
 
22324
      unsigned int rr = 0;
 
22325
      unsigned int ss = 0;
 
22326
      unsigned int tt = 0;
 
22327
      double tmp5 = 0.000000000000000;
 
22328
      double tmp6 = 0.000000000000000;
 
22329
      double tmp7 = 0.000000000000000;
 
22330
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
22331
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
22332
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
22333
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
22334
      double tmp4 = tmp3*tmp3;
 
22335
      
 
22336
      // Compute basisvalues.
 
22337
      basisvalues[0] = 1.000000000000000;
 
22338
      basisvalues[1] = tmp0;
 
22339
      for (unsigned int r = 1; r < 2; r++)
 
22340
      {
 
22341
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
22342
        ss = r*(r + 1)*(r + 2)/6;
 
22343
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
22344
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
22345
      }// end loop over 'r'
 
22346
      for (unsigned int r = 0; r < 2; r++)
 
22347
      {
 
22348
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
22349
        ss = r*(r + 1)*(r + 2)/6;
 
22350
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
22351
      }// end loop over 'r'
 
22352
      for (unsigned int r = 0; r < 1; r++)
 
22353
      {
 
22354
        for (unsigned int s = 1; s < 2 - r; s++)
 
22355
        {
 
22356
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
22357
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22358
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
22359
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22360
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22361
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22362
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
22363
        }// end loop over 's'
 
22364
      }// end loop over 'r'
 
22365
      for (unsigned int r = 0; r < 2; r++)
 
22366
      {
 
22367
        for (unsigned int s = 0; s < 2 - r; s++)
 
22368
        {
 
22369
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
22370
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22371
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
22372
        }// end loop over 's'
 
22373
      }// end loop over 'r'
 
22374
      for (unsigned int r = 0; r < 1; r++)
 
22375
      {
 
22376
        for (unsigned int s = 0; s < 1 - r; s++)
 
22377
        {
 
22378
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
22379
          {
 
22380
            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;
 
22381
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22382
            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;
 
22383
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22384
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22385
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22386
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
22387
          }// end loop over 't'
 
22388
        }// end loop over 's'
 
22389
      }// end loop over 'r'
 
22390
      for (unsigned int r = 0; r < 3; r++)
 
22391
      {
 
22392
        for (unsigned int s = 0; s < 3 - r; s++)
 
22393
        {
 
22394
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
22395
          {
 
22396
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22397
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
22398
          }// end loop over 't'
 
22399
        }// end loop over 's'
 
22400
      }// end loop over 'r'
 
22401
      
 
22402
      // Table(s) of coefficients.
 
22403
      static const double coefficients0[10] = \
 
22404
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
22405
      
 
22406
      // Tables of derivatives of the polynomial base (transpose).
 
22407
      static const double dmats0[10][10] = \
 
22408
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22409
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22410
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22411
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22412
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22413
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22414
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22415
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22416
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22417
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22418
      
 
22419
      static const double dmats1[10][10] = \
 
22420
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22421
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22422
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22423
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22424
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22425
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22426
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22427
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22428
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22429
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22430
      
 
22431
      static const double dmats2[10][10] = \
 
22432
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22433
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22434
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22435
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22436
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22437
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22438
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22439
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22440
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22441
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22442
      
 
22443
      // Compute reference derivatives.
 
22444
      // Declare pointer to array of derivatives on FIAT element.
 
22445
      double *derivatives = new double[num_derivatives];
 
22446
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22447
      {
 
22448
        derivatives[r] = 0.000000000000000;
 
22449
      }// end loop over 'r'
 
22450
      
 
22451
      // Declare derivative matrix (of polynomial basis).
 
22452
      double dmats[10][10] = \
 
22453
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22454
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22455
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22456
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22457
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22458
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22459
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22460
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22461
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22462
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22463
      
 
22464
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
22465
      double dmats_old[10][10] = \
 
22466
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22467
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22468
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22469
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22470
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22471
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22472
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22473
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22474
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22475
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22476
      
 
22477
      // Loop possible derivatives.
 
22478
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22479
      {
 
22480
        // Resetting dmats values to compute next derivative.
 
22481
        for (unsigned int t = 0; t < 10; t++)
 
22482
        {
 
22483
          for (unsigned int u = 0; u < 10; u++)
 
22484
          {
 
22485
            dmats[t][u] = 0.000000000000000;
 
22486
            if (t == u)
 
22487
            {
 
22488
            dmats[t][u] = 1.000000000000000;
 
22489
            }
 
22490
            
 
22491
          }// end loop over 'u'
 
22492
        }// end loop over 't'
 
22493
        
 
22494
        // Looping derivative order to generate dmats.
 
22495
        for (unsigned int s = 0; s < n; s++)
 
22496
        {
 
22497
          // Updating dmats_old with new values and resetting dmats.
 
22498
          for (unsigned int t = 0; t < 10; t++)
 
22499
          {
 
22500
            for (unsigned int u = 0; u < 10; u++)
 
22501
            {
 
22502
              dmats_old[t][u] = dmats[t][u];
 
22503
              dmats[t][u] = 0.000000000000000;
 
22504
            }// end loop over 'u'
 
22505
          }// end loop over 't'
 
22506
          
 
22507
          // Update dmats using an inner product.
 
22508
          if (combinations[r][s] == 0)
 
22509
          {
 
22510
          for (unsigned int t = 0; t < 10; t++)
 
22511
          {
 
22512
            for (unsigned int u = 0; u < 10; u++)
 
22513
            {
 
22514
              for (unsigned int tu = 0; tu < 10; tu++)
 
22515
              {
 
22516
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
22517
              }// end loop over 'tu'
 
22518
            }// end loop over 'u'
 
22519
          }// end loop over 't'
 
22520
          }
 
22521
          
 
22522
          if (combinations[r][s] == 1)
 
22523
          {
 
22524
          for (unsigned int t = 0; t < 10; t++)
 
22525
          {
 
22526
            for (unsigned int u = 0; u < 10; u++)
 
22527
            {
 
22528
              for (unsigned int tu = 0; tu < 10; tu++)
 
22529
              {
 
22530
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
22531
              }// end loop over 'tu'
 
22532
            }// end loop over 'u'
 
22533
          }// end loop over 't'
 
22534
          }
 
22535
          
 
22536
          if (combinations[r][s] == 2)
 
22537
          {
 
22538
          for (unsigned int t = 0; t < 10; t++)
 
22539
          {
 
22540
            for (unsigned int u = 0; u < 10; u++)
 
22541
            {
 
22542
              for (unsigned int tu = 0; tu < 10; tu++)
 
22543
              {
 
22544
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
22545
              }// end loop over 'tu'
 
22546
            }// end loop over 'u'
 
22547
          }// end loop over 't'
 
22548
          }
 
22549
          
 
22550
        }// end loop over 's'
 
22551
        for (unsigned int s = 0; s < 10; s++)
 
22552
        {
 
22553
          for (unsigned int t = 0; t < 10; t++)
 
22554
          {
 
22555
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
22556
          }// end loop over 't'
 
22557
        }// end loop over 's'
 
22558
      }// end loop over 'r'
 
22559
      
 
22560
      // Transform derivatives back to physical element
 
22561
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22562
      {
 
22563
        for (unsigned int s = 0; s < num_derivatives; s++)
 
22564
        {
 
22565
          values[r] += transform[r][s]*derivatives[s];
 
22566
        }// end loop over 's'
 
22567
      }// end loop over 'r'
 
22568
      
 
22569
      // Delete pointer to array of derivatives on FIAT element
 
22570
      delete [] derivatives;
 
22571
      
 
22572
      // Delete pointer to array of combinations of derivatives and transform
 
22573
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22574
      {
 
22575
        delete [] combinations[r];
 
22576
      }// end loop over 'r'
 
22577
      delete [] combinations;
 
22578
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22579
      {
 
22580
        delete [] transform[r];
 
22581
      }// end loop over 'r'
 
22582
      delete [] transform;
 
22583
        break;
 
22584
      }
 
22585
    case 7:
 
22586
      {
 
22587
        
 
22588
      // Array of basisvalues.
 
22589
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
22590
      
 
22591
      // Declare helper variables.
 
22592
      unsigned int rr = 0;
 
22593
      unsigned int ss = 0;
 
22594
      unsigned int tt = 0;
 
22595
      double tmp5 = 0.000000000000000;
 
22596
      double tmp6 = 0.000000000000000;
 
22597
      double tmp7 = 0.000000000000000;
 
22598
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
22599
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
22600
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
22601
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
22602
      double tmp4 = tmp3*tmp3;
 
22603
      
 
22604
      // Compute basisvalues.
 
22605
      basisvalues[0] = 1.000000000000000;
 
22606
      basisvalues[1] = tmp0;
 
22607
      for (unsigned int r = 1; r < 2; r++)
 
22608
      {
 
22609
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
22610
        ss = r*(r + 1)*(r + 2)/6;
 
22611
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
22612
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
22613
      }// end loop over 'r'
 
22614
      for (unsigned int r = 0; r < 2; r++)
 
22615
      {
 
22616
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
22617
        ss = r*(r + 1)*(r + 2)/6;
 
22618
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
22619
      }// end loop over 'r'
 
22620
      for (unsigned int r = 0; r < 1; r++)
 
22621
      {
 
22622
        for (unsigned int s = 1; s < 2 - r; s++)
 
22623
        {
 
22624
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
22625
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22626
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
22627
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22628
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22629
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22630
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
22631
        }// end loop over 's'
 
22632
      }// end loop over 'r'
 
22633
      for (unsigned int r = 0; r < 2; r++)
 
22634
      {
 
22635
        for (unsigned int s = 0; s < 2 - r; s++)
 
22636
        {
 
22637
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
22638
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22639
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
22640
        }// end loop over 's'
 
22641
      }// end loop over 'r'
 
22642
      for (unsigned int r = 0; r < 1; r++)
 
22643
      {
 
22644
        for (unsigned int s = 0; s < 1 - r; s++)
 
22645
        {
 
22646
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
22647
          {
 
22648
            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;
 
22649
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22650
            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;
 
22651
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22652
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22653
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22654
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
22655
          }// end loop over 't'
 
22656
        }// end loop over 's'
 
22657
      }// end loop over 'r'
 
22658
      for (unsigned int r = 0; r < 3; r++)
 
22659
      {
 
22660
        for (unsigned int s = 0; s < 3 - r; s++)
 
22661
        {
 
22662
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
22663
          {
 
22664
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22665
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
22666
          }// end loop over 't'
 
22667
        }// end loop over 's'
 
22668
      }// end loop over 'r'
 
22669
      
 
22670
      // Table(s) of coefficients.
 
22671
      static const double coefficients0[10] = \
 
22672
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
22673
      
 
22674
      // Tables of derivatives of the polynomial base (transpose).
 
22675
      static const double dmats0[10][10] = \
 
22676
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22677
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22678
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22679
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22680
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22681
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22682
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22683
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22684
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22685
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22686
      
 
22687
      static const double dmats1[10][10] = \
 
22688
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22689
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22690
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22691
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22692
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22693
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22694
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22695
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22696
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22697
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22698
      
 
22699
      static const double dmats2[10][10] = \
 
22700
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22701
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22702
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22703
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22704
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22705
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22706
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22707
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22708
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22709
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22710
      
 
22711
      // Compute reference derivatives.
 
22712
      // Declare pointer to array of derivatives on FIAT element.
 
22713
      double *derivatives = new double[num_derivatives];
 
22714
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22715
      {
 
22716
        derivatives[r] = 0.000000000000000;
 
22717
      }// end loop over 'r'
 
22718
      
 
22719
      // Declare derivative matrix (of polynomial basis).
 
22720
      double dmats[10][10] = \
 
22721
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22722
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22723
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22724
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22725
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22726
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22727
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22728
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22729
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22730
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22731
      
 
22732
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
22733
      double dmats_old[10][10] = \
 
22734
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22735
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22736
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22737
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22738
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22739
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22740
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22741
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22742
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22743
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22744
      
 
22745
      // Loop possible derivatives.
 
22746
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22747
      {
 
22748
        // Resetting dmats values to compute next derivative.
 
22749
        for (unsigned int t = 0; t < 10; t++)
 
22750
        {
 
22751
          for (unsigned int u = 0; u < 10; u++)
 
22752
          {
 
22753
            dmats[t][u] = 0.000000000000000;
 
22754
            if (t == u)
 
22755
            {
 
22756
            dmats[t][u] = 1.000000000000000;
 
22757
            }
 
22758
            
 
22759
          }// end loop over 'u'
 
22760
        }// end loop over 't'
 
22761
        
 
22762
        // Looping derivative order to generate dmats.
 
22763
        for (unsigned int s = 0; s < n; s++)
 
22764
        {
 
22765
          // Updating dmats_old with new values and resetting dmats.
 
22766
          for (unsigned int t = 0; t < 10; t++)
 
22767
          {
 
22768
            for (unsigned int u = 0; u < 10; u++)
 
22769
            {
 
22770
              dmats_old[t][u] = dmats[t][u];
 
22771
              dmats[t][u] = 0.000000000000000;
 
22772
            }// end loop over 'u'
 
22773
          }// end loop over 't'
 
22774
          
 
22775
          // Update dmats using an inner product.
 
22776
          if (combinations[r][s] == 0)
 
22777
          {
 
22778
          for (unsigned int t = 0; t < 10; t++)
 
22779
          {
 
22780
            for (unsigned int u = 0; u < 10; u++)
 
22781
            {
 
22782
              for (unsigned int tu = 0; tu < 10; tu++)
 
22783
              {
 
22784
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
22785
              }// end loop over 'tu'
 
22786
            }// end loop over 'u'
 
22787
          }// end loop over 't'
 
22788
          }
 
22789
          
 
22790
          if (combinations[r][s] == 1)
 
22791
          {
 
22792
          for (unsigned int t = 0; t < 10; t++)
 
22793
          {
 
22794
            for (unsigned int u = 0; u < 10; u++)
 
22795
            {
 
22796
              for (unsigned int tu = 0; tu < 10; tu++)
 
22797
              {
 
22798
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
22799
              }// end loop over 'tu'
 
22800
            }// end loop over 'u'
 
22801
          }// end loop over 't'
 
22802
          }
 
22803
          
 
22804
          if (combinations[r][s] == 2)
 
22805
          {
 
22806
          for (unsigned int t = 0; t < 10; t++)
 
22807
          {
 
22808
            for (unsigned int u = 0; u < 10; u++)
 
22809
            {
 
22810
              for (unsigned int tu = 0; tu < 10; tu++)
 
22811
              {
 
22812
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
22813
              }// end loop over 'tu'
 
22814
            }// end loop over 'u'
 
22815
          }// end loop over 't'
 
22816
          }
 
22817
          
 
22818
        }// end loop over 's'
 
22819
        for (unsigned int s = 0; s < 10; s++)
 
22820
        {
 
22821
          for (unsigned int t = 0; t < 10; t++)
 
22822
          {
 
22823
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
22824
          }// end loop over 't'
 
22825
        }// end loop over 's'
 
22826
      }// end loop over 'r'
 
22827
      
 
22828
      // Transform derivatives back to physical element
 
22829
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22830
      {
 
22831
        for (unsigned int s = 0; s < num_derivatives; s++)
 
22832
        {
 
22833
          values[r] += transform[r][s]*derivatives[s];
 
22834
        }// end loop over 's'
 
22835
      }// end loop over 'r'
 
22836
      
 
22837
      // Delete pointer to array of derivatives on FIAT element
 
22838
      delete [] derivatives;
 
22839
      
 
22840
      // Delete pointer to array of combinations of derivatives and transform
 
22841
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22842
      {
 
22843
        delete [] combinations[r];
 
22844
      }// end loop over 'r'
 
22845
      delete [] combinations;
 
22846
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22847
      {
 
22848
        delete [] transform[r];
 
22849
      }// end loop over 'r'
 
22850
      delete [] transform;
 
22851
        break;
 
22852
      }
 
22853
    case 8:
 
22854
      {
 
22855
        
 
22856
      // Array of basisvalues.
 
22857
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
22858
      
 
22859
      // Declare helper variables.
 
22860
      unsigned int rr = 0;
 
22861
      unsigned int ss = 0;
 
22862
      unsigned int tt = 0;
 
22863
      double tmp5 = 0.000000000000000;
 
22864
      double tmp6 = 0.000000000000000;
 
22865
      double tmp7 = 0.000000000000000;
 
22866
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
22867
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
22868
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
22869
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
22870
      double tmp4 = tmp3*tmp3;
 
22871
      
 
22872
      // Compute basisvalues.
 
22873
      basisvalues[0] = 1.000000000000000;
 
22874
      basisvalues[1] = tmp0;
 
22875
      for (unsigned int r = 1; r < 2; r++)
 
22876
      {
 
22877
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
22878
        ss = r*(r + 1)*(r + 2)/6;
 
22879
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
22880
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
22881
      }// end loop over 'r'
 
22882
      for (unsigned int r = 0; r < 2; r++)
 
22883
      {
 
22884
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
22885
        ss = r*(r + 1)*(r + 2)/6;
 
22886
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
22887
      }// end loop over 'r'
 
22888
      for (unsigned int r = 0; r < 1; r++)
 
22889
      {
 
22890
        for (unsigned int s = 1; s < 2 - r; s++)
 
22891
        {
 
22892
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
22893
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22894
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
22895
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22896
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22897
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
22898
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
22899
        }// end loop over 's'
 
22900
      }// end loop over 'r'
 
22901
      for (unsigned int r = 0; r < 2; r++)
 
22902
      {
 
22903
        for (unsigned int s = 0; s < 2 - r; s++)
 
22904
        {
 
22905
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
22906
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
22907
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
22908
        }// end loop over 's'
 
22909
      }// end loop over 'r'
 
22910
      for (unsigned int r = 0; r < 1; r++)
 
22911
      {
 
22912
        for (unsigned int s = 0; s < 1 - r; s++)
 
22913
        {
 
22914
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
22915
          {
 
22916
            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;
 
22917
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22918
            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;
 
22919
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22920
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22921
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
22922
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
22923
          }// end loop over 't'
 
22924
        }// end loop over 's'
 
22925
      }// end loop over 'r'
 
22926
      for (unsigned int r = 0; r < 3; r++)
 
22927
      {
 
22928
        for (unsigned int s = 0; s < 3 - r; s++)
 
22929
        {
 
22930
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
22931
          {
 
22932
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
22933
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
22934
          }// end loop over 't'
 
22935
        }// end loop over 's'
 
22936
      }// end loop over 'r'
 
22937
      
 
22938
      // Table(s) of coefficients.
 
22939
      static const double coefficients0[10] = \
 
22940
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
22941
      
 
22942
      // Tables of derivatives of the polynomial base (transpose).
 
22943
      static const double dmats0[10][10] = \
 
22944
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22945
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22946
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22947
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22948
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22949
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22950
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22951
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22952
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22953
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22954
      
 
22955
      static const double dmats1[10][10] = \
 
22956
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22957
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22958
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22959
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22960
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22961
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22962
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22963
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22964
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22965
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22966
      
 
22967
      static const double dmats2[10][10] = \
 
22968
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22969
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22970
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22971
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22972
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22973
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22974
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22975
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22976
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22977
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
22978
      
 
22979
      // Compute reference derivatives.
 
22980
      // Declare pointer to array of derivatives on FIAT element.
 
22981
      double *derivatives = new double[num_derivatives];
 
22982
      for (unsigned int r = 0; r < num_derivatives; r++)
 
22983
      {
 
22984
        derivatives[r] = 0.000000000000000;
 
22985
      }// end loop over 'r'
 
22986
      
 
22987
      // Declare derivative matrix (of polynomial basis).
 
22988
      double dmats[10][10] = \
 
22989
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22990
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22991
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22992
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22993
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22994
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22995
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
22996
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
22997
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
22998
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
22999
      
 
23000
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
23001
      double dmats_old[10][10] = \
 
23002
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23003
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23004
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23005
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23006
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23007
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23008
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23009
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23010
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23011
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23012
      
 
23013
      // Loop possible derivatives.
 
23014
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23015
      {
 
23016
        // Resetting dmats values to compute next derivative.
 
23017
        for (unsigned int t = 0; t < 10; t++)
 
23018
        {
 
23019
          for (unsigned int u = 0; u < 10; u++)
 
23020
          {
 
23021
            dmats[t][u] = 0.000000000000000;
 
23022
            if (t == u)
 
23023
            {
 
23024
            dmats[t][u] = 1.000000000000000;
 
23025
            }
 
23026
            
 
23027
          }// end loop over 'u'
 
23028
        }// end loop over 't'
 
23029
        
 
23030
        // Looping derivative order to generate dmats.
 
23031
        for (unsigned int s = 0; s < n; s++)
 
23032
        {
 
23033
          // Updating dmats_old with new values and resetting dmats.
 
23034
          for (unsigned int t = 0; t < 10; t++)
 
23035
          {
 
23036
            for (unsigned int u = 0; u < 10; u++)
 
23037
            {
 
23038
              dmats_old[t][u] = dmats[t][u];
 
23039
              dmats[t][u] = 0.000000000000000;
 
23040
            }// end loop over 'u'
 
23041
          }// end loop over 't'
 
23042
          
 
23043
          // Update dmats using an inner product.
 
23044
          if (combinations[r][s] == 0)
 
23045
          {
 
23046
          for (unsigned int t = 0; t < 10; t++)
 
23047
          {
 
23048
            for (unsigned int u = 0; u < 10; u++)
 
23049
            {
 
23050
              for (unsigned int tu = 0; tu < 10; tu++)
 
23051
              {
 
23052
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
23053
              }// end loop over 'tu'
 
23054
            }// end loop over 'u'
 
23055
          }// end loop over 't'
 
23056
          }
 
23057
          
 
23058
          if (combinations[r][s] == 1)
 
23059
          {
 
23060
          for (unsigned int t = 0; t < 10; t++)
 
23061
          {
 
23062
            for (unsigned int u = 0; u < 10; u++)
 
23063
            {
 
23064
              for (unsigned int tu = 0; tu < 10; tu++)
 
23065
              {
 
23066
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
23067
              }// end loop over 'tu'
 
23068
            }// end loop over 'u'
 
23069
          }// end loop over 't'
 
23070
          }
 
23071
          
 
23072
          if (combinations[r][s] == 2)
 
23073
          {
 
23074
          for (unsigned int t = 0; t < 10; t++)
 
23075
          {
 
23076
            for (unsigned int u = 0; u < 10; u++)
 
23077
            {
 
23078
              for (unsigned int tu = 0; tu < 10; tu++)
 
23079
              {
 
23080
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
23081
              }// end loop over 'tu'
 
23082
            }// end loop over 'u'
 
23083
          }// end loop over 't'
 
23084
          }
 
23085
          
 
23086
        }// end loop over 's'
 
23087
        for (unsigned int s = 0; s < 10; s++)
 
23088
        {
 
23089
          for (unsigned int t = 0; t < 10; t++)
 
23090
          {
 
23091
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
23092
          }// end loop over 't'
 
23093
        }// end loop over 's'
 
23094
      }// end loop over 'r'
 
23095
      
 
23096
      // Transform derivatives back to physical element
 
23097
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23098
      {
 
23099
        for (unsigned int s = 0; s < num_derivatives; s++)
 
23100
        {
 
23101
          values[r] += transform[r][s]*derivatives[s];
 
23102
        }// end loop over 's'
 
23103
      }// end loop over 'r'
 
23104
      
 
23105
      // Delete pointer to array of derivatives on FIAT element
 
23106
      delete [] derivatives;
 
23107
      
 
23108
      // Delete pointer to array of combinations of derivatives and transform
 
23109
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23110
      {
 
23111
        delete [] combinations[r];
 
23112
      }// end loop over 'r'
 
23113
      delete [] combinations;
 
23114
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23115
      {
 
23116
        delete [] transform[r];
 
23117
      }// end loop over 'r'
 
23118
      delete [] transform;
 
23119
        break;
 
23120
      }
 
23121
    case 9:
 
23122
      {
 
23123
        
 
23124
      // Array of basisvalues.
 
23125
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
23126
      
 
23127
      // Declare helper variables.
 
23128
      unsigned int rr = 0;
 
23129
      unsigned int ss = 0;
 
23130
      unsigned int tt = 0;
 
23131
      double tmp5 = 0.000000000000000;
 
23132
      double tmp6 = 0.000000000000000;
 
23133
      double tmp7 = 0.000000000000000;
 
23134
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
23135
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
23136
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
23137
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
23138
      double tmp4 = tmp3*tmp3;
 
23139
      
 
23140
      // Compute basisvalues.
 
23141
      basisvalues[0] = 1.000000000000000;
 
23142
      basisvalues[1] = tmp0;
 
23143
      for (unsigned int r = 1; r < 2; r++)
 
23144
      {
 
23145
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
23146
        ss = r*(r + 1)*(r + 2)/6;
 
23147
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
23148
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
23149
      }// end loop over 'r'
 
23150
      for (unsigned int r = 0; r < 2; r++)
 
23151
      {
 
23152
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
23153
        ss = r*(r + 1)*(r + 2)/6;
 
23154
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
23155
      }// end loop over 'r'
 
23156
      for (unsigned int r = 0; r < 1; r++)
 
23157
      {
 
23158
        for (unsigned int s = 1; s < 2 - r; s++)
 
23159
        {
 
23160
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
23161
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23162
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
23163
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23164
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23165
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23166
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
23167
        }// end loop over 's'
 
23168
      }// end loop over 'r'
 
23169
      for (unsigned int r = 0; r < 2; r++)
 
23170
      {
 
23171
        for (unsigned int s = 0; s < 2 - r; s++)
 
23172
        {
 
23173
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
23174
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23175
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
23176
        }// end loop over 's'
 
23177
      }// end loop over 'r'
 
23178
      for (unsigned int r = 0; r < 1; r++)
 
23179
      {
 
23180
        for (unsigned int s = 0; s < 1 - r; s++)
 
23181
        {
 
23182
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
23183
          {
 
23184
            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;
 
23185
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23186
            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;
 
23187
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23188
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23189
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23190
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
23191
          }// end loop over 't'
 
23192
        }// end loop over 's'
 
23193
      }// end loop over 'r'
 
23194
      for (unsigned int r = 0; r < 3; r++)
 
23195
      {
 
23196
        for (unsigned int s = 0; s < 3 - r; s++)
 
23197
        {
 
23198
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
23199
          {
 
23200
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23201
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
23202
          }// end loop over 't'
 
23203
        }// end loop over 's'
 
23204
      }// end loop over 'r'
 
23205
      
 
23206
      // Table(s) of coefficients.
 
23207
      static const double coefficients0[10] = \
 
23208
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
23209
      
 
23210
      // Tables of derivatives of the polynomial base (transpose).
 
23211
      static const double dmats0[10][10] = \
 
23212
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23213
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23214
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23215
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23216
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23217
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23218
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23219
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23220
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23221
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23222
      
 
23223
      static const double dmats1[10][10] = \
 
23224
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23225
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23226
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23227
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23228
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23229
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23230
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23231
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23232
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23233
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23234
      
 
23235
      static const double dmats2[10][10] = \
 
23236
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23237
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23238
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23239
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23240
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23241
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23242
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23243
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23244
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23245
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23246
      
 
23247
      // Compute reference derivatives.
 
23248
      // Declare pointer to array of derivatives on FIAT element.
 
23249
      double *derivatives = new double[num_derivatives];
 
23250
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23251
      {
 
23252
        derivatives[r] = 0.000000000000000;
 
23253
      }// end loop over 'r'
 
23254
      
 
23255
      // Declare derivative matrix (of polynomial basis).
 
23256
      double dmats[10][10] = \
 
23257
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23258
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23259
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23260
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23261
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23262
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23263
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23264
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23265
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23266
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23267
      
 
23268
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
23269
      double dmats_old[10][10] = \
 
23270
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23271
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23272
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23273
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23274
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23275
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23276
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23277
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23278
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23279
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23280
      
 
23281
      // Loop possible derivatives.
 
23282
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23283
      {
 
23284
        // Resetting dmats values to compute next derivative.
 
23285
        for (unsigned int t = 0; t < 10; t++)
 
23286
        {
 
23287
          for (unsigned int u = 0; u < 10; u++)
 
23288
          {
 
23289
            dmats[t][u] = 0.000000000000000;
 
23290
            if (t == u)
 
23291
            {
 
23292
            dmats[t][u] = 1.000000000000000;
 
23293
            }
 
23294
            
 
23295
          }// end loop over 'u'
 
23296
        }// end loop over 't'
 
23297
        
 
23298
        // Looping derivative order to generate dmats.
 
23299
        for (unsigned int s = 0; s < n; s++)
 
23300
        {
 
23301
          // Updating dmats_old with new values and resetting dmats.
 
23302
          for (unsigned int t = 0; t < 10; t++)
 
23303
          {
 
23304
            for (unsigned int u = 0; u < 10; u++)
 
23305
            {
 
23306
              dmats_old[t][u] = dmats[t][u];
 
23307
              dmats[t][u] = 0.000000000000000;
 
23308
            }// end loop over 'u'
 
23309
          }// end loop over 't'
 
23310
          
 
23311
          // Update dmats using an inner product.
 
23312
          if (combinations[r][s] == 0)
 
23313
          {
 
23314
          for (unsigned int t = 0; t < 10; t++)
 
23315
          {
 
23316
            for (unsigned int u = 0; u < 10; u++)
 
23317
            {
 
23318
              for (unsigned int tu = 0; tu < 10; tu++)
 
23319
              {
 
23320
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
23321
              }// end loop over 'tu'
 
23322
            }// end loop over 'u'
 
23323
          }// end loop over 't'
 
23324
          }
 
23325
          
 
23326
          if (combinations[r][s] == 1)
 
23327
          {
 
23328
          for (unsigned int t = 0; t < 10; t++)
 
23329
          {
 
23330
            for (unsigned int u = 0; u < 10; u++)
 
23331
            {
 
23332
              for (unsigned int tu = 0; tu < 10; tu++)
 
23333
              {
 
23334
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
23335
              }// end loop over 'tu'
 
23336
            }// end loop over 'u'
 
23337
          }// end loop over 't'
 
23338
          }
 
23339
          
 
23340
          if (combinations[r][s] == 2)
 
23341
          {
 
23342
          for (unsigned int t = 0; t < 10; t++)
 
23343
          {
 
23344
            for (unsigned int u = 0; u < 10; u++)
 
23345
            {
 
23346
              for (unsigned int tu = 0; tu < 10; tu++)
 
23347
              {
 
23348
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
23349
              }// end loop over 'tu'
 
23350
            }// end loop over 'u'
 
23351
          }// end loop over 't'
 
23352
          }
 
23353
          
 
23354
        }// end loop over 's'
 
23355
        for (unsigned int s = 0; s < 10; s++)
 
23356
        {
 
23357
          for (unsigned int t = 0; t < 10; t++)
 
23358
          {
 
23359
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
23360
          }// end loop over 't'
 
23361
        }// end loop over 's'
 
23362
      }// end loop over 'r'
 
23363
      
 
23364
      // Transform derivatives back to physical element
 
23365
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23366
      {
 
23367
        for (unsigned int s = 0; s < num_derivatives; s++)
 
23368
        {
 
23369
          values[r] += transform[r][s]*derivatives[s];
 
23370
        }// end loop over 's'
 
23371
      }// end loop over 'r'
 
23372
      
 
23373
      // Delete pointer to array of derivatives on FIAT element
 
23374
      delete [] derivatives;
 
23375
      
 
23376
      // Delete pointer to array of combinations of derivatives and transform
 
23377
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23378
      {
 
23379
        delete [] combinations[r];
 
23380
      }// end loop over 'r'
 
23381
      delete [] combinations;
 
23382
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23383
      {
 
23384
        delete [] transform[r];
 
23385
      }// end loop over 'r'
 
23386
      delete [] transform;
 
23387
        break;
 
23388
      }
 
23389
    case 10:
 
23390
      {
 
23391
        
 
23392
      // Array of basisvalues.
 
23393
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
23394
      
 
23395
      // Declare helper variables.
 
23396
      unsigned int rr = 0;
 
23397
      unsigned int ss = 0;
 
23398
      unsigned int tt = 0;
 
23399
      double tmp5 = 0.000000000000000;
 
23400
      double tmp6 = 0.000000000000000;
 
23401
      double tmp7 = 0.000000000000000;
 
23402
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
23403
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
23404
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
23405
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
23406
      double tmp4 = tmp3*tmp3;
 
23407
      
 
23408
      // Compute basisvalues.
 
23409
      basisvalues[0] = 1.000000000000000;
 
23410
      basisvalues[1] = tmp0;
 
23411
      for (unsigned int r = 1; r < 2; r++)
 
23412
      {
 
23413
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
23414
        ss = r*(r + 1)*(r + 2)/6;
 
23415
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
23416
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
23417
      }// end loop over 'r'
 
23418
      for (unsigned int r = 0; r < 2; r++)
 
23419
      {
 
23420
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
23421
        ss = r*(r + 1)*(r + 2)/6;
 
23422
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
23423
      }// end loop over 'r'
 
23424
      for (unsigned int r = 0; r < 1; r++)
 
23425
      {
 
23426
        for (unsigned int s = 1; s < 2 - r; s++)
 
23427
        {
 
23428
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
23429
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23430
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
23431
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23432
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23433
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23434
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
23435
        }// end loop over 's'
 
23436
      }// end loop over 'r'
 
23437
      for (unsigned int r = 0; r < 2; r++)
 
23438
      {
 
23439
        for (unsigned int s = 0; s < 2 - r; s++)
 
23440
        {
 
23441
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
23442
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23443
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
23444
        }// end loop over 's'
 
23445
      }// end loop over 'r'
 
23446
      for (unsigned int r = 0; r < 1; r++)
 
23447
      {
 
23448
        for (unsigned int s = 0; s < 1 - r; s++)
 
23449
        {
 
23450
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
23451
          {
 
23452
            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;
 
23453
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23454
            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;
 
23455
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23456
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23457
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23458
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
23459
          }// end loop over 't'
 
23460
        }// end loop over 's'
 
23461
      }// end loop over 'r'
 
23462
      for (unsigned int r = 0; r < 3; r++)
 
23463
      {
 
23464
        for (unsigned int s = 0; s < 3 - r; s++)
 
23465
        {
 
23466
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
23467
          {
 
23468
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23469
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
23470
          }// end loop over 't'
 
23471
        }// end loop over 's'
 
23472
      }// end loop over 'r'
 
23473
      
 
23474
      // Table(s) of coefficients.
 
23475
      static const double coefficients0[10] = \
 
23476
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
23477
      
 
23478
      // Tables of derivatives of the polynomial base (transpose).
 
23479
      static const double dmats0[10][10] = \
 
23480
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23481
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23482
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23483
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23484
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23485
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23486
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23487
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23488
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23489
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23490
      
 
23491
      static const double dmats1[10][10] = \
 
23492
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23493
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23494
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23495
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23496
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23497
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23498
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23499
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23500
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23501
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23502
      
 
23503
      static const double dmats2[10][10] = \
 
23504
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23505
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23506
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23507
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23508
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23509
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23510
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23511
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23512
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23513
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23514
      
 
23515
      // Compute reference derivatives.
 
23516
      // Declare pointer to array of derivatives on FIAT element.
 
23517
      double *derivatives = new double[num_derivatives];
 
23518
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23519
      {
 
23520
        derivatives[r] = 0.000000000000000;
 
23521
      }// end loop over 'r'
 
23522
      
 
23523
      // Declare derivative matrix (of polynomial basis).
 
23524
      double dmats[10][10] = \
 
23525
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23526
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23527
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23528
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23529
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23530
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23531
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23532
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23533
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23534
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23535
      
 
23536
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
23537
      double dmats_old[10][10] = \
 
23538
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23539
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23540
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23541
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23542
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23543
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23544
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23545
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23546
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23547
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23548
      
 
23549
      // Loop possible derivatives.
 
23550
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23551
      {
 
23552
        // Resetting dmats values to compute next derivative.
 
23553
        for (unsigned int t = 0; t < 10; t++)
 
23554
        {
 
23555
          for (unsigned int u = 0; u < 10; u++)
 
23556
          {
 
23557
            dmats[t][u] = 0.000000000000000;
 
23558
            if (t == u)
 
23559
            {
 
23560
            dmats[t][u] = 1.000000000000000;
 
23561
            }
 
23562
            
 
23563
          }// end loop over 'u'
 
23564
        }// end loop over 't'
 
23565
        
 
23566
        // Looping derivative order to generate dmats.
 
23567
        for (unsigned int s = 0; s < n; s++)
 
23568
        {
 
23569
          // Updating dmats_old with new values and resetting dmats.
 
23570
          for (unsigned int t = 0; t < 10; t++)
 
23571
          {
 
23572
            for (unsigned int u = 0; u < 10; u++)
 
23573
            {
 
23574
              dmats_old[t][u] = dmats[t][u];
 
23575
              dmats[t][u] = 0.000000000000000;
 
23576
            }// end loop over 'u'
 
23577
          }// end loop over 't'
 
23578
          
 
23579
          // Update dmats using an inner product.
 
23580
          if (combinations[r][s] == 0)
 
23581
          {
 
23582
          for (unsigned int t = 0; t < 10; t++)
 
23583
          {
 
23584
            for (unsigned int u = 0; u < 10; u++)
 
23585
            {
 
23586
              for (unsigned int tu = 0; tu < 10; tu++)
 
23587
              {
 
23588
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
23589
              }// end loop over 'tu'
 
23590
            }// end loop over 'u'
 
23591
          }// end loop over 't'
 
23592
          }
 
23593
          
 
23594
          if (combinations[r][s] == 1)
 
23595
          {
 
23596
          for (unsigned int t = 0; t < 10; t++)
 
23597
          {
 
23598
            for (unsigned int u = 0; u < 10; u++)
 
23599
            {
 
23600
              for (unsigned int tu = 0; tu < 10; tu++)
 
23601
              {
 
23602
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
23603
              }// end loop over 'tu'
 
23604
            }// end loop over 'u'
 
23605
          }// end loop over 't'
 
23606
          }
 
23607
          
 
23608
          if (combinations[r][s] == 2)
 
23609
          {
 
23610
          for (unsigned int t = 0; t < 10; t++)
 
23611
          {
 
23612
            for (unsigned int u = 0; u < 10; u++)
 
23613
            {
 
23614
              for (unsigned int tu = 0; tu < 10; tu++)
 
23615
              {
 
23616
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
23617
              }// end loop over 'tu'
 
23618
            }// end loop over 'u'
 
23619
          }// end loop over 't'
 
23620
          }
 
23621
          
 
23622
        }// end loop over 's'
 
23623
        for (unsigned int s = 0; s < 10; s++)
 
23624
        {
 
23625
          for (unsigned int t = 0; t < 10; t++)
 
23626
          {
 
23627
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
23628
          }// end loop over 't'
 
23629
        }// end loop over 's'
 
23630
      }// end loop over 'r'
 
23631
      
 
23632
      // Transform derivatives back to physical element
 
23633
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23634
      {
 
23635
        for (unsigned int s = 0; s < num_derivatives; s++)
 
23636
        {
 
23637
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
23638
        }// end loop over 's'
 
23639
      }// end loop over 'r'
 
23640
      
 
23641
      // Delete pointer to array of derivatives on FIAT element
 
23642
      delete [] derivatives;
 
23643
      
 
23644
      // Delete pointer to array of combinations of derivatives and transform
 
23645
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23646
      {
 
23647
        delete [] combinations[r];
 
23648
      }// end loop over 'r'
 
23649
      delete [] combinations;
 
23650
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23651
      {
 
23652
        delete [] transform[r];
 
23653
      }// end loop over 'r'
 
23654
      delete [] transform;
 
23655
        break;
 
23656
      }
 
23657
    case 11:
 
23658
      {
 
23659
        
 
23660
      // Array of basisvalues.
 
23661
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
23662
      
 
23663
      // Declare helper variables.
 
23664
      unsigned int rr = 0;
 
23665
      unsigned int ss = 0;
 
23666
      unsigned int tt = 0;
 
23667
      double tmp5 = 0.000000000000000;
 
23668
      double tmp6 = 0.000000000000000;
 
23669
      double tmp7 = 0.000000000000000;
 
23670
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
23671
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
23672
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
23673
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
23674
      double tmp4 = tmp3*tmp3;
 
23675
      
 
23676
      // Compute basisvalues.
 
23677
      basisvalues[0] = 1.000000000000000;
 
23678
      basisvalues[1] = tmp0;
 
23679
      for (unsigned int r = 1; r < 2; r++)
 
23680
      {
 
23681
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
23682
        ss = r*(r + 1)*(r + 2)/6;
 
23683
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
23684
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
23685
      }// end loop over 'r'
 
23686
      for (unsigned int r = 0; r < 2; r++)
 
23687
      {
 
23688
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
23689
        ss = r*(r + 1)*(r + 2)/6;
 
23690
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
23691
      }// end loop over 'r'
 
23692
      for (unsigned int r = 0; r < 1; r++)
 
23693
      {
 
23694
        for (unsigned int s = 1; s < 2 - r; s++)
 
23695
        {
 
23696
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
23697
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23698
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
23699
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23700
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23701
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23702
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
23703
        }// end loop over 's'
 
23704
      }// end loop over 'r'
 
23705
      for (unsigned int r = 0; r < 2; r++)
 
23706
      {
 
23707
        for (unsigned int s = 0; s < 2 - r; s++)
 
23708
        {
 
23709
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
23710
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23711
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
23712
        }// end loop over 's'
 
23713
      }// end loop over 'r'
 
23714
      for (unsigned int r = 0; r < 1; r++)
 
23715
      {
 
23716
        for (unsigned int s = 0; s < 1 - r; s++)
 
23717
        {
 
23718
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
23719
          {
 
23720
            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;
 
23721
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23722
            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;
 
23723
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23724
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23725
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23726
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
23727
          }// end loop over 't'
 
23728
        }// end loop over 's'
 
23729
      }// end loop over 'r'
 
23730
      for (unsigned int r = 0; r < 3; r++)
 
23731
      {
 
23732
        for (unsigned int s = 0; s < 3 - r; s++)
 
23733
        {
 
23734
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
23735
          {
 
23736
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23737
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
23738
          }// end loop over 't'
 
23739
        }// end loop over 's'
 
23740
      }// end loop over 'r'
 
23741
      
 
23742
      // Table(s) of coefficients.
 
23743
      static const double coefficients0[10] = \
 
23744
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
23745
      
 
23746
      // Tables of derivatives of the polynomial base (transpose).
 
23747
      static const double dmats0[10][10] = \
 
23748
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23749
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23750
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23751
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23752
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23753
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23754
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23755
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23756
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23757
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23758
      
 
23759
      static const double dmats1[10][10] = \
 
23760
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23761
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23762
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23763
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23764
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23765
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23766
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23767
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23768
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23769
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23770
      
 
23771
      static const double dmats2[10][10] = \
 
23772
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23773
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23774
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23775
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23776
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23777
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23778
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23779
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23780
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23781
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
23782
      
 
23783
      // Compute reference derivatives.
 
23784
      // Declare pointer to array of derivatives on FIAT element.
 
23785
      double *derivatives = new double[num_derivatives];
 
23786
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23787
      {
 
23788
        derivatives[r] = 0.000000000000000;
 
23789
      }// end loop over 'r'
 
23790
      
 
23791
      // Declare derivative matrix (of polynomial basis).
 
23792
      double dmats[10][10] = \
 
23793
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23794
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23795
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23796
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23797
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23798
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23799
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23800
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23801
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23802
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23803
      
 
23804
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
23805
      double dmats_old[10][10] = \
 
23806
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23807
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23808
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23809
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23810
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23811
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23812
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
23813
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
23814
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
23815
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
23816
      
 
23817
      // Loop possible derivatives.
 
23818
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23819
      {
 
23820
        // Resetting dmats values to compute next derivative.
 
23821
        for (unsigned int t = 0; t < 10; t++)
 
23822
        {
 
23823
          for (unsigned int u = 0; u < 10; u++)
 
23824
          {
 
23825
            dmats[t][u] = 0.000000000000000;
 
23826
            if (t == u)
 
23827
            {
 
23828
            dmats[t][u] = 1.000000000000000;
 
23829
            }
 
23830
            
 
23831
          }// end loop over 'u'
 
23832
        }// end loop over 't'
 
23833
        
 
23834
        // Looping derivative order to generate dmats.
 
23835
        for (unsigned int s = 0; s < n; s++)
 
23836
        {
 
23837
          // Updating dmats_old with new values and resetting dmats.
 
23838
          for (unsigned int t = 0; t < 10; t++)
 
23839
          {
 
23840
            for (unsigned int u = 0; u < 10; u++)
 
23841
            {
 
23842
              dmats_old[t][u] = dmats[t][u];
 
23843
              dmats[t][u] = 0.000000000000000;
 
23844
            }// end loop over 'u'
 
23845
          }// end loop over 't'
 
23846
          
 
23847
          // Update dmats using an inner product.
 
23848
          if (combinations[r][s] == 0)
 
23849
          {
 
23850
          for (unsigned int t = 0; t < 10; t++)
 
23851
          {
 
23852
            for (unsigned int u = 0; u < 10; u++)
 
23853
            {
 
23854
              for (unsigned int tu = 0; tu < 10; tu++)
 
23855
              {
 
23856
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
23857
              }// end loop over 'tu'
 
23858
            }// end loop over 'u'
 
23859
          }// end loop over 't'
 
23860
          }
 
23861
          
 
23862
          if (combinations[r][s] == 1)
 
23863
          {
 
23864
          for (unsigned int t = 0; t < 10; t++)
 
23865
          {
 
23866
            for (unsigned int u = 0; u < 10; u++)
 
23867
            {
 
23868
              for (unsigned int tu = 0; tu < 10; tu++)
 
23869
              {
 
23870
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
23871
              }// end loop over 'tu'
 
23872
            }// end loop over 'u'
 
23873
          }// end loop over 't'
 
23874
          }
 
23875
          
 
23876
          if (combinations[r][s] == 2)
 
23877
          {
 
23878
          for (unsigned int t = 0; t < 10; t++)
 
23879
          {
 
23880
            for (unsigned int u = 0; u < 10; u++)
 
23881
            {
 
23882
              for (unsigned int tu = 0; tu < 10; tu++)
 
23883
              {
 
23884
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
23885
              }// end loop over 'tu'
 
23886
            }// end loop over 'u'
 
23887
          }// end loop over 't'
 
23888
          }
 
23889
          
 
23890
        }// end loop over 's'
 
23891
        for (unsigned int s = 0; s < 10; s++)
 
23892
        {
 
23893
          for (unsigned int t = 0; t < 10; t++)
 
23894
          {
 
23895
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
23896
          }// end loop over 't'
 
23897
        }// end loop over 's'
 
23898
      }// end loop over 'r'
 
23899
      
 
23900
      // Transform derivatives back to physical element
 
23901
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23902
      {
 
23903
        for (unsigned int s = 0; s < num_derivatives; s++)
 
23904
        {
 
23905
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
23906
        }// end loop over 's'
 
23907
      }// end loop over 'r'
 
23908
      
 
23909
      // Delete pointer to array of derivatives on FIAT element
 
23910
      delete [] derivatives;
 
23911
      
 
23912
      // Delete pointer to array of combinations of derivatives and transform
 
23913
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23914
      {
 
23915
        delete [] combinations[r];
 
23916
      }// end loop over 'r'
 
23917
      delete [] combinations;
 
23918
      for (unsigned int r = 0; r < num_derivatives; r++)
 
23919
      {
 
23920
        delete [] transform[r];
 
23921
      }// end loop over 'r'
 
23922
      delete [] transform;
 
23923
        break;
 
23924
      }
 
23925
    case 12:
 
23926
      {
 
23927
        
 
23928
      // Array of basisvalues.
 
23929
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
23930
      
 
23931
      // Declare helper variables.
 
23932
      unsigned int rr = 0;
 
23933
      unsigned int ss = 0;
 
23934
      unsigned int tt = 0;
 
23935
      double tmp5 = 0.000000000000000;
 
23936
      double tmp6 = 0.000000000000000;
 
23937
      double tmp7 = 0.000000000000000;
 
23938
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
23939
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
23940
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
23941
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
23942
      double tmp4 = tmp3*tmp3;
 
23943
      
 
23944
      // Compute basisvalues.
 
23945
      basisvalues[0] = 1.000000000000000;
 
23946
      basisvalues[1] = tmp0;
 
23947
      for (unsigned int r = 1; r < 2; r++)
 
23948
      {
 
23949
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
23950
        ss = r*(r + 1)*(r + 2)/6;
 
23951
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
23952
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
23953
      }// end loop over 'r'
 
23954
      for (unsigned int r = 0; r < 2; r++)
 
23955
      {
 
23956
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
23957
        ss = r*(r + 1)*(r + 2)/6;
 
23958
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
23959
      }// end loop over 'r'
 
23960
      for (unsigned int r = 0; r < 1; r++)
 
23961
      {
 
23962
        for (unsigned int s = 1; s < 2 - r; s++)
 
23963
        {
 
23964
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
23965
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23966
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
23967
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23968
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23969
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
23970
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
23971
        }// end loop over 's'
 
23972
      }// end loop over 'r'
 
23973
      for (unsigned int r = 0; r < 2; r++)
 
23974
      {
 
23975
        for (unsigned int s = 0; s < 2 - r; s++)
 
23976
        {
 
23977
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
23978
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
23979
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
23980
        }// end loop over 's'
 
23981
      }// end loop over 'r'
 
23982
      for (unsigned int r = 0; r < 1; r++)
 
23983
      {
 
23984
        for (unsigned int s = 0; s < 1 - r; s++)
 
23985
        {
 
23986
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
23987
          {
 
23988
            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;
 
23989
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
23990
            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;
 
23991
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23992
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23993
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
23994
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
23995
          }// end loop over 't'
 
23996
        }// end loop over 's'
 
23997
      }// end loop over 'r'
 
23998
      for (unsigned int r = 0; r < 3; r++)
 
23999
      {
 
24000
        for (unsigned int s = 0; s < 3 - r; s++)
 
24001
        {
 
24002
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
24003
          {
 
24004
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24005
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
24006
          }// end loop over 't'
 
24007
        }// end loop over 's'
 
24008
      }// end loop over 'r'
 
24009
      
 
24010
      // Table(s) of coefficients.
 
24011
      static const double coefficients0[10] = \
 
24012
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
24013
      
 
24014
      // Tables of derivatives of the polynomial base (transpose).
 
24015
      static const double dmats0[10][10] = \
 
24016
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24017
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24018
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24019
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24020
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24021
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24022
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24023
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24024
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24025
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24026
      
 
24027
      static const double dmats1[10][10] = \
 
24028
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24029
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24030
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24031
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24032
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24033
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24034
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24035
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24036
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24037
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24038
      
 
24039
      static const double dmats2[10][10] = \
 
24040
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24041
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24042
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24043
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24044
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24045
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24046
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24047
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24048
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24049
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24050
      
 
24051
      // Compute reference derivatives.
 
24052
      // Declare pointer to array of derivatives on FIAT element.
 
24053
      double *derivatives = new double[num_derivatives];
 
24054
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24055
      {
 
24056
        derivatives[r] = 0.000000000000000;
 
24057
      }// end loop over 'r'
 
24058
      
 
24059
      // Declare derivative matrix (of polynomial basis).
 
24060
      double dmats[10][10] = \
 
24061
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24062
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24063
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24064
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24065
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24066
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24067
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24068
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24069
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24070
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24071
      
 
24072
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
24073
      double dmats_old[10][10] = \
 
24074
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24075
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24076
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24077
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24078
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24079
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24080
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24081
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24082
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24083
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24084
      
 
24085
      // Loop possible derivatives.
 
24086
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24087
      {
 
24088
        // Resetting dmats values to compute next derivative.
 
24089
        for (unsigned int t = 0; t < 10; t++)
 
24090
        {
 
24091
          for (unsigned int u = 0; u < 10; u++)
 
24092
          {
 
24093
            dmats[t][u] = 0.000000000000000;
 
24094
            if (t == u)
 
24095
            {
 
24096
            dmats[t][u] = 1.000000000000000;
 
24097
            }
 
24098
            
 
24099
          }// end loop over 'u'
 
24100
        }// end loop over 't'
 
24101
        
 
24102
        // Looping derivative order to generate dmats.
 
24103
        for (unsigned int s = 0; s < n; s++)
 
24104
        {
 
24105
          // Updating dmats_old with new values and resetting dmats.
 
24106
          for (unsigned int t = 0; t < 10; t++)
 
24107
          {
 
24108
            for (unsigned int u = 0; u < 10; u++)
 
24109
            {
 
24110
              dmats_old[t][u] = dmats[t][u];
 
24111
              dmats[t][u] = 0.000000000000000;
 
24112
            }// end loop over 'u'
 
24113
          }// end loop over 't'
 
24114
          
 
24115
          // Update dmats using an inner product.
 
24116
          if (combinations[r][s] == 0)
 
24117
          {
 
24118
          for (unsigned int t = 0; t < 10; t++)
 
24119
          {
 
24120
            for (unsigned int u = 0; u < 10; u++)
 
24121
            {
 
24122
              for (unsigned int tu = 0; tu < 10; tu++)
 
24123
              {
 
24124
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
24125
              }// end loop over 'tu'
 
24126
            }// end loop over 'u'
 
24127
          }// end loop over 't'
 
24128
          }
 
24129
          
 
24130
          if (combinations[r][s] == 1)
 
24131
          {
 
24132
          for (unsigned int t = 0; t < 10; t++)
 
24133
          {
 
24134
            for (unsigned int u = 0; u < 10; u++)
 
24135
            {
 
24136
              for (unsigned int tu = 0; tu < 10; tu++)
 
24137
              {
 
24138
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
24139
              }// end loop over 'tu'
 
24140
            }// end loop over 'u'
 
24141
          }// end loop over 't'
 
24142
          }
 
24143
          
 
24144
          if (combinations[r][s] == 2)
 
24145
          {
 
24146
          for (unsigned int t = 0; t < 10; t++)
 
24147
          {
 
24148
            for (unsigned int u = 0; u < 10; u++)
 
24149
            {
 
24150
              for (unsigned int tu = 0; tu < 10; tu++)
 
24151
              {
 
24152
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
24153
              }// end loop over 'tu'
 
24154
            }// end loop over 'u'
 
24155
          }// end loop over 't'
 
24156
          }
 
24157
          
 
24158
        }// end loop over 's'
 
24159
        for (unsigned int s = 0; s < 10; s++)
 
24160
        {
 
24161
          for (unsigned int t = 0; t < 10; t++)
 
24162
          {
 
24163
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
24164
          }// end loop over 't'
 
24165
        }// end loop over 's'
 
24166
      }// end loop over 'r'
 
24167
      
 
24168
      // Transform derivatives back to physical element
 
24169
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24170
      {
 
24171
        for (unsigned int s = 0; s < num_derivatives; s++)
 
24172
        {
 
24173
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
24174
        }// end loop over 's'
 
24175
      }// end loop over 'r'
 
24176
      
 
24177
      // Delete pointer to array of derivatives on FIAT element
 
24178
      delete [] derivatives;
 
24179
      
 
24180
      // Delete pointer to array of combinations of derivatives and transform
 
24181
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24182
      {
 
24183
        delete [] combinations[r];
 
24184
      }// end loop over 'r'
 
24185
      delete [] combinations;
 
24186
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24187
      {
 
24188
        delete [] transform[r];
 
24189
      }// end loop over 'r'
 
24190
      delete [] transform;
 
24191
        break;
 
24192
      }
 
24193
    case 13:
 
24194
      {
 
24195
        
 
24196
      // Array of basisvalues.
 
24197
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
24198
      
 
24199
      // Declare helper variables.
 
24200
      unsigned int rr = 0;
 
24201
      unsigned int ss = 0;
 
24202
      unsigned int tt = 0;
 
24203
      double tmp5 = 0.000000000000000;
 
24204
      double tmp6 = 0.000000000000000;
 
24205
      double tmp7 = 0.000000000000000;
 
24206
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
24207
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
24208
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
24209
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
24210
      double tmp4 = tmp3*tmp3;
 
24211
      
 
24212
      // Compute basisvalues.
 
24213
      basisvalues[0] = 1.000000000000000;
 
24214
      basisvalues[1] = tmp0;
 
24215
      for (unsigned int r = 1; r < 2; r++)
 
24216
      {
 
24217
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
24218
        ss = r*(r + 1)*(r + 2)/6;
 
24219
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
24220
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
24221
      }// end loop over 'r'
 
24222
      for (unsigned int r = 0; r < 2; r++)
 
24223
      {
 
24224
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
24225
        ss = r*(r + 1)*(r + 2)/6;
 
24226
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
24227
      }// end loop over 'r'
 
24228
      for (unsigned int r = 0; r < 1; r++)
 
24229
      {
 
24230
        for (unsigned int s = 1; s < 2 - r; s++)
 
24231
        {
 
24232
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
24233
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
24234
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
24235
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24236
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24237
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24238
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
24239
        }// end loop over 's'
 
24240
      }// end loop over 'r'
 
24241
      for (unsigned int r = 0; r < 2; r++)
 
24242
      {
 
24243
        for (unsigned int s = 0; s < 2 - r; s++)
 
24244
        {
 
24245
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
24246
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
24247
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
24248
        }// end loop over 's'
 
24249
      }// end loop over 'r'
 
24250
      for (unsigned int r = 0; r < 1; r++)
 
24251
      {
 
24252
        for (unsigned int s = 0; s < 1 - r; s++)
 
24253
        {
 
24254
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
24255
          {
 
24256
            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;
 
24257
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24258
            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;
 
24259
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24260
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24261
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24262
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
24263
          }// end loop over 't'
 
24264
        }// end loop over 's'
 
24265
      }// end loop over 'r'
 
24266
      for (unsigned int r = 0; r < 3; r++)
 
24267
      {
 
24268
        for (unsigned int s = 0; s < 3 - r; s++)
 
24269
        {
 
24270
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
24271
          {
 
24272
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24273
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
24274
          }// end loop over 't'
 
24275
        }// end loop over 's'
 
24276
      }// end loop over 'r'
 
24277
      
 
24278
      // Table(s) of coefficients.
 
24279
      static const double coefficients0[10] = \
 
24280
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
24281
      
 
24282
      // Tables of derivatives of the polynomial base (transpose).
 
24283
      static const double dmats0[10][10] = \
 
24284
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24285
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24286
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24287
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24288
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24289
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24290
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24291
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24292
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24293
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24294
      
 
24295
      static const double dmats1[10][10] = \
 
24296
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24297
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24298
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24299
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24300
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24301
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24302
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24303
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24304
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24305
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24306
      
 
24307
      static const double dmats2[10][10] = \
 
24308
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24309
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24310
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24311
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24312
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24313
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24314
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24315
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24316
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24317
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24318
      
 
24319
      // Compute reference derivatives.
 
24320
      // Declare pointer to array of derivatives on FIAT element.
 
24321
      double *derivatives = new double[num_derivatives];
 
24322
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24323
      {
 
24324
        derivatives[r] = 0.000000000000000;
 
24325
      }// end loop over 'r'
 
24326
      
 
24327
      // Declare derivative matrix (of polynomial basis).
 
24328
      double dmats[10][10] = \
 
24329
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24330
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24331
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24332
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24333
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24334
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24335
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24336
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24337
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24338
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24339
      
 
24340
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
24341
      double dmats_old[10][10] = \
 
24342
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24343
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24344
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24345
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24346
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24347
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24348
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24349
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24350
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24351
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24352
      
 
24353
      // Loop possible derivatives.
 
24354
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24355
      {
 
24356
        // Resetting dmats values to compute next derivative.
 
24357
        for (unsigned int t = 0; t < 10; t++)
 
24358
        {
 
24359
          for (unsigned int u = 0; u < 10; u++)
 
24360
          {
 
24361
            dmats[t][u] = 0.000000000000000;
 
24362
            if (t == u)
 
24363
            {
 
24364
            dmats[t][u] = 1.000000000000000;
 
24365
            }
 
24366
            
 
24367
          }// end loop over 'u'
 
24368
        }// end loop over 't'
 
24369
        
 
24370
        // Looping derivative order to generate dmats.
 
24371
        for (unsigned int s = 0; s < n; s++)
 
24372
        {
 
24373
          // Updating dmats_old with new values and resetting dmats.
 
24374
          for (unsigned int t = 0; t < 10; t++)
 
24375
          {
 
24376
            for (unsigned int u = 0; u < 10; u++)
 
24377
            {
 
24378
              dmats_old[t][u] = dmats[t][u];
 
24379
              dmats[t][u] = 0.000000000000000;
 
24380
            }// end loop over 'u'
 
24381
          }// end loop over 't'
 
24382
          
 
24383
          // Update dmats using an inner product.
 
24384
          if (combinations[r][s] == 0)
 
24385
          {
 
24386
          for (unsigned int t = 0; t < 10; t++)
 
24387
          {
 
24388
            for (unsigned int u = 0; u < 10; u++)
 
24389
            {
 
24390
              for (unsigned int tu = 0; tu < 10; tu++)
 
24391
              {
 
24392
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
24393
              }// end loop over 'tu'
 
24394
            }// end loop over 'u'
 
24395
          }// end loop over 't'
 
24396
          }
 
24397
          
 
24398
          if (combinations[r][s] == 1)
 
24399
          {
 
24400
          for (unsigned int t = 0; t < 10; t++)
 
24401
          {
 
24402
            for (unsigned int u = 0; u < 10; u++)
 
24403
            {
 
24404
              for (unsigned int tu = 0; tu < 10; tu++)
 
24405
              {
 
24406
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
24407
              }// end loop over 'tu'
 
24408
            }// end loop over 'u'
 
24409
          }// end loop over 't'
 
24410
          }
 
24411
          
 
24412
          if (combinations[r][s] == 2)
 
24413
          {
 
24414
          for (unsigned int t = 0; t < 10; t++)
 
24415
          {
 
24416
            for (unsigned int u = 0; u < 10; u++)
 
24417
            {
 
24418
              for (unsigned int tu = 0; tu < 10; tu++)
 
24419
              {
 
24420
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
24421
              }// end loop over 'tu'
 
24422
            }// end loop over 'u'
 
24423
          }// end loop over 't'
 
24424
          }
 
24425
          
 
24426
        }// end loop over 's'
 
24427
        for (unsigned int s = 0; s < 10; s++)
 
24428
        {
 
24429
          for (unsigned int t = 0; t < 10; t++)
 
24430
          {
 
24431
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
24432
          }// end loop over 't'
 
24433
        }// end loop over 's'
 
24434
      }// end loop over 'r'
 
24435
      
 
24436
      // Transform derivatives back to physical element
 
24437
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24438
      {
 
24439
        for (unsigned int s = 0; s < num_derivatives; s++)
 
24440
        {
 
24441
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
24442
        }// end loop over 's'
 
24443
      }// end loop over 'r'
 
24444
      
 
24445
      // Delete pointer to array of derivatives on FIAT element
 
24446
      delete [] derivatives;
 
24447
      
 
24448
      // Delete pointer to array of combinations of derivatives and transform
 
24449
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24450
      {
 
24451
        delete [] combinations[r];
 
24452
      }// end loop over 'r'
 
24453
      delete [] combinations;
 
24454
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24455
      {
 
24456
        delete [] transform[r];
 
24457
      }// end loop over 'r'
 
24458
      delete [] transform;
 
24459
        break;
 
24460
      }
 
24461
    case 14:
 
24462
      {
 
24463
        
 
24464
      // Array of basisvalues.
 
24465
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
24466
      
 
24467
      // Declare helper variables.
 
24468
      unsigned int rr = 0;
 
24469
      unsigned int ss = 0;
 
24470
      unsigned int tt = 0;
 
24471
      double tmp5 = 0.000000000000000;
 
24472
      double tmp6 = 0.000000000000000;
 
24473
      double tmp7 = 0.000000000000000;
 
24474
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
24475
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
24476
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
24477
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
24478
      double tmp4 = tmp3*tmp3;
 
24479
      
 
24480
      // Compute basisvalues.
 
24481
      basisvalues[0] = 1.000000000000000;
 
24482
      basisvalues[1] = tmp0;
 
24483
      for (unsigned int r = 1; r < 2; r++)
 
24484
      {
 
24485
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
24486
        ss = r*(r + 1)*(r + 2)/6;
 
24487
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
24488
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
24489
      }// end loop over 'r'
 
24490
      for (unsigned int r = 0; r < 2; r++)
 
24491
      {
 
24492
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
24493
        ss = r*(r + 1)*(r + 2)/6;
 
24494
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
24495
      }// end loop over 'r'
 
24496
      for (unsigned int r = 0; r < 1; r++)
 
24497
      {
 
24498
        for (unsigned int s = 1; s < 2 - r; s++)
 
24499
        {
 
24500
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
24501
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
24502
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
24503
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24504
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24505
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24506
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
24507
        }// end loop over 's'
 
24508
      }// end loop over 'r'
 
24509
      for (unsigned int r = 0; r < 2; r++)
 
24510
      {
 
24511
        for (unsigned int s = 0; s < 2 - r; s++)
 
24512
        {
 
24513
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
24514
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
24515
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
24516
        }// end loop over 's'
 
24517
      }// end loop over 'r'
 
24518
      for (unsigned int r = 0; r < 1; r++)
 
24519
      {
 
24520
        for (unsigned int s = 0; s < 1 - r; s++)
 
24521
        {
 
24522
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
24523
          {
 
24524
            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;
 
24525
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24526
            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;
 
24527
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24528
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24529
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24530
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
24531
          }// end loop over 't'
 
24532
        }// end loop over 's'
 
24533
      }// end loop over 'r'
 
24534
      for (unsigned int r = 0; r < 3; r++)
 
24535
      {
 
24536
        for (unsigned int s = 0; s < 3 - r; s++)
 
24537
        {
 
24538
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
24539
          {
 
24540
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24541
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
24542
          }// end loop over 't'
 
24543
        }// end loop over 's'
 
24544
      }// end loop over 'r'
 
24545
      
 
24546
      // Table(s) of coefficients.
 
24547
      static const double coefficients0[10] = \
 
24548
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
24549
      
 
24550
      // Tables of derivatives of the polynomial base (transpose).
 
24551
      static const double dmats0[10][10] = \
 
24552
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24553
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24554
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24555
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24556
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24557
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24558
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24559
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24560
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24561
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24562
      
 
24563
      static const double dmats1[10][10] = \
 
24564
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24565
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24566
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24567
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24568
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24569
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24570
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24571
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24572
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24573
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24574
      
 
24575
      static const double dmats2[10][10] = \
 
24576
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24577
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24578
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24579
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24580
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24581
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24582
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24583
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24584
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24585
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24586
      
 
24587
      // Compute reference derivatives.
 
24588
      // Declare pointer to array of derivatives on FIAT element.
 
24589
      double *derivatives = new double[num_derivatives];
 
24590
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24591
      {
 
24592
        derivatives[r] = 0.000000000000000;
 
24593
      }// end loop over 'r'
 
24594
      
 
24595
      // Declare derivative matrix (of polynomial basis).
 
24596
      double dmats[10][10] = \
 
24597
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24598
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24599
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24600
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24601
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24602
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24603
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24604
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24605
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24606
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24607
      
 
24608
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
24609
      double dmats_old[10][10] = \
 
24610
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24611
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24612
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24613
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24614
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24615
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24616
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24617
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24618
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24619
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24620
      
 
24621
      // Loop possible derivatives.
 
24622
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24623
      {
 
24624
        // Resetting dmats values to compute next derivative.
 
24625
        for (unsigned int t = 0; t < 10; t++)
 
24626
        {
 
24627
          for (unsigned int u = 0; u < 10; u++)
 
24628
          {
 
24629
            dmats[t][u] = 0.000000000000000;
 
24630
            if (t == u)
 
24631
            {
 
24632
            dmats[t][u] = 1.000000000000000;
 
24633
            }
 
24634
            
 
24635
          }// end loop over 'u'
 
24636
        }// end loop over 't'
 
24637
        
 
24638
        // Looping derivative order to generate dmats.
 
24639
        for (unsigned int s = 0; s < n; s++)
 
24640
        {
 
24641
          // Updating dmats_old with new values and resetting dmats.
 
24642
          for (unsigned int t = 0; t < 10; t++)
 
24643
          {
 
24644
            for (unsigned int u = 0; u < 10; u++)
 
24645
            {
 
24646
              dmats_old[t][u] = dmats[t][u];
 
24647
              dmats[t][u] = 0.000000000000000;
 
24648
            }// end loop over 'u'
 
24649
          }// end loop over 't'
 
24650
          
 
24651
          // Update dmats using an inner product.
 
24652
          if (combinations[r][s] == 0)
 
24653
          {
 
24654
          for (unsigned int t = 0; t < 10; t++)
 
24655
          {
 
24656
            for (unsigned int u = 0; u < 10; u++)
 
24657
            {
 
24658
              for (unsigned int tu = 0; tu < 10; tu++)
 
24659
              {
 
24660
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
24661
              }// end loop over 'tu'
 
24662
            }// end loop over 'u'
 
24663
          }// end loop over 't'
 
24664
          }
 
24665
          
 
24666
          if (combinations[r][s] == 1)
 
24667
          {
 
24668
          for (unsigned int t = 0; t < 10; t++)
 
24669
          {
 
24670
            for (unsigned int u = 0; u < 10; u++)
 
24671
            {
 
24672
              for (unsigned int tu = 0; tu < 10; tu++)
 
24673
              {
 
24674
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
24675
              }// end loop over 'tu'
 
24676
            }// end loop over 'u'
 
24677
          }// end loop over 't'
 
24678
          }
 
24679
          
 
24680
          if (combinations[r][s] == 2)
 
24681
          {
 
24682
          for (unsigned int t = 0; t < 10; t++)
 
24683
          {
 
24684
            for (unsigned int u = 0; u < 10; u++)
 
24685
            {
 
24686
              for (unsigned int tu = 0; tu < 10; tu++)
 
24687
              {
 
24688
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
24689
              }// end loop over 'tu'
 
24690
            }// end loop over 'u'
 
24691
          }// end loop over 't'
 
24692
          }
 
24693
          
 
24694
        }// end loop over 's'
 
24695
        for (unsigned int s = 0; s < 10; s++)
 
24696
        {
 
24697
          for (unsigned int t = 0; t < 10; t++)
 
24698
          {
 
24699
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
24700
          }// end loop over 't'
 
24701
        }// end loop over 's'
 
24702
      }// end loop over 'r'
 
24703
      
 
24704
      // Transform derivatives back to physical element
 
24705
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24706
      {
 
24707
        for (unsigned int s = 0; s < num_derivatives; s++)
 
24708
        {
 
24709
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
24710
        }// end loop over 's'
 
24711
      }// end loop over 'r'
 
24712
      
 
24713
      // Delete pointer to array of derivatives on FIAT element
 
24714
      delete [] derivatives;
 
24715
      
 
24716
      // Delete pointer to array of combinations of derivatives and transform
 
24717
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24718
      {
 
24719
        delete [] combinations[r];
 
24720
      }// end loop over 'r'
 
24721
      delete [] combinations;
 
24722
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24723
      {
 
24724
        delete [] transform[r];
 
24725
      }// end loop over 'r'
 
24726
      delete [] transform;
 
24727
        break;
 
24728
      }
 
24729
    case 15:
 
24730
      {
 
24731
        
 
24732
      // Array of basisvalues.
 
24733
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
24734
      
 
24735
      // Declare helper variables.
 
24736
      unsigned int rr = 0;
 
24737
      unsigned int ss = 0;
 
24738
      unsigned int tt = 0;
 
24739
      double tmp5 = 0.000000000000000;
 
24740
      double tmp6 = 0.000000000000000;
 
24741
      double tmp7 = 0.000000000000000;
 
24742
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
24743
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
24744
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
24745
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
24746
      double tmp4 = tmp3*tmp3;
 
24747
      
 
24748
      // Compute basisvalues.
 
24749
      basisvalues[0] = 1.000000000000000;
 
24750
      basisvalues[1] = tmp0;
 
24751
      for (unsigned int r = 1; r < 2; r++)
 
24752
      {
 
24753
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
24754
        ss = r*(r + 1)*(r + 2)/6;
 
24755
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
24756
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
24757
      }// end loop over 'r'
 
24758
      for (unsigned int r = 0; r < 2; r++)
 
24759
      {
 
24760
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
24761
        ss = r*(r + 1)*(r + 2)/6;
 
24762
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
24763
      }// end loop over 'r'
 
24764
      for (unsigned int r = 0; r < 1; r++)
 
24765
      {
 
24766
        for (unsigned int s = 1; s < 2 - r; s++)
 
24767
        {
 
24768
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
24769
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
24770
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
24771
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24772
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24773
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
24774
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
24775
        }// end loop over 's'
 
24776
      }// end loop over 'r'
 
24777
      for (unsigned int r = 0; r < 2; r++)
 
24778
      {
 
24779
        for (unsigned int s = 0; s < 2 - r; s++)
 
24780
        {
 
24781
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
24782
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
24783
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
24784
        }// end loop over 's'
 
24785
      }// end loop over 'r'
 
24786
      for (unsigned int r = 0; r < 1; r++)
 
24787
      {
 
24788
        for (unsigned int s = 0; s < 1 - r; s++)
 
24789
        {
 
24790
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
24791
          {
 
24792
            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;
 
24793
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24794
            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;
 
24795
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24796
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24797
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
24798
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
24799
          }// end loop over 't'
 
24800
        }// end loop over 's'
 
24801
      }// end loop over 'r'
 
24802
      for (unsigned int r = 0; r < 3; r++)
 
24803
      {
 
24804
        for (unsigned int s = 0; s < 3 - r; s++)
 
24805
        {
 
24806
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
24807
          {
 
24808
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
24809
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
24810
          }// end loop over 't'
 
24811
        }// end loop over 's'
 
24812
      }// end loop over 'r'
 
24813
      
 
24814
      // Table(s) of coefficients.
 
24815
      static const double coefficients0[10] = \
 
24816
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
24817
      
 
24818
      // Tables of derivatives of the polynomial base (transpose).
 
24819
      static const double dmats0[10][10] = \
 
24820
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24821
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24822
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24823
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24824
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24825
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24826
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24827
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24828
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24829
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24830
      
 
24831
      static const double dmats1[10][10] = \
 
24832
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24833
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24834
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24835
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24836
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24837
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24838
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24839
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24840
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24841
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24842
      
 
24843
      static const double dmats2[10][10] = \
 
24844
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24845
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24846
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24847
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24848
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24849
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24850
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24851
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24852
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24853
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
24854
      
 
24855
      // Compute reference derivatives.
 
24856
      // Declare pointer to array of derivatives on FIAT element.
 
24857
      double *derivatives = new double[num_derivatives];
 
24858
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24859
      {
 
24860
        derivatives[r] = 0.000000000000000;
 
24861
      }// end loop over 'r'
 
24862
      
 
24863
      // Declare derivative matrix (of polynomial basis).
 
24864
      double dmats[10][10] = \
 
24865
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24866
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24867
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24868
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24869
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24870
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24871
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24872
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24873
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24874
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24875
      
 
24876
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
24877
      double dmats_old[10][10] = \
 
24878
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24879
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24880
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24881
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24882
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24883
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24884
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
24885
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
24886
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
24887
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
24888
      
 
24889
      // Loop possible derivatives.
 
24890
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24891
      {
 
24892
        // Resetting dmats values to compute next derivative.
 
24893
        for (unsigned int t = 0; t < 10; t++)
 
24894
        {
 
24895
          for (unsigned int u = 0; u < 10; u++)
 
24896
          {
 
24897
            dmats[t][u] = 0.000000000000000;
 
24898
            if (t == u)
 
24899
            {
 
24900
            dmats[t][u] = 1.000000000000000;
 
24901
            }
 
24902
            
 
24903
          }// end loop over 'u'
 
24904
        }// end loop over 't'
 
24905
        
 
24906
        // Looping derivative order to generate dmats.
 
24907
        for (unsigned int s = 0; s < n; s++)
 
24908
        {
 
24909
          // Updating dmats_old with new values and resetting dmats.
 
24910
          for (unsigned int t = 0; t < 10; t++)
 
24911
          {
 
24912
            for (unsigned int u = 0; u < 10; u++)
 
24913
            {
 
24914
              dmats_old[t][u] = dmats[t][u];
 
24915
              dmats[t][u] = 0.000000000000000;
 
24916
            }// end loop over 'u'
 
24917
          }// end loop over 't'
 
24918
          
 
24919
          // Update dmats using an inner product.
 
24920
          if (combinations[r][s] == 0)
 
24921
          {
 
24922
          for (unsigned int t = 0; t < 10; t++)
 
24923
          {
 
24924
            for (unsigned int u = 0; u < 10; u++)
 
24925
            {
 
24926
              for (unsigned int tu = 0; tu < 10; tu++)
 
24927
              {
 
24928
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
24929
              }// end loop over 'tu'
 
24930
            }// end loop over 'u'
 
24931
          }// end loop over 't'
 
24932
          }
 
24933
          
 
24934
          if (combinations[r][s] == 1)
 
24935
          {
 
24936
          for (unsigned int t = 0; t < 10; t++)
 
24937
          {
 
24938
            for (unsigned int u = 0; u < 10; u++)
 
24939
            {
 
24940
              for (unsigned int tu = 0; tu < 10; tu++)
 
24941
              {
 
24942
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
24943
              }// end loop over 'tu'
 
24944
            }// end loop over 'u'
 
24945
          }// end loop over 't'
 
24946
          }
 
24947
          
 
24948
          if (combinations[r][s] == 2)
 
24949
          {
 
24950
          for (unsigned int t = 0; t < 10; t++)
 
24951
          {
 
24952
            for (unsigned int u = 0; u < 10; u++)
 
24953
            {
 
24954
              for (unsigned int tu = 0; tu < 10; tu++)
 
24955
              {
 
24956
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
24957
              }// end loop over 'tu'
 
24958
            }// end loop over 'u'
 
24959
          }// end loop over 't'
 
24960
          }
 
24961
          
 
24962
        }// end loop over 's'
 
24963
        for (unsigned int s = 0; s < 10; s++)
 
24964
        {
 
24965
          for (unsigned int t = 0; t < 10; t++)
 
24966
          {
 
24967
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
24968
          }// end loop over 't'
 
24969
        }// end loop over 's'
 
24970
      }// end loop over 'r'
 
24971
      
 
24972
      // Transform derivatives back to physical element
 
24973
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24974
      {
 
24975
        for (unsigned int s = 0; s < num_derivatives; s++)
 
24976
        {
 
24977
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
24978
        }// end loop over 's'
 
24979
      }// end loop over 'r'
 
24980
      
 
24981
      // Delete pointer to array of derivatives on FIAT element
 
24982
      delete [] derivatives;
 
24983
      
 
24984
      // Delete pointer to array of combinations of derivatives and transform
 
24985
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24986
      {
 
24987
        delete [] combinations[r];
 
24988
      }// end loop over 'r'
 
24989
      delete [] combinations;
 
24990
      for (unsigned int r = 0; r < num_derivatives; r++)
 
24991
      {
 
24992
        delete [] transform[r];
 
24993
      }// end loop over 'r'
 
24994
      delete [] transform;
 
24995
        break;
 
24996
      }
 
24997
    case 16:
 
24998
      {
 
24999
        
 
25000
      // Array of basisvalues.
 
25001
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
25002
      
 
25003
      // Declare helper variables.
 
25004
      unsigned int rr = 0;
 
25005
      unsigned int ss = 0;
 
25006
      unsigned int tt = 0;
 
25007
      double tmp5 = 0.000000000000000;
 
25008
      double tmp6 = 0.000000000000000;
 
25009
      double tmp7 = 0.000000000000000;
 
25010
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
25011
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
25012
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
25013
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
25014
      double tmp4 = tmp3*tmp3;
 
25015
      
 
25016
      // Compute basisvalues.
 
25017
      basisvalues[0] = 1.000000000000000;
 
25018
      basisvalues[1] = tmp0;
 
25019
      for (unsigned int r = 1; r < 2; r++)
 
25020
      {
 
25021
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
25022
        ss = r*(r + 1)*(r + 2)/6;
 
25023
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
25024
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
25025
      }// end loop over 'r'
 
25026
      for (unsigned int r = 0; r < 2; r++)
 
25027
      {
 
25028
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
25029
        ss = r*(r + 1)*(r + 2)/6;
 
25030
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
25031
      }// end loop over 'r'
 
25032
      for (unsigned int r = 0; r < 1; r++)
 
25033
      {
 
25034
        for (unsigned int s = 1; s < 2 - r; s++)
 
25035
        {
 
25036
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
25037
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25038
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
25039
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25040
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25041
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25042
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
25043
        }// end loop over 's'
 
25044
      }// end loop over 'r'
 
25045
      for (unsigned int r = 0; r < 2; r++)
 
25046
      {
 
25047
        for (unsigned int s = 0; s < 2 - r; s++)
 
25048
        {
 
25049
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
25050
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25051
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
25052
        }// end loop over 's'
 
25053
      }// end loop over 'r'
 
25054
      for (unsigned int r = 0; r < 1; r++)
 
25055
      {
 
25056
        for (unsigned int s = 0; s < 1 - r; s++)
 
25057
        {
 
25058
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
25059
          {
 
25060
            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;
 
25061
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25062
            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;
 
25063
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25064
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25065
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25066
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
25067
          }// end loop over 't'
 
25068
        }// end loop over 's'
 
25069
      }// end loop over 'r'
 
25070
      for (unsigned int r = 0; r < 3; r++)
 
25071
      {
 
25072
        for (unsigned int s = 0; s < 3 - r; s++)
 
25073
        {
 
25074
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
25075
          {
 
25076
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25077
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
25078
          }// end loop over 't'
 
25079
        }// end loop over 's'
 
25080
      }// end loop over 'r'
 
25081
      
 
25082
      // Table(s) of coefficients.
 
25083
      static const double coefficients0[10] = \
 
25084
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
25085
      
 
25086
      // Tables of derivatives of the polynomial base (transpose).
 
25087
      static const double dmats0[10][10] = \
 
25088
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25089
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25090
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25091
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25092
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25093
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25094
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25095
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25096
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25097
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25098
      
 
25099
      static const double dmats1[10][10] = \
 
25100
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25101
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25102
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25103
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25104
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25105
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25106
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25107
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25108
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25109
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25110
      
 
25111
      static const double dmats2[10][10] = \
 
25112
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25113
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25114
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25115
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25116
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25117
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25118
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25119
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25120
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25121
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25122
      
 
25123
      // Compute reference derivatives.
 
25124
      // Declare pointer to array of derivatives on FIAT element.
 
25125
      double *derivatives = new double[num_derivatives];
 
25126
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25127
      {
 
25128
        derivatives[r] = 0.000000000000000;
 
25129
      }// end loop over 'r'
 
25130
      
 
25131
      // Declare derivative matrix (of polynomial basis).
 
25132
      double dmats[10][10] = \
 
25133
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25134
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25135
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25136
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25137
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25138
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25139
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25140
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25141
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25142
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25143
      
 
25144
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
25145
      double dmats_old[10][10] = \
 
25146
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25147
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25148
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25149
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25150
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25151
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25152
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25153
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25154
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25155
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25156
      
 
25157
      // Loop possible derivatives.
 
25158
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25159
      {
 
25160
        // Resetting dmats values to compute next derivative.
 
25161
        for (unsigned int t = 0; t < 10; t++)
 
25162
        {
 
25163
          for (unsigned int u = 0; u < 10; u++)
 
25164
          {
 
25165
            dmats[t][u] = 0.000000000000000;
 
25166
            if (t == u)
 
25167
            {
 
25168
            dmats[t][u] = 1.000000000000000;
 
25169
            }
 
25170
            
 
25171
          }// end loop over 'u'
 
25172
        }// end loop over 't'
 
25173
        
 
25174
        // Looping derivative order to generate dmats.
 
25175
        for (unsigned int s = 0; s < n; s++)
 
25176
        {
 
25177
          // Updating dmats_old with new values and resetting dmats.
 
25178
          for (unsigned int t = 0; t < 10; t++)
 
25179
          {
 
25180
            for (unsigned int u = 0; u < 10; u++)
 
25181
            {
 
25182
              dmats_old[t][u] = dmats[t][u];
 
25183
              dmats[t][u] = 0.000000000000000;
 
25184
            }// end loop over 'u'
 
25185
          }// end loop over 't'
 
25186
          
 
25187
          // Update dmats using an inner product.
 
25188
          if (combinations[r][s] == 0)
 
25189
          {
 
25190
          for (unsigned int t = 0; t < 10; t++)
 
25191
          {
 
25192
            for (unsigned int u = 0; u < 10; u++)
 
25193
            {
 
25194
              for (unsigned int tu = 0; tu < 10; tu++)
 
25195
              {
 
25196
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
25197
              }// end loop over 'tu'
 
25198
            }// end loop over 'u'
 
25199
          }// end loop over 't'
 
25200
          }
 
25201
          
 
25202
          if (combinations[r][s] == 1)
 
25203
          {
 
25204
          for (unsigned int t = 0; t < 10; t++)
 
25205
          {
 
25206
            for (unsigned int u = 0; u < 10; u++)
 
25207
            {
 
25208
              for (unsigned int tu = 0; tu < 10; tu++)
 
25209
              {
 
25210
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
25211
              }// end loop over 'tu'
 
25212
            }// end loop over 'u'
 
25213
          }// end loop over 't'
 
25214
          }
 
25215
          
 
25216
          if (combinations[r][s] == 2)
 
25217
          {
 
25218
          for (unsigned int t = 0; t < 10; t++)
 
25219
          {
 
25220
            for (unsigned int u = 0; u < 10; u++)
 
25221
            {
 
25222
              for (unsigned int tu = 0; tu < 10; tu++)
 
25223
              {
 
25224
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
25225
              }// end loop over 'tu'
 
25226
            }// end loop over 'u'
 
25227
          }// end loop over 't'
 
25228
          }
 
25229
          
 
25230
        }// end loop over 's'
 
25231
        for (unsigned int s = 0; s < 10; s++)
 
25232
        {
 
25233
          for (unsigned int t = 0; t < 10; t++)
 
25234
          {
 
25235
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
25236
          }// end loop over 't'
 
25237
        }// end loop over 's'
 
25238
      }// end loop over 'r'
 
25239
      
 
25240
      // Transform derivatives back to physical element
 
25241
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25242
      {
 
25243
        for (unsigned int s = 0; s < num_derivatives; s++)
 
25244
        {
 
25245
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
25246
        }// end loop over 's'
 
25247
      }// end loop over 'r'
 
25248
      
 
25249
      // Delete pointer to array of derivatives on FIAT element
 
25250
      delete [] derivatives;
 
25251
      
 
25252
      // Delete pointer to array of combinations of derivatives and transform
 
25253
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25254
      {
 
25255
        delete [] combinations[r];
 
25256
      }// end loop over 'r'
 
25257
      delete [] combinations;
 
25258
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25259
      {
 
25260
        delete [] transform[r];
 
25261
      }// end loop over 'r'
 
25262
      delete [] transform;
 
25263
        break;
 
25264
      }
 
25265
    case 17:
 
25266
      {
 
25267
        
 
25268
      // Array of basisvalues.
 
25269
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
25270
      
 
25271
      // Declare helper variables.
 
25272
      unsigned int rr = 0;
 
25273
      unsigned int ss = 0;
 
25274
      unsigned int tt = 0;
 
25275
      double tmp5 = 0.000000000000000;
 
25276
      double tmp6 = 0.000000000000000;
 
25277
      double tmp7 = 0.000000000000000;
 
25278
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
25279
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
25280
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
25281
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
25282
      double tmp4 = tmp3*tmp3;
 
25283
      
 
25284
      // Compute basisvalues.
 
25285
      basisvalues[0] = 1.000000000000000;
 
25286
      basisvalues[1] = tmp0;
 
25287
      for (unsigned int r = 1; r < 2; r++)
 
25288
      {
 
25289
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
25290
        ss = r*(r + 1)*(r + 2)/6;
 
25291
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
25292
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
25293
      }// end loop over 'r'
 
25294
      for (unsigned int r = 0; r < 2; r++)
 
25295
      {
 
25296
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
25297
        ss = r*(r + 1)*(r + 2)/6;
 
25298
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
25299
      }// end loop over 'r'
 
25300
      for (unsigned int r = 0; r < 1; r++)
 
25301
      {
 
25302
        for (unsigned int s = 1; s < 2 - r; s++)
 
25303
        {
 
25304
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
25305
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25306
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
25307
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25308
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25309
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25310
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
25311
        }// end loop over 's'
 
25312
      }// end loop over 'r'
 
25313
      for (unsigned int r = 0; r < 2; r++)
 
25314
      {
 
25315
        for (unsigned int s = 0; s < 2 - r; s++)
 
25316
        {
 
25317
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
25318
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25319
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
25320
        }// end loop over 's'
 
25321
      }// end loop over 'r'
 
25322
      for (unsigned int r = 0; r < 1; r++)
 
25323
      {
 
25324
        for (unsigned int s = 0; s < 1 - r; s++)
 
25325
        {
 
25326
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
25327
          {
 
25328
            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;
 
25329
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25330
            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;
 
25331
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25332
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25333
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25334
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
25335
          }// end loop over 't'
 
25336
        }// end loop over 's'
 
25337
      }// end loop over 'r'
 
25338
      for (unsigned int r = 0; r < 3; r++)
 
25339
      {
 
25340
        for (unsigned int s = 0; s < 3 - r; s++)
 
25341
        {
 
25342
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
25343
          {
 
25344
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25345
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
25346
          }// end loop over 't'
 
25347
        }// end loop over 's'
 
25348
      }// end loop over 'r'
 
25349
      
 
25350
      // Table(s) of coefficients.
 
25351
      static const double coefficients0[10] = \
 
25352
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
25353
      
 
25354
      // Tables of derivatives of the polynomial base (transpose).
 
25355
      static const double dmats0[10][10] = \
 
25356
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25357
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25358
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25359
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25360
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25361
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25362
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25363
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25364
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25365
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25366
      
 
25367
      static const double dmats1[10][10] = \
 
25368
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25369
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25370
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25371
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25372
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25373
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25374
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25375
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25376
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25377
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25378
      
 
25379
      static const double dmats2[10][10] = \
 
25380
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25381
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25382
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25383
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25384
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25385
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25386
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25387
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25388
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25389
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25390
      
 
25391
      // Compute reference derivatives.
 
25392
      // Declare pointer to array of derivatives on FIAT element.
 
25393
      double *derivatives = new double[num_derivatives];
 
25394
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25395
      {
 
25396
        derivatives[r] = 0.000000000000000;
 
25397
      }// end loop over 'r'
 
25398
      
 
25399
      // Declare derivative matrix (of polynomial basis).
 
25400
      double dmats[10][10] = \
 
25401
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25402
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25403
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25404
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25405
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25406
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25407
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25408
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25409
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25410
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25411
      
 
25412
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
25413
      double dmats_old[10][10] = \
 
25414
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25415
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25416
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25417
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25418
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25419
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25420
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25421
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25422
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25423
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25424
      
 
25425
      // Loop possible derivatives.
 
25426
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25427
      {
 
25428
        // Resetting dmats values to compute next derivative.
 
25429
        for (unsigned int t = 0; t < 10; t++)
 
25430
        {
 
25431
          for (unsigned int u = 0; u < 10; u++)
 
25432
          {
 
25433
            dmats[t][u] = 0.000000000000000;
 
25434
            if (t == u)
 
25435
            {
 
25436
            dmats[t][u] = 1.000000000000000;
 
25437
            }
 
25438
            
 
25439
          }// end loop over 'u'
 
25440
        }// end loop over 't'
 
25441
        
 
25442
        // Looping derivative order to generate dmats.
 
25443
        for (unsigned int s = 0; s < n; s++)
 
25444
        {
 
25445
          // Updating dmats_old with new values and resetting dmats.
 
25446
          for (unsigned int t = 0; t < 10; t++)
 
25447
          {
 
25448
            for (unsigned int u = 0; u < 10; u++)
 
25449
            {
 
25450
              dmats_old[t][u] = dmats[t][u];
 
25451
              dmats[t][u] = 0.000000000000000;
 
25452
            }// end loop over 'u'
 
25453
          }// end loop over 't'
 
25454
          
 
25455
          // Update dmats using an inner product.
 
25456
          if (combinations[r][s] == 0)
 
25457
          {
 
25458
          for (unsigned int t = 0; t < 10; t++)
 
25459
          {
 
25460
            for (unsigned int u = 0; u < 10; u++)
 
25461
            {
 
25462
              for (unsigned int tu = 0; tu < 10; tu++)
 
25463
              {
 
25464
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
25465
              }// end loop over 'tu'
 
25466
            }// end loop over 'u'
 
25467
          }// end loop over 't'
 
25468
          }
 
25469
          
 
25470
          if (combinations[r][s] == 1)
 
25471
          {
 
25472
          for (unsigned int t = 0; t < 10; t++)
 
25473
          {
 
25474
            for (unsigned int u = 0; u < 10; u++)
 
25475
            {
 
25476
              for (unsigned int tu = 0; tu < 10; tu++)
 
25477
              {
 
25478
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
25479
              }// end loop over 'tu'
 
25480
            }// end loop over 'u'
 
25481
          }// end loop over 't'
 
25482
          }
 
25483
          
 
25484
          if (combinations[r][s] == 2)
 
25485
          {
 
25486
          for (unsigned int t = 0; t < 10; t++)
 
25487
          {
 
25488
            for (unsigned int u = 0; u < 10; u++)
 
25489
            {
 
25490
              for (unsigned int tu = 0; tu < 10; tu++)
 
25491
              {
 
25492
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
25493
              }// end loop over 'tu'
 
25494
            }// end loop over 'u'
 
25495
          }// end loop over 't'
 
25496
          }
 
25497
          
 
25498
        }// end loop over 's'
 
25499
        for (unsigned int s = 0; s < 10; s++)
 
25500
        {
 
25501
          for (unsigned int t = 0; t < 10; t++)
 
25502
          {
 
25503
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
25504
          }// end loop over 't'
 
25505
        }// end loop over 's'
 
25506
      }// end loop over 'r'
 
25507
      
 
25508
      // Transform derivatives back to physical element
 
25509
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25510
      {
 
25511
        for (unsigned int s = 0; s < num_derivatives; s++)
 
25512
        {
 
25513
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
25514
        }// end loop over 's'
 
25515
      }// end loop over 'r'
 
25516
      
 
25517
      // Delete pointer to array of derivatives on FIAT element
 
25518
      delete [] derivatives;
 
25519
      
 
25520
      // Delete pointer to array of combinations of derivatives and transform
 
25521
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25522
      {
 
25523
        delete [] combinations[r];
 
25524
      }// end loop over 'r'
 
25525
      delete [] combinations;
 
25526
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25527
      {
 
25528
        delete [] transform[r];
 
25529
      }// end loop over 'r'
 
25530
      delete [] transform;
 
25531
        break;
 
25532
      }
 
25533
    case 18:
 
25534
      {
 
25535
        
 
25536
      // Array of basisvalues.
 
25537
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
25538
      
 
25539
      // Declare helper variables.
 
25540
      unsigned int rr = 0;
 
25541
      unsigned int ss = 0;
 
25542
      unsigned int tt = 0;
 
25543
      double tmp5 = 0.000000000000000;
 
25544
      double tmp6 = 0.000000000000000;
 
25545
      double tmp7 = 0.000000000000000;
 
25546
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
25547
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
25548
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
25549
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
25550
      double tmp4 = tmp3*tmp3;
 
25551
      
 
25552
      // Compute basisvalues.
 
25553
      basisvalues[0] = 1.000000000000000;
 
25554
      basisvalues[1] = tmp0;
 
25555
      for (unsigned int r = 1; r < 2; r++)
 
25556
      {
 
25557
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
25558
        ss = r*(r + 1)*(r + 2)/6;
 
25559
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
25560
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
25561
      }// end loop over 'r'
 
25562
      for (unsigned int r = 0; r < 2; r++)
 
25563
      {
 
25564
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
25565
        ss = r*(r + 1)*(r + 2)/6;
 
25566
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
25567
      }// end loop over 'r'
 
25568
      for (unsigned int r = 0; r < 1; r++)
 
25569
      {
 
25570
        for (unsigned int s = 1; s < 2 - r; s++)
 
25571
        {
 
25572
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
25573
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25574
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
25575
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25576
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25577
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25578
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
25579
        }// end loop over 's'
 
25580
      }// end loop over 'r'
 
25581
      for (unsigned int r = 0; r < 2; r++)
 
25582
      {
 
25583
        for (unsigned int s = 0; s < 2 - r; s++)
 
25584
        {
 
25585
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
25586
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25587
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
25588
        }// end loop over 's'
 
25589
      }// end loop over 'r'
 
25590
      for (unsigned int r = 0; r < 1; r++)
 
25591
      {
 
25592
        for (unsigned int s = 0; s < 1 - r; s++)
 
25593
        {
 
25594
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
25595
          {
 
25596
            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;
 
25597
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25598
            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;
 
25599
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25600
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25601
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25602
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
25603
          }// end loop over 't'
 
25604
        }// end loop over 's'
 
25605
      }// end loop over 'r'
 
25606
      for (unsigned int r = 0; r < 3; r++)
 
25607
      {
 
25608
        for (unsigned int s = 0; s < 3 - r; s++)
 
25609
        {
 
25610
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
25611
          {
 
25612
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25613
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
25614
          }// end loop over 't'
 
25615
        }// end loop over 's'
 
25616
      }// end loop over 'r'
 
25617
      
 
25618
      // Table(s) of coefficients.
 
25619
      static const double coefficients0[10] = \
 
25620
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
25621
      
 
25622
      // Tables of derivatives of the polynomial base (transpose).
 
25623
      static const double dmats0[10][10] = \
 
25624
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25625
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25626
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25627
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25628
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25629
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25630
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25631
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25632
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25633
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25634
      
 
25635
      static const double dmats1[10][10] = \
 
25636
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25637
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25638
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25639
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25640
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25641
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25642
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25643
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25644
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25645
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25646
      
 
25647
      static const double dmats2[10][10] = \
 
25648
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25649
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25650
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25651
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25652
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25653
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25654
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25655
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25656
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25657
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25658
      
 
25659
      // Compute reference derivatives.
 
25660
      // Declare pointer to array of derivatives on FIAT element.
 
25661
      double *derivatives = new double[num_derivatives];
 
25662
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25663
      {
 
25664
        derivatives[r] = 0.000000000000000;
 
25665
      }// end loop over 'r'
 
25666
      
 
25667
      // Declare derivative matrix (of polynomial basis).
 
25668
      double dmats[10][10] = \
 
25669
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25670
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25671
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25672
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25673
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25674
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25675
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25676
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25677
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25678
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25679
      
 
25680
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
25681
      double dmats_old[10][10] = \
 
25682
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25683
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25684
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25685
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25686
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25687
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25688
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25689
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25690
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25691
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25692
      
 
25693
      // Loop possible derivatives.
 
25694
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25695
      {
 
25696
        // Resetting dmats values to compute next derivative.
 
25697
        for (unsigned int t = 0; t < 10; t++)
 
25698
        {
 
25699
          for (unsigned int u = 0; u < 10; u++)
 
25700
          {
 
25701
            dmats[t][u] = 0.000000000000000;
 
25702
            if (t == u)
 
25703
            {
 
25704
            dmats[t][u] = 1.000000000000000;
 
25705
            }
 
25706
            
 
25707
          }// end loop over 'u'
 
25708
        }// end loop over 't'
 
25709
        
 
25710
        // Looping derivative order to generate dmats.
 
25711
        for (unsigned int s = 0; s < n; s++)
 
25712
        {
 
25713
          // Updating dmats_old with new values and resetting dmats.
 
25714
          for (unsigned int t = 0; t < 10; t++)
 
25715
          {
 
25716
            for (unsigned int u = 0; u < 10; u++)
 
25717
            {
 
25718
              dmats_old[t][u] = dmats[t][u];
 
25719
              dmats[t][u] = 0.000000000000000;
 
25720
            }// end loop over 'u'
 
25721
          }// end loop over 't'
 
25722
          
 
25723
          // Update dmats using an inner product.
 
25724
          if (combinations[r][s] == 0)
 
25725
          {
 
25726
          for (unsigned int t = 0; t < 10; t++)
 
25727
          {
 
25728
            for (unsigned int u = 0; u < 10; u++)
 
25729
            {
 
25730
              for (unsigned int tu = 0; tu < 10; tu++)
 
25731
              {
 
25732
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
25733
              }// end loop over 'tu'
 
25734
            }// end loop over 'u'
 
25735
          }// end loop over 't'
 
25736
          }
 
25737
          
 
25738
          if (combinations[r][s] == 1)
 
25739
          {
 
25740
          for (unsigned int t = 0; t < 10; t++)
 
25741
          {
 
25742
            for (unsigned int u = 0; u < 10; u++)
 
25743
            {
 
25744
              for (unsigned int tu = 0; tu < 10; tu++)
 
25745
              {
 
25746
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
25747
              }// end loop over 'tu'
 
25748
            }// end loop over 'u'
 
25749
          }// end loop over 't'
 
25750
          }
 
25751
          
 
25752
          if (combinations[r][s] == 2)
 
25753
          {
 
25754
          for (unsigned int t = 0; t < 10; t++)
 
25755
          {
 
25756
            for (unsigned int u = 0; u < 10; u++)
 
25757
            {
 
25758
              for (unsigned int tu = 0; tu < 10; tu++)
 
25759
              {
 
25760
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
25761
              }// end loop over 'tu'
 
25762
            }// end loop over 'u'
 
25763
          }// end loop over 't'
 
25764
          }
 
25765
          
 
25766
        }// end loop over 's'
 
25767
        for (unsigned int s = 0; s < 10; s++)
 
25768
        {
 
25769
          for (unsigned int t = 0; t < 10; t++)
 
25770
          {
 
25771
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
25772
          }// end loop over 't'
 
25773
        }// end loop over 's'
 
25774
      }// end loop over 'r'
 
25775
      
 
25776
      // Transform derivatives back to physical element
 
25777
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25778
      {
 
25779
        for (unsigned int s = 0; s < num_derivatives; s++)
 
25780
        {
 
25781
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
25782
        }// end loop over 's'
 
25783
      }// end loop over 'r'
 
25784
      
 
25785
      // Delete pointer to array of derivatives on FIAT element
 
25786
      delete [] derivatives;
 
25787
      
 
25788
      // Delete pointer to array of combinations of derivatives and transform
 
25789
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25790
      {
 
25791
        delete [] combinations[r];
 
25792
      }// end loop over 'r'
 
25793
      delete [] combinations;
 
25794
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25795
      {
 
25796
        delete [] transform[r];
 
25797
      }// end loop over 'r'
 
25798
      delete [] transform;
 
25799
        break;
 
25800
      }
 
25801
    case 19:
 
25802
      {
 
25803
        
 
25804
      // Array of basisvalues.
 
25805
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
25806
      
 
25807
      // Declare helper variables.
 
25808
      unsigned int rr = 0;
 
25809
      unsigned int ss = 0;
 
25810
      unsigned int tt = 0;
 
25811
      double tmp5 = 0.000000000000000;
 
25812
      double tmp6 = 0.000000000000000;
 
25813
      double tmp7 = 0.000000000000000;
 
25814
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
25815
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
25816
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
25817
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
25818
      double tmp4 = tmp3*tmp3;
 
25819
      
 
25820
      // Compute basisvalues.
 
25821
      basisvalues[0] = 1.000000000000000;
 
25822
      basisvalues[1] = tmp0;
 
25823
      for (unsigned int r = 1; r < 2; r++)
 
25824
      {
 
25825
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
25826
        ss = r*(r + 1)*(r + 2)/6;
 
25827
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
25828
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
25829
      }// end loop over 'r'
 
25830
      for (unsigned int r = 0; r < 2; r++)
 
25831
      {
 
25832
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
25833
        ss = r*(r + 1)*(r + 2)/6;
 
25834
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
25835
      }// end loop over 'r'
 
25836
      for (unsigned int r = 0; r < 1; r++)
 
25837
      {
 
25838
        for (unsigned int s = 1; s < 2 - r; s++)
 
25839
        {
 
25840
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
25841
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25842
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
25843
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25844
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25845
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
25846
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
25847
        }// end loop over 's'
 
25848
      }// end loop over 'r'
 
25849
      for (unsigned int r = 0; r < 2; r++)
 
25850
      {
 
25851
        for (unsigned int s = 0; s < 2 - r; s++)
 
25852
        {
 
25853
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
25854
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
25855
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
25856
        }// end loop over 's'
 
25857
      }// end loop over 'r'
 
25858
      for (unsigned int r = 0; r < 1; r++)
 
25859
      {
 
25860
        for (unsigned int s = 0; s < 1 - r; s++)
 
25861
        {
 
25862
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
25863
          {
 
25864
            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;
 
25865
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25866
            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;
 
25867
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25868
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25869
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
25870
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
25871
          }// end loop over 't'
 
25872
        }// end loop over 's'
 
25873
      }// end loop over 'r'
 
25874
      for (unsigned int r = 0; r < 3; r++)
 
25875
      {
 
25876
        for (unsigned int s = 0; s < 3 - r; s++)
 
25877
        {
 
25878
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
25879
          {
 
25880
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
25881
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
25882
          }// end loop over 't'
 
25883
        }// end loop over 's'
 
25884
      }// end loop over 'r'
 
25885
      
 
25886
      // Table(s) of coefficients.
 
25887
      static const double coefficients0[10] = \
 
25888
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
25889
      
 
25890
      // Tables of derivatives of the polynomial base (transpose).
 
25891
      static const double dmats0[10][10] = \
 
25892
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25893
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25894
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25895
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25896
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25897
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25898
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25899
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25900
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25901
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25902
      
 
25903
      static const double dmats1[10][10] = \
 
25904
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25905
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25906
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25907
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25908
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25909
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25910
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25911
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25912
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25913
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25914
      
 
25915
      static const double dmats2[10][10] = \
 
25916
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25917
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25918
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25919
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25920
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25921
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25922
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25923
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25924
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25925
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
25926
      
 
25927
      // Compute reference derivatives.
 
25928
      // Declare pointer to array of derivatives on FIAT element.
 
25929
      double *derivatives = new double[num_derivatives];
 
25930
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25931
      {
 
25932
        derivatives[r] = 0.000000000000000;
 
25933
      }// end loop over 'r'
 
25934
      
 
25935
      // Declare derivative matrix (of polynomial basis).
 
25936
      double dmats[10][10] = \
 
25937
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25938
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25939
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25940
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25941
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25942
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25943
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25944
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25945
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25946
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25947
      
 
25948
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
25949
      double dmats_old[10][10] = \
 
25950
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25951
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25952
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25953
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25954
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25955
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25956
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
25957
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
25958
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
25959
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
25960
      
 
25961
      // Loop possible derivatives.
 
25962
      for (unsigned int r = 0; r < num_derivatives; r++)
 
25963
      {
 
25964
        // Resetting dmats values to compute next derivative.
 
25965
        for (unsigned int t = 0; t < 10; t++)
 
25966
        {
 
25967
          for (unsigned int u = 0; u < 10; u++)
 
25968
          {
 
25969
            dmats[t][u] = 0.000000000000000;
 
25970
            if (t == u)
 
25971
            {
 
25972
            dmats[t][u] = 1.000000000000000;
 
25973
            }
 
25974
            
 
25975
          }// end loop over 'u'
 
25976
        }// end loop over 't'
 
25977
        
 
25978
        // Looping derivative order to generate dmats.
 
25979
        for (unsigned int s = 0; s < n; s++)
 
25980
        {
 
25981
          // Updating dmats_old with new values and resetting dmats.
 
25982
          for (unsigned int t = 0; t < 10; t++)
 
25983
          {
 
25984
            for (unsigned int u = 0; u < 10; u++)
 
25985
            {
 
25986
              dmats_old[t][u] = dmats[t][u];
 
25987
              dmats[t][u] = 0.000000000000000;
 
25988
            }// end loop over 'u'
 
25989
          }// end loop over 't'
 
25990
          
 
25991
          // Update dmats using an inner product.
 
25992
          if (combinations[r][s] == 0)
 
25993
          {
 
25994
          for (unsigned int t = 0; t < 10; t++)
 
25995
          {
 
25996
            for (unsigned int u = 0; u < 10; u++)
 
25997
            {
 
25998
              for (unsigned int tu = 0; tu < 10; tu++)
 
25999
              {
 
26000
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
26001
              }// end loop over 'tu'
 
26002
            }// end loop over 'u'
 
26003
          }// end loop over 't'
 
26004
          }
 
26005
          
 
26006
          if (combinations[r][s] == 1)
 
26007
          {
 
26008
          for (unsigned int t = 0; t < 10; t++)
 
26009
          {
 
26010
            for (unsigned int u = 0; u < 10; u++)
 
26011
            {
 
26012
              for (unsigned int tu = 0; tu < 10; tu++)
 
26013
              {
 
26014
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
26015
              }// end loop over 'tu'
 
26016
            }// end loop over 'u'
 
26017
          }// end loop over 't'
 
26018
          }
 
26019
          
 
26020
          if (combinations[r][s] == 2)
 
26021
          {
 
26022
          for (unsigned int t = 0; t < 10; t++)
 
26023
          {
 
26024
            for (unsigned int u = 0; u < 10; u++)
 
26025
            {
 
26026
              for (unsigned int tu = 0; tu < 10; tu++)
 
26027
              {
 
26028
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
26029
              }// end loop over 'tu'
 
26030
            }// end loop over 'u'
 
26031
          }// end loop over 't'
 
26032
          }
 
26033
          
 
26034
        }// end loop over 's'
 
26035
        for (unsigned int s = 0; s < 10; s++)
 
26036
        {
 
26037
          for (unsigned int t = 0; t < 10; t++)
 
26038
          {
 
26039
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
26040
          }// end loop over 't'
 
26041
        }// end loop over 's'
 
26042
      }// end loop over 'r'
 
26043
      
 
26044
      // Transform derivatives back to physical element
 
26045
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26046
      {
 
26047
        for (unsigned int s = 0; s < num_derivatives; s++)
 
26048
        {
 
26049
          values[num_derivatives + r] += transform[r][s]*derivatives[s];
 
26050
        }// end loop over 's'
 
26051
      }// end loop over 'r'
 
26052
      
 
26053
      // Delete pointer to array of derivatives on FIAT element
 
26054
      delete [] derivatives;
 
26055
      
 
26056
      // Delete pointer to array of combinations of derivatives and transform
 
26057
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26058
      {
 
26059
        delete [] combinations[r];
 
26060
      }// end loop over 'r'
 
26061
      delete [] combinations;
 
26062
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26063
      {
 
26064
        delete [] transform[r];
 
26065
      }// end loop over 'r'
 
26066
      delete [] transform;
 
26067
        break;
 
26068
      }
 
26069
    case 20:
 
26070
      {
 
26071
        
 
26072
      // Array of basisvalues.
 
26073
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
26074
      
 
26075
      // Declare helper variables.
 
26076
      unsigned int rr = 0;
 
26077
      unsigned int ss = 0;
 
26078
      unsigned int tt = 0;
 
26079
      double tmp5 = 0.000000000000000;
 
26080
      double tmp6 = 0.000000000000000;
 
26081
      double tmp7 = 0.000000000000000;
 
26082
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
26083
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
26084
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
26085
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
26086
      double tmp4 = tmp3*tmp3;
 
26087
      
 
26088
      // Compute basisvalues.
 
26089
      basisvalues[0] = 1.000000000000000;
 
26090
      basisvalues[1] = tmp0;
 
26091
      for (unsigned int r = 1; r < 2; r++)
 
26092
      {
 
26093
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
26094
        ss = r*(r + 1)*(r + 2)/6;
 
26095
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
26096
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
26097
      }// end loop over 'r'
 
26098
      for (unsigned int r = 0; r < 2; r++)
 
26099
      {
 
26100
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
26101
        ss = r*(r + 1)*(r + 2)/6;
 
26102
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
26103
      }// end loop over 'r'
 
26104
      for (unsigned int r = 0; r < 1; r++)
 
26105
      {
 
26106
        for (unsigned int s = 1; s < 2 - r; s++)
 
26107
        {
 
26108
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
26109
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26110
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
26111
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26112
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26113
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26114
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
26115
        }// end loop over 's'
 
26116
      }// end loop over 'r'
 
26117
      for (unsigned int r = 0; r < 2; r++)
 
26118
      {
 
26119
        for (unsigned int s = 0; s < 2 - r; s++)
 
26120
        {
 
26121
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
26122
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26123
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
26124
        }// end loop over 's'
 
26125
      }// end loop over 'r'
 
26126
      for (unsigned int r = 0; r < 1; r++)
 
26127
      {
 
26128
        for (unsigned int s = 0; s < 1 - r; s++)
 
26129
        {
 
26130
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
26131
          {
 
26132
            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;
 
26133
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26134
            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;
 
26135
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26136
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26137
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26138
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
26139
          }// end loop over 't'
 
26140
        }// end loop over 's'
 
26141
      }// end loop over 'r'
 
26142
      for (unsigned int r = 0; r < 3; r++)
 
26143
      {
 
26144
        for (unsigned int s = 0; s < 3 - r; s++)
 
26145
        {
 
26146
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
26147
          {
 
26148
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26149
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
26150
          }// end loop over 't'
 
26151
        }// end loop over 's'
 
26152
      }// end loop over 'r'
 
26153
      
 
26154
      // Table(s) of coefficients.
 
26155
      static const double coefficients0[10] = \
 
26156
      {-0.057735026918963, -0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, 0.050395263067897, 0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
26157
      
 
26158
      // Tables of derivatives of the polynomial base (transpose).
 
26159
      static const double dmats0[10][10] = \
 
26160
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26161
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26162
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26163
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26164
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26165
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26166
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26167
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26168
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26169
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26170
      
 
26171
      static const double dmats1[10][10] = \
 
26172
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26173
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26174
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26175
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26176
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26177
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26178
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26179
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26180
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26181
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26182
      
 
26183
      static const double dmats2[10][10] = \
 
26184
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26185
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26186
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26187
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26188
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26189
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26190
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26191
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26192
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26193
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26194
      
 
26195
      // Compute reference derivatives.
 
26196
      // Declare pointer to array of derivatives on FIAT element.
 
26197
      double *derivatives = new double[num_derivatives];
 
26198
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26199
      {
 
26200
        derivatives[r] = 0.000000000000000;
 
26201
      }// end loop over 'r'
 
26202
      
 
26203
      // Declare derivative matrix (of polynomial basis).
 
26204
      double dmats[10][10] = \
 
26205
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26206
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26207
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26208
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26209
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26210
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26211
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26212
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
26213
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
26214
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
26215
      
 
26216
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
26217
      double dmats_old[10][10] = \
 
26218
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26219
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26220
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26221
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26222
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26223
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26224
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26225
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
26226
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
26227
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
26228
      
 
26229
      // Loop possible derivatives.
 
26230
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26231
      {
 
26232
        // Resetting dmats values to compute next derivative.
 
26233
        for (unsigned int t = 0; t < 10; t++)
 
26234
        {
 
26235
          for (unsigned int u = 0; u < 10; u++)
 
26236
          {
 
26237
            dmats[t][u] = 0.000000000000000;
 
26238
            if (t == u)
 
26239
            {
 
26240
            dmats[t][u] = 1.000000000000000;
 
26241
            }
 
26242
            
 
26243
          }// end loop over 'u'
 
26244
        }// end loop over 't'
 
26245
        
 
26246
        // Looping derivative order to generate dmats.
 
26247
        for (unsigned int s = 0; s < n; s++)
 
26248
        {
 
26249
          // Updating dmats_old with new values and resetting dmats.
 
26250
          for (unsigned int t = 0; t < 10; t++)
 
26251
          {
 
26252
            for (unsigned int u = 0; u < 10; u++)
 
26253
            {
 
26254
              dmats_old[t][u] = dmats[t][u];
 
26255
              dmats[t][u] = 0.000000000000000;
 
26256
            }// end loop over 'u'
 
26257
          }// end loop over 't'
 
26258
          
 
26259
          // Update dmats using an inner product.
 
26260
          if (combinations[r][s] == 0)
 
26261
          {
 
26262
          for (unsigned int t = 0; t < 10; t++)
 
26263
          {
 
26264
            for (unsigned int u = 0; u < 10; u++)
 
26265
            {
 
26266
              for (unsigned int tu = 0; tu < 10; tu++)
 
26267
              {
 
26268
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
26269
              }// end loop over 'tu'
 
26270
            }// end loop over 'u'
 
26271
          }// end loop over 't'
 
26272
          }
 
26273
          
 
26274
          if (combinations[r][s] == 1)
 
26275
          {
 
26276
          for (unsigned int t = 0; t < 10; t++)
 
26277
          {
 
26278
            for (unsigned int u = 0; u < 10; u++)
 
26279
            {
 
26280
              for (unsigned int tu = 0; tu < 10; tu++)
 
26281
              {
 
26282
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
26283
              }// end loop over 'tu'
 
26284
            }// end loop over 'u'
 
26285
          }// end loop over 't'
 
26286
          }
 
26287
          
 
26288
          if (combinations[r][s] == 2)
 
26289
          {
 
26290
          for (unsigned int t = 0; t < 10; t++)
 
26291
          {
 
26292
            for (unsigned int u = 0; u < 10; u++)
 
26293
            {
 
26294
              for (unsigned int tu = 0; tu < 10; tu++)
 
26295
              {
 
26296
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
26297
              }// end loop over 'tu'
 
26298
            }// end loop over 'u'
 
26299
          }// end loop over 't'
 
26300
          }
 
26301
          
 
26302
        }// end loop over 's'
 
26303
        for (unsigned int s = 0; s < 10; s++)
 
26304
        {
 
26305
          for (unsigned int t = 0; t < 10; t++)
 
26306
          {
 
26307
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
26308
          }// end loop over 't'
 
26309
        }// end loop over 's'
 
26310
      }// end loop over 'r'
 
26311
      
 
26312
      // Transform derivatives back to physical element
 
26313
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26314
      {
 
26315
        for (unsigned int s = 0; s < num_derivatives; s++)
 
26316
        {
 
26317
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
26318
        }// end loop over 's'
 
26319
      }// end loop over 'r'
 
26320
      
 
26321
      // Delete pointer to array of derivatives on FIAT element
 
26322
      delete [] derivatives;
 
26323
      
 
26324
      // Delete pointer to array of combinations of derivatives and transform
 
26325
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26326
      {
 
26327
        delete [] combinations[r];
 
26328
      }// end loop over 'r'
 
26329
      delete [] combinations;
 
26330
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26331
      {
 
26332
        delete [] transform[r];
 
26333
      }// end loop over 'r'
 
26334
      delete [] transform;
 
26335
        break;
 
26336
      }
 
26337
    case 21:
 
26338
      {
 
26339
        
 
26340
      // Array of basisvalues.
 
26341
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
26342
      
 
26343
      // Declare helper variables.
 
26344
      unsigned int rr = 0;
 
26345
      unsigned int ss = 0;
 
26346
      unsigned int tt = 0;
 
26347
      double tmp5 = 0.000000000000000;
 
26348
      double tmp6 = 0.000000000000000;
 
26349
      double tmp7 = 0.000000000000000;
 
26350
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
26351
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
26352
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
26353
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
26354
      double tmp4 = tmp3*tmp3;
 
26355
      
 
26356
      // Compute basisvalues.
 
26357
      basisvalues[0] = 1.000000000000000;
 
26358
      basisvalues[1] = tmp0;
 
26359
      for (unsigned int r = 1; r < 2; r++)
 
26360
      {
 
26361
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
26362
        ss = r*(r + 1)*(r + 2)/6;
 
26363
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
26364
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
26365
      }// end loop over 'r'
 
26366
      for (unsigned int r = 0; r < 2; r++)
 
26367
      {
 
26368
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
26369
        ss = r*(r + 1)*(r + 2)/6;
 
26370
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
26371
      }// end loop over 'r'
 
26372
      for (unsigned int r = 0; r < 1; r++)
 
26373
      {
 
26374
        for (unsigned int s = 1; s < 2 - r; s++)
 
26375
        {
 
26376
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
26377
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26378
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
26379
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26380
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26381
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26382
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
26383
        }// end loop over 's'
 
26384
      }// end loop over 'r'
 
26385
      for (unsigned int r = 0; r < 2; r++)
 
26386
      {
 
26387
        for (unsigned int s = 0; s < 2 - r; s++)
 
26388
        {
 
26389
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
26390
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26391
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
26392
        }// end loop over 's'
 
26393
      }// end loop over 'r'
 
26394
      for (unsigned int r = 0; r < 1; r++)
 
26395
      {
 
26396
        for (unsigned int s = 0; s < 1 - r; s++)
 
26397
        {
 
26398
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
26399
          {
 
26400
            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;
 
26401
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26402
            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;
 
26403
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26404
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26405
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26406
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
26407
          }// end loop over 't'
 
26408
        }// end loop over 's'
 
26409
      }// end loop over 'r'
 
26410
      for (unsigned int r = 0; r < 3; r++)
 
26411
      {
 
26412
        for (unsigned int s = 0; s < 3 - r; s++)
 
26413
        {
 
26414
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
26415
          {
 
26416
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26417
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
26418
          }// end loop over 't'
 
26419
        }// end loop over 's'
 
26420
      }// end loop over 'r'
 
26421
      
 
26422
      // Table(s) of coefficients.
 
26423
      static const double coefficients0[10] = \
 
26424
      {-0.057735026918963, 0.060858061945018, -0.035136418446315, -0.024845199749998, 0.065060004863236, -0.050395263067897, -0.041147559989891, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
26425
      
 
26426
      // Tables of derivatives of the polynomial base (transpose).
 
26427
      static const double dmats0[10][10] = \
 
26428
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26429
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26430
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26431
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26432
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26433
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26434
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26435
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26436
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26437
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26438
      
 
26439
      static const double dmats1[10][10] = \
 
26440
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26441
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26442
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26443
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26444
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26445
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26446
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26447
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26448
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26449
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26450
      
 
26451
      static const double dmats2[10][10] = \
 
26452
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26453
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26454
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26455
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26456
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26457
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26458
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26459
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26460
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26461
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26462
      
 
26463
      // Compute reference derivatives.
 
26464
      // Declare pointer to array of derivatives on FIAT element.
 
26465
      double *derivatives = new double[num_derivatives];
 
26466
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26467
      {
 
26468
        derivatives[r] = 0.000000000000000;
 
26469
      }// end loop over 'r'
 
26470
      
 
26471
      // Declare derivative matrix (of polynomial basis).
 
26472
      double dmats[10][10] = \
 
26473
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26474
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26475
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26476
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26477
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26478
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26479
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26480
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
26481
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
26482
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
26483
      
 
26484
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
26485
      double dmats_old[10][10] = \
 
26486
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26487
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26488
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26489
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26490
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26491
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26492
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26493
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
26494
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
26495
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
26496
      
 
26497
      // Loop possible derivatives.
 
26498
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26499
      {
 
26500
        // Resetting dmats values to compute next derivative.
 
26501
        for (unsigned int t = 0; t < 10; t++)
 
26502
        {
 
26503
          for (unsigned int u = 0; u < 10; u++)
 
26504
          {
 
26505
            dmats[t][u] = 0.000000000000000;
 
26506
            if (t == u)
 
26507
            {
 
26508
            dmats[t][u] = 1.000000000000000;
 
26509
            }
 
26510
            
 
26511
          }// end loop over 'u'
 
26512
        }// end loop over 't'
 
26513
        
 
26514
        // Looping derivative order to generate dmats.
 
26515
        for (unsigned int s = 0; s < n; s++)
 
26516
        {
 
26517
          // Updating dmats_old with new values and resetting dmats.
 
26518
          for (unsigned int t = 0; t < 10; t++)
 
26519
          {
 
26520
            for (unsigned int u = 0; u < 10; u++)
 
26521
            {
 
26522
              dmats_old[t][u] = dmats[t][u];
 
26523
              dmats[t][u] = 0.000000000000000;
 
26524
            }// end loop over 'u'
 
26525
          }// end loop over 't'
 
26526
          
 
26527
          // Update dmats using an inner product.
 
26528
          if (combinations[r][s] == 0)
 
26529
          {
 
26530
          for (unsigned int t = 0; t < 10; t++)
 
26531
          {
 
26532
            for (unsigned int u = 0; u < 10; u++)
 
26533
            {
 
26534
              for (unsigned int tu = 0; tu < 10; tu++)
 
26535
              {
 
26536
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
26537
              }// end loop over 'tu'
 
26538
            }// end loop over 'u'
 
26539
          }// end loop over 't'
 
26540
          }
 
26541
          
 
26542
          if (combinations[r][s] == 1)
 
26543
          {
 
26544
          for (unsigned int t = 0; t < 10; t++)
 
26545
          {
 
26546
            for (unsigned int u = 0; u < 10; u++)
 
26547
            {
 
26548
              for (unsigned int tu = 0; tu < 10; tu++)
 
26549
              {
 
26550
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
26551
              }// end loop over 'tu'
 
26552
            }// end loop over 'u'
 
26553
          }// end loop over 't'
 
26554
          }
 
26555
          
 
26556
          if (combinations[r][s] == 2)
 
26557
          {
 
26558
          for (unsigned int t = 0; t < 10; t++)
 
26559
          {
 
26560
            for (unsigned int u = 0; u < 10; u++)
 
26561
            {
 
26562
              for (unsigned int tu = 0; tu < 10; tu++)
 
26563
              {
 
26564
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
26565
              }// end loop over 'tu'
 
26566
            }// end loop over 'u'
 
26567
          }// end loop over 't'
 
26568
          }
 
26569
          
 
26570
        }// end loop over 's'
 
26571
        for (unsigned int s = 0; s < 10; s++)
 
26572
        {
 
26573
          for (unsigned int t = 0; t < 10; t++)
 
26574
          {
 
26575
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
26576
          }// end loop over 't'
 
26577
        }// end loop over 's'
 
26578
      }// end loop over 'r'
 
26579
      
 
26580
      // Transform derivatives back to physical element
 
26581
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26582
      {
 
26583
        for (unsigned int s = 0; s < num_derivatives; s++)
 
26584
        {
 
26585
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
26586
        }// end loop over 's'
 
26587
      }// end loop over 'r'
 
26588
      
 
26589
      // Delete pointer to array of derivatives on FIAT element
 
26590
      delete [] derivatives;
 
26591
      
 
26592
      // Delete pointer to array of combinations of derivatives and transform
 
26593
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26594
      {
 
26595
        delete [] combinations[r];
 
26596
      }// end loop over 'r'
 
26597
      delete [] combinations;
 
26598
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26599
      {
 
26600
        delete [] transform[r];
 
26601
      }// end loop over 'r'
 
26602
      delete [] transform;
 
26603
        break;
 
26604
      }
 
26605
    case 22:
 
26606
      {
 
26607
        
 
26608
      // Array of basisvalues.
 
26609
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
26610
      
 
26611
      // Declare helper variables.
 
26612
      unsigned int rr = 0;
 
26613
      unsigned int ss = 0;
 
26614
      unsigned int tt = 0;
 
26615
      double tmp5 = 0.000000000000000;
 
26616
      double tmp6 = 0.000000000000000;
 
26617
      double tmp7 = 0.000000000000000;
 
26618
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
26619
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
26620
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
26621
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
26622
      double tmp4 = tmp3*tmp3;
 
26623
      
 
26624
      // Compute basisvalues.
 
26625
      basisvalues[0] = 1.000000000000000;
 
26626
      basisvalues[1] = tmp0;
 
26627
      for (unsigned int r = 1; r < 2; r++)
 
26628
      {
 
26629
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
26630
        ss = r*(r + 1)*(r + 2)/6;
 
26631
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
26632
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
26633
      }// end loop over 'r'
 
26634
      for (unsigned int r = 0; r < 2; r++)
 
26635
      {
 
26636
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
26637
        ss = r*(r + 1)*(r + 2)/6;
 
26638
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
26639
      }// end loop over 'r'
 
26640
      for (unsigned int r = 0; r < 1; r++)
 
26641
      {
 
26642
        for (unsigned int s = 1; s < 2 - r; s++)
 
26643
        {
 
26644
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
26645
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26646
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
26647
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26648
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26649
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26650
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
26651
        }// end loop over 's'
 
26652
      }// end loop over 'r'
 
26653
      for (unsigned int r = 0; r < 2; r++)
 
26654
      {
 
26655
        for (unsigned int s = 0; s < 2 - r; s++)
 
26656
        {
 
26657
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
26658
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26659
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
26660
        }// end loop over 's'
 
26661
      }// end loop over 'r'
 
26662
      for (unsigned int r = 0; r < 1; r++)
 
26663
      {
 
26664
        for (unsigned int s = 0; s < 1 - r; s++)
 
26665
        {
 
26666
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
26667
          {
 
26668
            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;
 
26669
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26670
            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;
 
26671
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26672
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26673
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26674
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
26675
          }// end loop over 't'
 
26676
        }// end loop over 's'
 
26677
      }// end loop over 'r'
 
26678
      for (unsigned int r = 0; r < 3; r++)
 
26679
      {
 
26680
        for (unsigned int s = 0; s < 3 - r; s++)
 
26681
        {
 
26682
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
26683
          {
 
26684
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26685
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
26686
          }// end loop over 't'
 
26687
        }// end loop over 's'
 
26688
      }// end loop over 'r'
 
26689
      
 
26690
      // Table(s) of coefficients.
 
26691
      static const double coefficients0[10] = \
 
26692
      {-0.057735026918963, 0.000000000000000, 0.070272836892631, -0.024845199749998, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.087287156094397, -0.047513109673320, 0.016798421022632};
 
26693
      
 
26694
      // Tables of derivatives of the polynomial base (transpose).
 
26695
      static const double dmats0[10][10] = \
 
26696
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26697
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26698
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26699
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26700
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26701
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26702
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26703
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26704
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26705
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26706
      
 
26707
      static const double dmats1[10][10] = \
 
26708
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26709
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26710
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26711
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26712
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26713
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26714
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26715
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26716
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26717
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26718
      
 
26719
      static const double dmats2[10][10] = \
 
26720
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26721
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26722
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26723
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26724
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26725
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26726
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26727
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26728
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26729
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26730
      
 
26731
      // Compute reference derivatives.
 
26732
      // Declare pointer to array of derivatives on FIAT element.
 
26733
      double *derivatives = new double[num_derivatives];
 
26734
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26735
      {
 
26736
        derivatives[r] = 0.000000000000000;
 
26737
      }// end loop over 'r'
 
26738
      
 
26739
      // Declare derivative matrix (of polynomial basis).
 
26740
      double dmats[10][10] = \
 
26741
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26742
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26743
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26744
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26745
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26746
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26747
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26748
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
26749
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
26750
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
26751
      
 
26752
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
26753
      double dmats_old[10][10] = \
 
26754
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26755
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26756
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26757
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26758
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26759
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26760
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26761
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
26762
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
26763
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
26764
      
 
26765
      // Loop possible derivatives.
 
26766
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26767
      {
 
26768
        // Resetting dmats values to compute next derivative.
 
26769
        for (unsigned int t = 0; t < 10; t++)
 
26770
        {
 
26771
          for (unsigned int u = 0; u < 10; u++)
 
26772
          {
 
26773
            dmats[t][u] = 0.000000000000000;
 
26774
            if (t == u)
 
26775
            {
 
26776
            dmats[t][u] = 1.000000000000000;
 
26777
            }
 
26778
            
 
26779
          }// end loop over 'u'
 
26780
        }// end loop over 't'
 
26781
        
 
26782
        // Looping derivative order to generate dmats.
 
26783
        for (unsigned int s = 0; s < n; s++)
 
26784
        {
 
26785
          // Updating dmats_old with new values and resetting dmats.
 
26786
          for (unsigned int t = 0; t < 10; t++)
 
26787
          {
 
26788
            for (unsigned int u = 0; u < 10; u++)
 
26789
            {
 
26790
              dmats_old[t][u] = dmats[t][u];
 
26791
              dmats[t][u] = 0.000000000000000;
 
26792
            }// end loop over 'u'
 
26793
          }// end loop over 't'
 
26794
          
 
26795
          // Update dmats using an inner product.
 
26796
          if (combinations[r][s] == 0)
 
26797
          {
 
26798
          for (unsigned int t = 0; t < 10; t++)
 
26799
          {
 
26800
            for (unsigned int u = 0; u < 10; u++)
 
26801
            {
 
26802
              for (unsigned int tu = 0; tu < 10; tu++)
 
26803
              {
 
26804
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
26805
              }// end loop over 'tu'
 
26806
            }// end loop over 'u'
 
26807
          }// end loop over 't'
 
26808
          }
 
26809
          
 
26810
          if (combinations[r][s] == 1)
 
26811
          {
 
26812
          for (unsigned int t = 0; t < 10; t++)
 
26813
          {
 
26814
            for (unsigned int u = 0; u < 10; u++)
 
26815
            {
 
26816
              for (unsigned int tu = 0; tu < 10; tu++)
 
26817
              {
 
26818
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
26819
              }// end loop over 'tu'
 
26820
            }// end loop over 'u'
 
26821
          }// end loop over 't'
 
26822
          }
 
26823
          
 
26824
          if (combinations[r][s] == 2)
 
26825
          {
 
26826
          for (unsigned int t = 0; t < 10; t++)
 
26827
          {
 
26828
            for (unsigned int u = 0; u < 10; u++)
 
26829
            {
 
26830
              for (unsigned int tu = 0; tu < 10; tu++)
 
26831
              {
 
26832
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
26833
              }// end loop over 'tu'
 
26834
            }// end loop over 'u'
 
26835
          }// end loop over 't'
 
26836
          }
 
26837
          
 
26838
        }// end loop over 's'
 
26839
        for (unsigned int s = 0; s < 10; s++)
 
26840
        {
 
26841
          for (unsigned int t = 0; t < 10; t++)
 
26842
          {
 
26843
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
26844
          }// end loop over 't'
 
26845
        }// end loop over 's'
 
26846
      }// end loop over 'r'
 
26847
      
 
26848
      // Transform derivatives back to physical element
 
26849
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26850
      {
 
26851
        for (unsigned int s = 0; s < num_derivatives; s++)
 
26852
        {
 
26853
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
26854
        }// end loop over 's'
 
26855
      }// end loop over 'r'
 
26856
      
 
26857
      // Delete pointer to array of derivatives on FIAT element
 
26858
      delete [] derivatives;
 
26859
      
 
26860
      // Delete pointer to array of combinations of derivatives and transform
 
26861
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26862
      {
 
26863
        delete [] combinations[r];
 
26864
      }// end loop over 'r'
 
26865
      delete [] combinations;
 
26866
      for (unsigned int r = 0; r < num_derivatives; r++)
 
26867
      {
 
26868
        delete [] transform[r];
 
26869
      }// end loop over 'r'
 
26870
      delete [] transform;
 
26871
        break;
 
26872
      }
 
26873
    case 23:
 
26874
      {
 
26875
        
 
26876
      // Array of basisvalues.
 
26877
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
26878
      
 
26879
      // Declare helper variables.
 
26880
      unsigned int rr = 0;
 
26881
      unsigned int ss = 0;
 
26882
      unsigned int tt = 0;
 
26883
      double tmp5 = 0.000000000000000;
 
26884
      double tmp6 = 0.000000000000000;
 
26885
      double tmp7 = 0.000000000000000;
 
26886
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
26887
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
26888
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
26889
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
26890
      double tmp4 = tmp3*tmp3;
 
26891
      
 
26892
      // Compute basisvalues.
 
26893
      basisvalues[0] = 1.000000000000000;
 
26894
      basisvalues[1] = tmp0;
 
26895
      for (unsigned int r = 1; r < 2; r++)
 
26896
      {
 
26897
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
26898
        ss = r*(r + 1)*(r + 2)/6;
 
26899
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
26900
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
26901
      }// end loop over 'r'
 
26902
      for (unsigned int r = 0; r < 2; r++)
 
26903
      {
 
26904
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
26905
        ss = r*(r + 1)*(r + 2)/6;
 
26906
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
26907
      }// end loop over 'r'
 
26908
      for (unsigned int r = 0; r < 1; r++)
 
26909
      {
 
26910
        for (unsigned int s = 1; s < 2 - r; s++)
 
26911
        {
 
26912
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
26913
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26914
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
26915
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26916
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26917
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
26918
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
26919
        }// end loop over 's'
 
26920
      }// end loop over 'r'
 
26921
      for (unsigned int r = 0; r < 2; r++)
 
26922
      {
 
26923
        for (unsigned int s = 0; s < 2 - r; s++)
 
26924
        {
 
26925
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
26926
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
26927
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
26928
        }// end loop over 's'
 
26929
      }// end loop over 'r'
 
26930
      for (unsigned int r = 0; r < 1; r++)
 
26931
      {
 
26932
        for (unsigned int s = 0; s < 1 - r; s++)
 
26933
        {
 
26934
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
26935
          {
 
26936
            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;
 
26937
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26938
            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;
 
26939
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26940
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26941
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
26942
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
26943
          }// end loop over 't'
 
26944
        }// end loop over 's'
 
26945
      }// end loop over 'r'
 
26946
      for (unsigned int r = 0; r < 3; r++)
 
26947
      {
 
26948
        for (unsigned int s = 0; s < 3 - r; s++)
 
26949
        {
 
26950
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
26951
          {
 
26952
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
26953
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
26954
          }// end loop over 't'
 
26955
        }// end loop over 's'
 
26956
      }// end loop over 'r'
 
26957
      
 
26958
      // Table(s) of coefficients.
 
26959
      static const double coefficients0[10] = \
 
26960
      {-0.057735026918963, 0.000000000000000, 0.000000000000000, 0.074535599249993, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.100790526135794};
 
26961
      
 
26962
      // Tables of derivatives of the polynomial base (transpose).
 
26963
      static const double dmats0[10][10] = \
 
26964
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26965
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26966
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26967
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26968
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26969
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26970
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26971
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26972
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26973
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26974
      
 
26975
      static const double dmats1[10][10] = \
 
26976
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26977
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26978
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26979
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26980
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26981
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26982
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26983
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26984
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26985
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26986
      
 
26987
      static const double dmats2[10][10] = \
 
26988
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26989
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26990
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26991
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26992
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26993
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26994
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26995
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26996
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
26997
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
26998
      
 
26999
      // Compute reference derivatives.
 
27000
      // Declare pointer to array of derivatives on FIAT element.
 
27001
      double *derivatives = new double[num_derivatives];
 
27002
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27003
      {
 
27004
        derivatives[r] = 0.000000000000000;
 
27005
      }// end loop over 'r'
 
27006
      
 
27007
      // Declare derivative matrix (of polynomial basis).
 
27008
      double dmats[10][10] = \
 
27009
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27010
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27011
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27012
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27013
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27014
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27015
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27016
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27017
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27018
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27019
      
 
27020
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
27021
      double dmats_old[10][10] = \
 
27022
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27023
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27024
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27025
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27026
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27027
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27028
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27029
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27030
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27031
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27032
      
 
27033
      // Loop possible derivatives.
 
27034
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27035
      {
 
27036
        // Resetting dmats values to compute next derivative.
 
27037
        for (unsigned int t = 0; t < 10; t++)
 
27038
        {
 
27039
          for (unsigned int u = 0; u < 10; u++)
 
27040
          {
 
27041
            dmats[t][u] = 0.000000000000000;
 
27042
            if (t == u)
 
27043
            {
 
27044
            dmats[t][u] = 1.000000000000000;
 
27045
            }
 
27046
            
 
27047
          }// end loop over 'u'
 
27048
        }// end loop over 't'
 
27049
        
 
27050
        // Looping derivative order to generate dmats.
 
27051
        for (unsigned int s = 0; s < n; s++)
 
27052
        {
 
27053
          // Updating dmats_old with new values and resetting dmats.
 
27054
          for (unsigned int t = 0; t < 10; t++)
 
27055
          {
 
27056
            for (unsigned int u = 0; u < 10; u++)
 
27057
            {
 
27058
              dmats_old[t][u] = dmats[t][u];
 
27059
              dmats[t][u] = 0.000000000000000;
 
27060
            }// end loop over 'u'
 
27061
          }// end loop over 't'
 
27062
          
 
27063
          // Update dmats using an inner product.
 
27064
          if (combinations[r][s] == 0)
 
27065
          {
 
27066
          for (unsigned int t = 0; t < 10; t++)
 
27067
          {
 
27068
            for (unsigned int u = 0; u < 10; u++)
 
27069
            {
 
27070
              for (unsigned int tu = 0; tu < 10; tu++)
 
27071
              {
 
27072
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
27073
              }// end loop over 'tu'
 
27074
            }// end loop over 'u'
 
27075
          }// end loop over 't'
 
27076
          }
 
27077
          
 
27078
          if (combinations[r][s] == 1)
 
27079
          {
 
27080
          for (unsigned int t = 0; t < 10; t++)
 
27081
          {
 
27082
            for (unsigned int u = 0; u < 10; u++)
 
27083
            {
 
27084
              for (unsigned int tu = 0; tu < 10; tu++)
 
27085
              {
 
27086
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
27087
              }// end loop over 'tu'
 
27088
            }// end loop over 'u'
 
27089
          }// end loop over 't'
 
27090
          }
 
27091
          
 
27092
          if (combinations[r][s] == 2)
 
27093
          {
 
27094
          for (unsigned int t = 0; t < 10; t++)
 
27095
          {
 
27096
            for (unsigned int u = 0; u < 10; u++)
 
27097
            {
 
27098
              for (unsigned int tu = 0; tu < 10; tu++)
 
27099
              {
 
27100
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
27101
              }// end loop over 'tu'
 
27102
            }// end loop over 'u'
 
27103
          }// end loop over 't'
 
27104
          }
 
27105
          
 
27106
        }// end loop over 's'
 
27107
        for (unsigned int s = 0; s < 10; s++)
 
27108
        {
 
27109
          for (unsigned int t = 0; t < 10; t++)
 
27110
          {
 
27111
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
27112
          }// end loop over 't'
 
27113
        }// end loop over 's'
 
27114
      }// end loop over 'r'
 
27115
      
 
27116
      // Transform derivatives back to physical element
 
27117
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27118
      {
 
27119
        for (unsigned int s = 0; s < num_derivatives; s++)
 
27120
        {
 
27121
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
27122
        }// end loop over 's'
 
27123
      }// end loop over 'r'
 
27124
      
 
27125
      // Delete pointer to array of derivatives on FIAT element
 
27126
      delete [] derivatives;
 
27127
      
 
27128
      // Delete pointer to array of combinations of derivatives and transform
 
27129
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27130
      {
 
27131
        delete [] combinations[r];
 
27132
      }// end loop over 'r'
 
27133
      delete [] combinations;
 
27134
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27135
      {
 
27136
        delete [] transform[r];
 
27137
      }// end loop over 'r'
 
27138
      delete [] transform;
 
27139
        break;
 
27140
      }
 
27141
    case 24:
 
27142
      {
 
27143
        
 
27144
      // Array of basisvalues.
 
27145
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
27146
      
 
27147
      // Declare helper variables.
 
27148
      unsigned int rr = 0;
 
27149
      unsigned int ss = 0;
 
27150
      unsigned int tt = 0;
 
27151
      double tmp5 = 0.000000000000000;
 
27152
      double tmp6 = 0.000000000000000;
 
27153
      double tmp7 = 0.000000000000000;
 
27154
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
27155
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
27156
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
27157
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
27158
      double tmp4 = tmp3*tmp3;
 
27159
      
 
27160
      // Compute basisvalues.
 
27161
      basisvalues[0] = 1.000000000000000;
 
27162
      basisvalues[1] = tmp0;
 
27163
      for (unsigned int r = 1; r < 2; r++)
 
27164
      {
 
27165
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
27166
        ss = r*(r + 1)*(r + 2)/6;
 
27167
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
27168
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
27169
      }// end loop over 'r'
 
27170
      for (unsigned int r = 0; r < 2; r++)
 
27171
      {
 
27172
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
27173
        ss = r*(r + 1)*(r + 2)/6;
 
27174
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
27175
      }// end loop over 'r'
 
27176
      for (unsigned int r = 0; r < 1; r++)
 
27177
      {
 
27178
        for (unsigned int s = 1; s < 2 - r; s++)
 
27179
        {
 
27180
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
27181
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27182
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
27183
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27184
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27185
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27186
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
27187
        }// end loop over 's'
 
27188
      }// end loop over 'r'
 
27189
      for (unsigned int r = 0; r < 2; r++)
 
27190
      {
 
27191
        for (unsigned int s = 0; s < 2 - r; s++)
 
27192
        {
 
27193
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
27194
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27195
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
27196
        }// end loop over 's'
 
27197
      }// end loop over 'r'
 
27198
      for (unsigned int r = 0; r < 1; r++)
 
27199
      {
 
27200
        for (unsigned int s = 0; s < 1 - r; s++)
 
27201
        {
 
27202
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
27203
          {
 
27204
            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;
 
27205
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
27206
            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;
 
27207
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27208
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27209
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27210
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
27211
          }// end loop over 't'
 
27212
        }// end loop over 's'
 
27213
      }// end loop over 'r'
 
27214
      for (unsigned int r = 0; r < 3; r++)
 
27215
      {
 
27216
        for (unsigned int s = 0; s < 3 - r; s++)
 
27217
        {
 
27218
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
27219
          {
 
27220
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
27221
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
27222
          }// end loop over 't'
 
27223
        }// end loop over 's'
 
27224
      }// end loop over 'r'
 
27225
      
 
27226
      // Table(s) of coefficients.
 
27227
      static const double coefficients0[10] = \
 
27228
      {0.230940107675850, 0.000000000000000, 0.140545673785261, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.118782774183300, -0.067193684090529};
 
27229
      
 
27230
      // Tables of derivatives of the polynomial base (transpose).
 
27231
      static const double dmats0[10][10] = \
 
27232
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27233
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27234
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27235
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27236
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27237
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27238
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27239
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27240
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27241
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27242
      
 
27243
      static const double dmats1[10][10] = \
 
27244
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27245
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27246
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27247
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27248
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27249
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27250
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27251
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27252
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27253
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27254
      
 
27255
      static const double dmats2[10][10] = \
 
27256
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27257
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27258
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27259
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27260
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27261
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27262
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27263
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27264
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27265
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27266
      
 
27267
      // Compute reference derivatives.
 
27268
      // Declare pointer to array of derivatives on FIAT element.
 
27269
      double *derivatives = new double[num_derivatives];
 
27270
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27271
      {
 
27272
        derivatives[r] = 0.000000000000000;
 
27273
      }// end loop over 'r'
 
27274
      
 
27275
      // Declare derivative matrix (of polynomial basis).
 
27276
      double dmats[10][10] = \
 
27277
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27278
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27279
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27280
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27281
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27282
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27283
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27284
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27285
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27286
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27287
      
 
27288
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
27289
      double dmats_old[10][10] = \
 
27290
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27291
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27292
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27293
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27294
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27295
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27296
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27297
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27298
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27299
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27300
      
 
27301
      // Loop possible derivatives.
 
27302
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27303
      {
 
27304
        // Resetting dmats values to compute next derivative.
 
27305
        for (unsigned int t = 0; t < 10; t++)
 
27306
        {
 
27307
          for (unsigned int u = 0; u < 10; u++)
 
27308
          {
 
27309
            dmats[t][u] = 0.000000000000000;
 
27310
            if (t == u)
 
27311
            {
 
27312
            dmats[t][u] = 1.000000000000000;
 
27313
            }
 
27314
            
 
27315
          }// end loop over 'u'
 
27316
        }// end loop over 't'
 
27317
        
 
27318
        // Looping derivative order to generate dmats.
 
27319
        for (unsigned int s = 0; s < n; s++)
 
27320
        {
 
27321
          // Updating dmats_old with new values and resetting dmats.
 
27322
          for (unsigned int t = 0; t < 10; t++)
 
27323
          {
 
27324
            for (unsigned int u = 0; u < 10; u++)
 
27325
            {
 
27326
              dmats_old[t][u] = dmats[t][u];
 
27327
              dmats[t][u] = 0.000000000000000;
 
27328
            }// end loop over 'u'
 
27329
          }// end loop over 't'
 
27330
          
 
27331
          // Update dmats using an inner product.
 
27332
          if (combinations[r][s] == 0)
 
27333
          {
 
27334
          for (unsigned int t = 0; t < 10; t++)
 
27335
          {
 
27336
            for (unsigned int u = 0; u < 10; u++)
 
27337
            {
 
27338
              for (unsigned int tu = 0; tu < 10; tu++)
 
27339
              {
 
27340
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
27341
              }// end loop over 'tu'
 
27342
            }// end loop over 'u'
 
27343
          }// end loop over 't'
 
27344
          }
 
27345
          
 
27346
          if (combinations[r][s] == 1)
 
27347
          {
 
27348
          for (unsigned int t = 0; t < 10; t++)
 
27349
          {
 
27350
            for (unsigned int u = 0; u < 10; u++)
 
27351
            {
 
27352
              for (unsigned int tu = 0; tu < 10; tu++)
 
27353
              {
 
27354
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
27355
              }// end loop over 'tu'
 
27356
            }// end loop over 'u'
 
27357
          }// end loop over 't'
 
27358
          }
 
27359
          
 
27360
          if (combinations[r][s] == 2)
 
27361
          {
 
27362
          for (unsigned int t = 0; t < 10; t++)
 
27363
          {
 
27364
            for (unsigned int u = 0; u < 10; u++)
 
27365
            {
 
27366
              for (unsigned int tu = 0; tu < 10; tu++)
 
27367
              {
 
27368
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
27369
              }// end loop over 'tu'
 
27370
            }// end loop over 'u'
 
27371
          }// end loop over 't'
 
27372
          }
 
27373
          
 
27374
        }// end loop over 's'
 
27375
        for (unsigned int s = 0; s < 10; s++)
 
27376
        {
 
27377
          for (unsigned int t = 0; t < 10; t++)
 
27378
          {
 
27379
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
27380
          }// end loop over 't'
 
27381
        }// end loop over 's'
 
27382
      }// end loop over 'r'
 
27383
      
 
27384
      // Transform derivatives back to physical element
 
27385
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27386
      {
 
27387
        for (unsigned int s = 0; s < num_derivatives; s++)
 
27388
        {
 
27389
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
27390
        }// end loop over 's'
 
27391
      }// end loop over 'r'
 
27392
      
 
27393
      // Delete pointer to array of derivatives on FIAT element
 
27394
      delete [] derivatives;
 
27395
      
 
27396
      // Delete pointer to array of combinations of derivatives and transform
 
27397
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27398
      {
 
27399
        delete [] combinations[r];
 
27400
      }// end loop over 'r'
 
27401
      delete [] combinations;
 
27402
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27403
      {
 
27404
        delete [] transform[r];
 
27405
      }// end loop over 'r'
 
27406
      delete [] transform;
 
27407
        break;
 
27408
      }
 
27409
    case 25:
 
27410
      {
 
27411
        
 
27412
      // Array of basisvalues.
 
27413
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
27414
      
 
27415
      // Declare helper variables.
 
27416
      unsigned int rr = 0;
 
27417
      unsigned int ss = 0;
 
27418
      unsigned int tt = 0;
 
27419
      double tmp5 = 0.000000000000000;
 
27420
      double tmp6 = 0.000000000000000;
 
27421
      double tmp7 = 0.000000000000000;
 
27422
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
27423
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
27424
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
27425
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
27426
      double tmp4 = tmp3*tmp3;
 
27427
      
 
27428
      // Compute basisvalues.
 
27429
      basisvalues[0] = 1.000000000000000;
 
27430
      basisvalues[1] = tmp0;
 
27431
      for (unsigned int r = 1; r < 2; r++)
 
27432
      {
 
27433
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
27434
        ss = r*(r + 1)*(r + 2)/6;
 
27435
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
27436
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
27437
      }// end loop over 'r'
 
27438
      for (unsigned int r = 0; r < 2; r++)
 
27439
      {
 
27440
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
27441
        ss = r*(r + 1)*(r + 2)/6;
 
27442
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
27443
      }// end loop over 'r'
 
27444
      for (unsigned int r = 0; r < 1; r++)
 
27445
      {
 
27446
        for (unsigned int s = 1; s < 2 - r; s++)
 
27447
        {
 
27448
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
27449
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27450
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
27451
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27452
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27453
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27454
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
27455
        }// end loop over 's'
 
27456
      }// end loop over 'r'
 
27457
      for (unsigned int r = 0; r < 2; r++)
 
27458
      {
 
27459
        for (unsigned int s = 0; s < 2 - r; s++)
 
27460
        {
 
27461
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
27462
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27463
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
27464
        }// end loop over 's'
 
27465
      }// end loop over 'r'
 
27466
      for (unsigned int r = 0; r < 1; r++)
 
27467
      {
 
27468
        for (unsigned int s = 0; s < 1 - r; s++)
 
27469
        {
 
27470
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
27471
          {
 
27472
            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;
 
27473
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
27474
            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;
 
27475
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27476
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27477
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27478
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
27479
          }// end loop over 't'
 
27480
        }// end loop over 's'
 
27481
      }// end loop over 'r'
 
27482
      for (unsigned int r = 0; r < 3; r++)
 
27483
      {
 
27484
        for (unsigned int s = 0; s < 3 - r; s++)
 
27485
        {
 
27486
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
27487
          {
 
27488
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
27489
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
27490
          }// end loop over 't'
 
27491
        }// end loop over 's'
 
27492
      }// end loop over 'r'
 
27493
      
 
27494
      // Table(s) of coefficients.
 
27495
      static const double coefficients0[10] = \
 
27496
      {0.230940107675850, 0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, 0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
27497
      
 
27498
      // Tables of derivatives of the polynomial base (transpose).
 
27499
      static const double dmats0[10][10] = \
 
27500
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27501
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27502
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27503
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27504
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27505
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27506
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27507
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27508
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27509
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27510
      
 
27511
      static const double dmats1[10][10] = \
 
27512
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27513
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27514
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27515
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27516
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27517
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27518
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27519
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27520
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27521
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27522
      
 
27523
      static const double dmats2[10][10] = \
 
27524
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27525
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27526
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27527
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27528
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27529
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27530
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27531
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27532
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27533
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27534
      
 
27535
      // Compute reference derivatives.
 
27536
      // Declare pointer to array of derivatives on FIAT element.
 
27537
      double *derivatives = new double[num_derivatives];
 
27538
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27539
      {
 
27540
        derivatives[r] = 0.000000000000000;
 
27541
      }// end loop over 'r'
 
27542
      
 
27543
      // Declare derivative matrix (of polynomial basis).
 
27544
      double dmats[10][10] = \
 
27545
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27546
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27547
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27548
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27549
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27550
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27551
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27552
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27553
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27554
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27555
      
 
27556
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
27557
      double dmats_old[10][10] = \
 
27558
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27559
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27560
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27561
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27562
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27563
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27564
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27565
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27566
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27567
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27568
      
 
27569
      // Loop possible derivatives.
 
27570
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27571
      {
 
27572
        // Resetting dmats values to compute next derivative.
 
27573
        for (unsigned int t = 0; t < 10; t++)
 
27574
        {
 
27575
          for (unsigned int u = 0; u < 10; u++)
 
27576
          {
 
27577
            dmats[t][u] = 0.000000000000000;
 
27578
            if (t == u)
 
27579
            {
 
27580
            dmats[t][u] = 1.000000000000000;
 
27581
            }
 
27582
            
 
27583
          }// end loop over 'u'
 
27584
        }// end loop over 't'
 
27585
        
 
27586
        // Looping derivative order to generate dmats.
 
27587
        for (unsigned int s = 0; s < n; s++)
 
27588
        {
 
27589
          // Updating dmats_old with new values and resetting dmats.
 
27590
          for (unsigned int t = 0; t < 10; t++)
 
27591
          {
 
27592
            for (unsigned int u = 0; u < 10; u++)
 
27593
            {
 
27594
              dmats_old[t][u] = dmats[t][u];
 
27595
              dmats[t][u] = 0.000000000000000;
 
27596
            }// end loop over 'u'
 
27597
          }// end loop over 't'
 
27598
          
 
27599
          // Update dmats using an inner product.
 
27600
          if (combinations[r][s] == 0)
 
27601
          {
 
27602
          for (unsigned int t = 0; t < 10; t++)
 
27603
          {
 
27604
            for (unsigned int u = 0; u < 10; u++)
 
27605
            {
 
27606
              for (unsigned int tu = 0; tu < 10; tu++)
 
27607
              {
 
27608
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
27609
              }// end loop over 'tu'
 
27610
            }// end loop over 'u'
 
27611
          }// end loop over 't'
 
27612
          }
 
27613
          
 
27614
          if (combinations[r][s] == 1)
 
27615
          {
 
27616
          for (unsigned int t = 0; t < 10; t++)
 
27617
          {
 
27618
            for (unsigned int u = 0; u < 10; u++)
 
27619
            {
 
27620
              for (unsigned int tu = 0; tu < 10; tu++)
 
27621
              {
 
27622
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
27623
              }// end loop over 'tu'
 
27624
            }// end loop over 'u'
 
27625
          }// end loop over 't'
 
27626
          }
 
27627
          
 
27628
          if (combinations[r][s] == 2)
 
27629
          {
 
27630
          for (unsigned int t = 0; t < 10; t++)
 
27631
          {
 
27632
            for (unsigned int u = 0; u < 10; u++)
 
27633
            {
 
27634
              for (unsigned int tu = 0; tu < 10; tu++)
 
27635
              {
 
27636
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
27637
              }// end loop over 'tu'
 
27638
            }// end loop over 'u'
 
27639
          }// end loop over 't'
 
27640
          }
 
27641
          
 
27642
        }// end loop over 's'
 
27643
        for (unsigned int s = 0; s < 10; s++)
 
27644
        {
 
27645
          for (unsigned int t = 0; t < 10; t++)
 
27646
          {
 
27647
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
27648
          }// end loop over 't'
 
27649
        }// end loop over 's'
 
27650
      }// end loop over 'r'
 
27651
      
 
27652
      // Transform derivatives back to physical element
 
27653
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27654
      {
 
27655
        for (unsigned int s = 0; s < num_derivatives; s++)
 
27656
        {
 
27657
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
27658
        }// end loop over 's'
 
27659
      }// end loop over 'r'
 
27660
      
 
27661
      // Delete pointer to array of derivatives on FIAT element
 
27662
      delete [] derivatives;
 
27663
      
 
27664
      // Delete pointer to array of combinations of derivatives and transform
 
27665
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27666
      {
 
27667
        delete [] combinations[r];
 
27668
      }// end loop over 'r'
 
27669
      delete [] combinations;
 
27670
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27671
      {
 
27672
        delete [] transform[r];
 
27673
      }// end loop over 'r'
 
27674
      delete [] transform;
 
27675
        break;
 
27676
      }
 
27677
    case 26:
 
27678
      {
 
27679
        
 
27680
      // Array of basisvalues.
 
27681
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
27682
      
 
27683
      // Declare helper variables.
 
27684
      unsigned int rr = 0;
 
27685
      unsigned int ss = 0;
 
27686
      unsigned int tt = 0;
 
27687
      double tmp5 = 0.000000000000000;
 
27688
      double tmp6 = 0.000000000000000;
 
27689
      double tmp7 = 0.000000000000000;
 
27690
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
27691
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
27692
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
27693
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
27694
      double tmp4 = tmp3*tmp3;
 
27695
      
 
27696
      // Compute basisvalues.
 
27697
      basisvalues[0] = 1.000000000000000;
 
27698
      basisvalues[1] = tmp0;
 
27699
      for (unsigned int r = 1; r < 2; r++)
 
27700
      {
 
27701
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
27702
        ss = r*(r + 1)*(r + 2)/6;
 
27703
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
27704
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
27705
      }// end loop over 'r'
 
27706
      for (unsigned int r = 0; r < 2; r++)
 
27707
      {
 
27708
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
27709
        ss = r*(r + 1)*(r + 2)/6;
 
27710
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
27711
      }// end loop over 'r'
 
27712
      for (unsigned int r = 0; r < 1; r++)
 
27713
      {
 
27714
        for (unsigned int s = 1; s < 2 - r; s++)
 
27715
        {
 
27716
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
27717
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27718
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
27719
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27720
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27721
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27722
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
27723
        }// end loop over 's'
 
27724
      }// end loop over 'r'
 
27725
      for (unsigned int r = 0; r < 2; r++)
 
27726
      {
 
27727
        for (unsigned int s = 0; s < 2 - r; s++)
 
27728
        {
 
27729
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
27730
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27731
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
27732
        }// end loop over 's'
 
27733
      }// end loop over 'r'
 
27734
      for (unsigned int r = 0; r < 1; r++)
 
27735
      {
 
27736
        for (unsigned int s = 0; s < 1 - r; s++)
 
27737
        {
 
27738
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
27739
          {
 
27740
            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;
 
27741
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
27742
            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;
 
27743
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27744
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27745
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
27746
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
27747
          }// end loop over 't'
 
27748
        }// end loop over 's'
 
27749
      }// end loop over 'r'
 
27750
      for (unsigned int r = 0; r < 3; r++)
 
27751
      {
 
27752
        for (unsigned int s = 0; s < 3 - r; s++)
 
27753
        {
 
27754
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
27755
          {
 
27756
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
27757
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
27758
          }// end loop over 't'
 
27759
        }// end loop over 's'
 
27760
      }// end loop over 'r'
 
27761
      
 
27762
      // Table(s) of coefficients.
 
27763
      static const double coefficients0[10] = \
 
27764
      {0.230940107675850, 0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, 0.100790526135794, -0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
27765
      
 
27766
      // Tables of derivatives of the polynomial base (transpose).
 
27767
      static const double dmats0[10][10] = \
 
27768
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27769
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27770
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27771
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27772
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27773
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27774
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27775
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27776
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27777
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27778
      
 
27779
      static const double dmats1[10][10] = \
 
27780
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27781
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27782
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27783
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27784
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27785
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27786
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27787
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27788
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27789
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27790
      
 
27791
      static const double dmats2[10][10] = \
 
27792
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27793
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27794
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27795
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27796
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27797
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27798
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27799
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27800
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27801
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
27802
      
 
27803
      // Compute reference derivatives.
 
27804
      // Declare pointer to array of derivatives on FIAT element.
 
27805
      double *derivatives = new double[num_derivatives];
 
27806
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27807
      {
 
27808
        derivatives[r] = 0.000000000000000;
 
27809
      }// end loop over 'r'
 
27810
      
 
27811
      // Declare derivative matrix (of polynomial basis).
 
27812
      double dmats[10][10] = \
 
27813
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27814
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27815
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27816
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27817
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27818
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27819
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27820
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27821
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27822
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27823
      
 
27824
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
27825
      double dmats_old[10][10] = \
 
27826
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27827
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27828
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27829
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27830
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27831
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27832
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
27833
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
27834
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
27835
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
27836
      
 
27837
      // Loop possible derivatives.
 
27838
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27839
      {
 
27840
        // Resetting dmats values to compute next derivative.
 
27841
        for (unsigned int t = 0; t < 10; t++)
 
27842
        {
 
27843
          for (unsigned int u = 0; u < 10; u++)
 
27844
          {
 
27845
            dmats[t][u] = 0.000000000000000;
 
27846
            if (t == u)
 
27847
            {
 
27848
            dmats[t][u] = 1.000000000000000;
 
27849
            }
 
27850
            
 
27851
          }// end loop over 'u'
 
27852
        }// end loop over 't'
 
27853
        
 
27854
        // Looping derivative order to generate dmats.
 
27855
        for (unsigned int s = 0; s < n; s++)
 
27856
        {
 
27857
          // Updating dmats_old with new values and resetting dmats.
 
27858
          for (unsigned int t = 0; t < 10; t++)
 
27859
          {
 
27860
            for (unsigned int u = 0; u < 10; u++)
 
27861
            {
 
27862
              dmats_old[t][u] = dmats[t][u];
 
27863
              dmats[t][u] = 0.000000000000000;
 
27864
            }// end loop over 'u'
 
27865
          }// end loop over 't'
 
27866
          
 
27867
          // Update dmats using an inner product.
 
27868
          if (combinations[r][s] == 0)
 
27869
          {
 
27870
          for (unsigned int t = 0; t < 10; t++)
 
27871
          {
 
27872
            for (unsigned int u = 0; u < 10; u++)
 
27873
            {
 
27874
              for (unsigned int tu = 0; tu < 10; tu++)
 
27875
              {
 
27876
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
27877
              }// end loop over 'tu'
 
27878
            }// end loop over 'u'
 
27879
          }// end loop over 't'
 
27880
          }
 
27881
          
 
27882
          if (combinations[r][s] == 1)
 
27883
          {
 
27884
          for (unsigned int t = 0; t < 10; t++)
 
27885
          {
 
27886
            for (unsigned int u = 0; u < 10; u++)
 
27887
            {
 
27888
              for (unsigned int tu = 0; tu < 10; tu++)
 
27889
              {
 
27890
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
27891
              }// end loop over 'tu'
 
27892
            }// end loop over 'u'
 
27893
          }// end loop over 't'
 
27894
          }
 
27895
          
 
27896
          if (combinations[r][s] == 2)
 
27897
          {
 
27898
          for (unsigned int t = 0; t < 10; t++)
 
27899
          {
 
27900
            for (unsigned int u = 0; u < 10; u++)
 
27901
            {
 
27902
              for (unsigned int tu = 0; tu < 10; tu++)
 
27903
              {
 
27904
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
27905
              }// end loop over 'tu'
 
27906
            }// end loop over 'u'
 
27907
          }// end loop over 't'
 
27908
          }
 
27909
          
 
27910
        }// end loop over 's'
 
27911
        for (unsigned int s = 0; s < 10; s++)
 
27912
        {
 
27913
          for (unsigned int t = 0; t < 10; t++)
 
27914
          {
 
27915
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
27916
          }// end loop over 't'
 
27917
        }// end loop over 's'
 
27918
      }// end loop over 'r'
 
27919
      
 
27920
      // Transform derivatives back to physical element
 
27921
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27922
      {
 
27923
        for (unsigned int s = 0; s < num_derivatives; s++)
 
27924
        {
 
27925
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
27926
        }// end loop over 's'
 
27927
      }// end loop over 'r'
 
27928
      
 
27929
      // Delete pointer to array of derivatives on FIAT element
 
27930
      delete [] derivatives;
 
27931
      
 
27932
      // Delete pointer to array of combinations of derivatives and transform
 
27933
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27934
      {
 
27935
        delete [] combinations[r];
 
27936
      }// end loop over 'r'
 
27937
      delete [] combinations;
 
27938
      for (unsigned int r = 0; r < num_derivatives; r++)
 
27939
      {
 
27940
        delete [] transform[r];
 
27941
      }// end loop over 'r'
 
27942
      delete [] transform;
 
27943
        break;
 
27944
      }
 
27945
    case 27:
 
27946
      {
 
27947
        
 
27948
      // Array of basisvalues.
 
27949
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
27950
      
 
27951
      // Declare helper variables.
 
27952
      unsigned int rr = 0;
 
27953
      unsigned int ss = 0;
 
27954
      unsigned int tt = 0;
 
27955
      double tmp5 = 0.000000000000000;
 
27956
      double tmp6 = 0.000000000000000;
 
27957
      double tmp7 = 0.000000000000000;
 
27958
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
27959
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
27960
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
27961
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
27962
      double tmp4 = tmp3*tmp3;
 
27963
      
 
27964
      // Compute basisvalues.
 
27965
      basisvalues[0] = 1.000000000000000;
 
27966
      basisvalues[1] = tmp0;
 
27967
      for (unsigned int r = 1; r < 2; r++)
 
27968
      {
 
27969
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
27970
        ss = r*(r + 1)*(r + 2)/6;
 
27971
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
27972
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
27973
      }// end loop over 'r'
 
27974
      for (unsigned int r = 0; r < 2; r++)
 
27975
      {
 
27976
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
27977
        ss = r*(r + 1)*(r + 2)/6;
 
27978
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
27979
      }// end loop over 'r'
 
27980
      for (unsigned int r = 0; r < 1; r++)
 
27981
      {
 
27982
        for (unsigned int s = 1; s < 2 - r; s++)
 
27983
        {
 
27984
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
27985
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27986
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
27987
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27988
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27989
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
27990
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
27991
        }// end loop over 's'
 
27992
      }// end loop over 'r'
 
27993
      for (unsigned int r = 0; r < 2; r++)
 
27994
      {
 
27995
        for (unsigned int s = 0; s < 2 - r; s++)
 
27996
        {
 
27997
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
27998
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
27999
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
28000
        }// end loop over 's'
 
28001
      }// end loop over 'r'
 
28002
      for (unsigned int r = 0; r < 1; r++)
 
28003
      {
 
28004
        for (unsigned int s = 0; s < 1 - r; s++)
 
28005
        {
 
28006
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
28007
          {
 
28008
            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;
 
28009
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28010
            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;
 
28011
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28012
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28013
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28014
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
28015
          }// end loop over 't'
 
28016
        }// end loop over 's'
 
28017
      }// end loop over 'r'
 
28018
      for (unsigned int r = 0; r < 3; r++)
 
28019
      {
 
28020
        for (unsigned int s = 0; s < 3 - r; s++)
 
28021
        {
 
28022
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
28023
          {
 
28024
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28025
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
28026
          }// end loop over 't'
 
28027
        }// end loop over 's'
 
28028
      }// end loop over 'r'
 
28029
      
 
28030
      // Table(s) of coefficients.
 
28031
      static const double coefficients0[10] = \
 
28032
      {0.230940107675850, -0.121716123890037, -0.070272836892631, 0.099380798999991, 0.000000000000000, 0.000000000000000, -0.102868899974728, 0.000000000000000, -0.059391387091650, -0.067193684090529};
 
28033
      
 
28034
      // Tables of derivatives of the polynomial base (transpose).
 
28035
      static const double dmats0[10][10] = \
 
28036
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28037
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28038
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28039
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28040
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28041
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28042
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28043
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28044
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28045
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28046
      
 
28047
      static const double dmats1[10][10] = \
 
28048
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28049
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28050
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28051
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28052
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28053
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28054
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28055
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28056
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28057
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28058
      
 
28059
      static const double dmats2[10][10] = \
 
28060
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28061
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28062
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28063
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28064
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28065
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28066
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28067
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28068
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28069
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28070
      
 
28071
      // Compute reference derivatives.
 
28072
      // Declare pointer to array of derivatives on FIAT element.
 
28073
      double *derivatives = new double[num_derivatives];
 
28074
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28075
      {
 
28076
        derivatives[r] = 0.000000000000000;
 
28077
      }// end loop over 'r'
 
28078
      
 
28079
      // Declare derivative matrix (of polynomial basis).
 
28080
      double dmats[10][10] = \
 
28081
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28082
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28083
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28084
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28085
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28086
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28087
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28088
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28089
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28090
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28091
      
 
28092
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
28093
      double dmats_old[10][10] = \
 
28094
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28095
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28096
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28097
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28098
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28099
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28100
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28101
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28102
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28103
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28104
      
 
28105
      // Loop possible derivatives.
 
28106
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28107
      {
 
28108
        // Resetting dmats values to compute next derivative.
 
28109
        for (unsigned int t = 0; t < 10; t++)
 
28110
        {
 
28111
          for (unsigned int u = 0; u < 10; u++)
 
28112
          {
 
28113
            dmats[t][u] = 0.000000000000000;
 
28114
            if (t == u)
 
28115
            {
 
28116
            dmats[t][u] = 1.000000000000000;
 
28117
            }
 
28118
            
 
28119
          }// end loop over 'u'
 
28120
        }// end loop over 't'
 
28121
        
 
28122
        // Looping derivative order to generate dmats.
 
28123
        for (unsigned int s = 0; s < n; s++)
 
28124
        {
 
28125
          // Updating dmats_old with new values and resetting dmats.
 
28126
          for (unsigned int t = 0; t < 10; t++)
 
28127
          {
 
28128
            for (unsigned int u = 0; u < 10; u++)
 
28129
            {
 
28130
              dmats_old[t][u] = dmats[t][u];
 
28131
              dmats[t][u] = 0.000000000000000;
 
28132
            }// end loop over 'u'
 
28133
          }// end loop over 't'
 
28134
          
 
28135
          // Update dmats using an inner product.
 
28136
          if (combinations[r][s] == 0)
 
28137
          {
 
28138
          for (unsigned int t = 0; t < 10; t++)
 
28139
          {
 
28140
            for (unsigned int u = 0; u < 10; u++)
 
28141
            {
 
28142
              for (unsigned int tu = 0; tu < 10; tu++)
 
28143
              {
 
28144
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
28145
              }// end loop over 'tu'
 
28146
            }// end loop over 'u'
 
28147
          }// end loop over 't'
 
28148
          }
 
28149
          
 
28150
          if (combinations[r][s] == 1)
 
28151
          {
 
28152
          for (unsigned int t = 0; t < 10; t++)
 
28153
          {
 
28154
            for (unsigned int u = 0; u < 10; u++)
 
28155
            {
 
28156
              for (unsigned int tu = 0; tu < 10; tu++)
 
28157
              {
 
28158
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
28159
              }// end loop over 'tu'
 
28160
            }// end loop over 'u'
 
28161
          }// end loop over 't'
 
28162
          }
 
28163
          
 
28164
          if (combinations[r][s] == 2)
 
28165
          {
 
28166
          for (unsigned int t = 0; t < 10; t++)
 
28167
          {
 
28168
            for (unsigned int u = 0; u < 10; u++)
 
28169
            {
 
28170
              for (unsigned int tu = 0; tu < 10; tu++)
 
28171
              {
 
28172
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
28173
              }// end loop over 'tu'
 
28174
            }// end loop over 'u'
 
28175
          }// end loop over 't'
 
28176
          }
 
28177
          
 
28178
        }// end loop over 's'
 
28179
        for (unsigned int s = 0; s < 10; s++)
 
28180
        {
 
28181
          for (unsigned int t = 0; t < 10; t++)
 
28182
          {
 
28183
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
28184
          }// end loop over 't'
 
28185
        }// end loop over 's'
 
28186
      }// end loop over 'r'
 
28187
      
 
28188
      // Transform derivatives back to physical element
 
28189
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28190
      {
 
28191
        for (unsigned int s = 0; s < num_derivatives; s++)
 
28192
        {
 
28193
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
28194
        }// end loop over 's'
 
28195
      }// end loop over 'r'
 
28196
      
 
28197
      // Delete pointer to array of derivatives on FIAT element
 
28198
      delete [] derivatives;
 
28199
      
 
28200
      // Delete pointer to array of combinations of derivatives and transform
 
28201
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28202
      {
 
28203
        delete [] combinations[r];
 
28204
      }// end loop over 'r'
 
28205
      delete [] combinations;
 
28206
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28207
      {
 
28208
        delete [] transform[r];
 
28209
      }// end loop over 'r'
 
28210
      delete [] transform;
 
28211
        break;
 
28212
      }
 
28213
    case 28:
 
28214
      {
 
28215
        
 
28216
      // Array of basisvalues.
 
28217
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
28218
      
 
28219
      // Declare helper variables.
 
28220
      unsigned int rr = 0;
 
28221
      unsigned int ss = 0;
 
28222
      unsigned int tt = 0;
 
28223
      double tmp5 = 0.000000000000000;
 
28224
      double tmp6 = 0.000000000000000;
 
28225
      double tmp7 = 0.000000000000000;
 
28226
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
28227
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
28228
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
28229
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
28230
      double tmp4 = tmp3*tmp3;
 
28231
      
 
28232
      // Compute basisvalues.
 
28233
      basisvalues[0] = 1.000000000000000;
 
28234
      basisvalues[1] = tmp0;
 
28235
      for (unsigned int r = 1; r < 2; r++)
 
28236
      {
 
28237
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
28238
        ss = r*(r + 1)*(r + 2)/6;
 
28239
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
28240
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
28241
      }// end loop over 'r'
 
28242
      for (unsigned int r = 0; r < 2; r++)
 
28243
      {
 
28244
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
28245
        ss = r*(r + 1)*(r + 2)/6;
 
28246
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
28247
      }// end loop over 'r'
 
28248
      for (unsigned int r = 0; r < 1; r++)
 
28249
      {
 
28250
        for (unsigned int s = 1; s < 2 - r; s++)
 
28251
        {
 
28252
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
28253
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
28254
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
28255
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
28256
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
28257
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
28258
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
28259
        }// end loop over 's'
 
28260
      }// end loop over 'r'
 
28261
      for (unsigned int r = 0; r < 2; r++)
 
28262
      {
 
28263
        for (unsigned int s = 0; s < 2 - r; s++)
 
28264
        {
 
28265
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
28266
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
28267
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
28268
        }// end loop over 's'
 
28269
      }// end loop over 'r'
 
28270
      for (unsigned int r = 0; r < 1; r++)
 
28271
      {
 
28272
        for (unsigned int s = 0; s < 1 - r; s++)
 
28273
        {
 
28274
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
28275
          {
 
28276
            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;
 
28277
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28278
            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;
 
28279
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28280
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28281
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28282
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
28283
          }// end loop over 't'
 
28284
        }// end loop over 's'
 
28285
      }// end loop over 'r'
 
28286
      for (unsigned int r = 0; r < 3; r++)
 
28287
      {
 
28288
        for (unsigned int s = 0; s < 3 - r; s++)
 
28289
        {
 
28290
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
28291
          {
 
28292
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28293
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
28294
          }// end loop over 't'
 
28295
        }// end loop over 's'
 
28296
      }// end loop over 'r'
 
28297
      
 
28298
      // Table(s) of coefficients.
 
28299
      static const double coefficients0[10] = \
 
28300
      {0.230940107675850, -0.121716123890037, 0.070272836892631, -0.099380798999991, 0.000000000000000, -0.100790526135794, 0.020573779994946, -0.087287156094397, -0.011878277418330, 0.016798421022632};
 
28301
      
 
28302
      // Tables of derivatives of the polynomial base (transpose).
 
28303
      static const double dmats0[10][10] = \
 
28304
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28305
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28306
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28307
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28308
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28309
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28310
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28311
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28312
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28313
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28314
      
 
28315
      static const double dmats1[10][10] = \
 
28316
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28317
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28318
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28319
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28320
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28321
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28322
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28323
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28324
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28325
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28326
      
 
28327
      static const double dmats2[10][10] = \
 
28328
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28329
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28330
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28331
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28332
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28333
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28334
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28335
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28336
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28337
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28338
      
 
28339
      // Compute reference derivatives.
 
28340
      // Declare pointer to array of derivatives on FIAT element.
 
28341
      double *derivatives = new double[num_derivatives];
 
28342
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28343
      {
 
28344
        derivatives[r] = 0.000000000000000;
 
28345
      }// end loop over 'r'
 
28346
      
 
28347
      // Declare derivative matrix (of polynomial basis).
 
28348
      double dmats[10][10] = \
 
28349
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28350
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28351
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28352
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28353
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28354
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28355
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28356
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28357
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28358
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28359
      
 
28360
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
28361
      double dmats_old[10][10] = \
 
28362
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28363
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28364
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28365
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28366
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28367
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28368
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28369
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28370
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28371
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28372
      
 
28373
      // Loop possible derivatives.
 
28374
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28375
      {
 
28376
        // Resetting dmats values to compute next derivative.
 
28377
        for (unsigned int t = 0; t < 10; t++)
 
28378
        {
 
28379
          for (unsigned int u = 0; u < 10; u++)
 
28380
          {
 
28381
            dmats[t][u] = 0.000000000000000;
 
28382
            if (t == u)
 
28383
            {
 
28384
            dmats[t][u] = 1.000000000000000;
 
28385
            }
 
28386
            
 
28387
          }// end loop over 'u'
 
28388
        }// end loop over 't'
 
28389
        
 
28390
        // Looping derivative order to generate dmats.
 
28391
        for (unsigned int s = 0; s < n; s++)
 
28392
        {
 
28393
          // Updating dmats_old with new values and resetting dmats.
 
28394
          for (unsigned int t = 0; t < 10; t++)
 
28395
          {
 
28396
            for (unsigned int u = 0; u < 10; u++)
 
28397
            {
 
28398
              dmats_old[t][u] = dmats[t][u];
 
28399
              dmats[t][u] = 0.000000000000000;
 
28400
            }// end loop over 'u'
 
28401
          }// end loop over 't'
 
28402
          
 
28403
          // Update dmats using an inner product.
 
28404
          if (combinations[r][s] == 0)
 
28405
          {
 
28406
          for (unsigned int t = 0; t < 10; t++)
 
28407
          {
 
28408
            for (unsigned int u = 0; u < 10; u++)
 
28409
            {
 
28410
              for (unsigned int tu = 0; tu < 10; tu++)
 
28411
              {
 
28412
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
28413
              }// end loop over 'tu'
 
28414
            }// end loop over 'u'
 
28415
          }// end loop over 't'
 
28416
          }
 
28417
          
 
28418
          if (combinations[r][s] == 1)
 
28419
          {
 
28420
          for (unsigned int t = 0; t < 10; t++)
 
28421
          {
 
28422
            for (unsigned int u = 0; u < 10; u++)
 
28423
            {
 
28424
              for (unsigned int tu = 0; tu < 10; tu++)
 
28425
              {
 
28426
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
28427
              }// end loop over 'tu'
 
28428
            }// end loop over 'u'
 
28429
          }// end loop over 't'
 
28430
          }
 
28431
          
 
28432
          if (combinations[r][s] == 2)
 
28433
          {
 
28434
          for (unsigned int t = 0; t < 10; t++)
 
28435
          {
 
28436
            for (unsigned int u = 0; u < 10; u++)
 
28437
            {
 
28438
              for (unsigned int tu = 0; tu < 10; tu++)
 
28439
              {
 
28440
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
28441
              }// end loop over 'tu'
 
28442
            }// end loop over 'u'
 
28443
          }// end loop over 't'
 
28444
          }
 
28445
          
 
28446
        }// end loop over 's'
 
28447
        for (unsigned int s = 0; s < 10; s++)
 
28448
        {
 
28449
          for (unsigned int t = 0; t < 10; t++)
 
28450
          {
 
28451
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
28452
          }// end loop over 't'
 
28453
        }// end loop over 's'
 
28454
      }// end loop over 'r'
 
28455
      
 
28456
      // Transform derivatives back to physical element
 
28457
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28458
      {
 
28459
        for (unsigned int s = 0; s < num_derivatives; s++)
 
28460
        {
 
28461
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
28462
        }// end loop over 's'
 
28463
      }// end loop over 'r'
 
28464
      
 
28465
      // Delete pointer to array of derivatives on FIAT element
 
28466
      delete [] derivatives;
 
28467
      
 
28468
      // Delete pointer to array of combinations of derivatives and transform
 
28469
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28470
      {
 
28471
        delete [] combinations[r];
 
28472
      }// end loop over 'r'
 
28473
      delete [] combinations;
 
28474
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28475
      {
 
28476
        delete [] transform[r];
 
28477
      }// end loop over 'r'
 
28478
      delete [] transform;
 
28479
        break;
 
28480
      }
 
28481
    case 29:
 
28482
      {
 
28483
        
 
28484
      // Array of basisvalues.
 
28485
      double basisvalues[10] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
28486
      
 
28487
      // Declare helper variables.
 
28488
      unsigned int rr = 0;
 
28489
      unsigned int ss = 0;
 
28490
      unsigned int tt = 0;
 
28491
      double tmp5 = 0.000000000000000;
 
28492
      double tmp6 = 0.000000000000000;
 
28493
      double tmp7 = 0.000000000000000;
 
28494
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
28495
      double tmp1 = 0.250000000000000*(Y + Z)*(Y + Z);
 
28496
      double tmp2 = 0.500000000000000*(1.000000000000000 + Z + 2.000000000000000*Y);
 
28497
      double tmp3 = 0.500000000000000*(1.000000000000000 - Z);
 
28498
      double tmp4 = tmp3*tmp3;
 
28499
      
 
28500
      // Compute basisvalues.
 
28501
      basisvalues[0] = 1.000000000000000;
 
28502
      basisvalues[1] = tmp0;
 
28503
      for (unsigned int r = 1; r < 2; r++)
 
28504
      {
 
28505
        rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
 
28506
        ss = r*(r + 1)*(r + 2)/6;
 
28507
        tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
 
28508
        basisvalues[rr] = (basisvalues[ss]*tmp0*(1.000000000000000 + 2.000000000000000*r)/(1.000000000000000 + r) - basisvalues[tt]*tmp1*r/(1.000000000000000 + r));
 
28509
      }// end loop over 'r'
 
28510
      for (unsigned int r = 0; r < 2; r++)
 
28511
      {
 
28512
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
28513
        ss = r*(r + 1)*(r + 2)/6;
 
28514
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
28515
      }// end loop over 'r'
 
28516
      for (unsigned int r = 0; r < 1; r++)
 
28517
      {
 
28518
        for (unsigned int s = 1; s < 2 - r; s++)
 
28519
        {
 
28520
          rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
 
28521
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
28522
          tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
 
28523
          tmp5 = (2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
28524
          tmp6 = (1.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*r)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)/(2.000000000000000*(1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
28525
          tmp7 = (1.000000000000000 + s + 2.000000000000000*r)*(3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*s/((1.000000000000000 + 2.000000000000000*r + 2.000000000000000*s)*(1.000000000000000 + s)*(2.000000000000000 + s + 2.000000000000000*r));
 
28526
          basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
 
28527
        }// end loop over 's'
 
28528
      }// end loop over 'r'
 
28529
      for (unsigned int r = 0; r < 2; r++)
 
28530
      {
 
28531
        for (unsigned int s = 0; s < 2 - r; s++)
 
28532
        {
 
28533
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
28534
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
28535
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
28536
        }// end loop over 's'
 
28537
      }// end loop over 'r'
 
28538
      for (unsigned int r = 0; r < 1; r++)
 
28539
      {
 
28540
        for (unsigned int s = 0; s < 1 - r; s++)
 
28541
        {
 
28542
          for (unsigned int t = 1; t < 2 - r - s; t++)
 
28543
          {
 
28544
            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;
 
28545
            ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28546
            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;
 
28547
            tmp5 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)/(2.000000000000000*(1.000000000000000 + t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28548
            tmp6 = (3.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(4.000000000000000 + 4.000000000000000*r*r + 4.000000000000000*s*s + 8.000000000000000*r*s + 8.000000000000000*r + 8.000000000000000*s)/(2.000000000000000*(1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28549
            tmp7 = (2.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s)*(4.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*t/((1.000000000000000 + t)*(2.000000000000000 + 2.000000000000000*r + 2.000000000000000*s + 2.000000000000000*t)*(3.000000000000000 + t + 2.000000000000000*r + 2.000000000000000*s));
 
28550
            basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
 
28551
          }// end loop over 't'
 
28552
        }// end loop over 's'
 
28553
      }// end loop over 'r'
 
28554
      for (unsigned int r = 0; r < 3; r++)
 
28555
      {
 
28556
        for (unsigned int s = 0; s < 3 - r; s++)
 
28557
        {
 
28558
          for (unsigned int t = 0; t < 3 - r - s; t++)
 
28559
          {
 
28560
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28561
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
28562
          }// end loop over 't'
 
28563
        }// end loop over 's'
 
28564
      }// end loop over 'r'
 
28565
      
 
28566
      // Table(s) of coefficients.
 
28567
      static const double coefficients0[10] = \
 
28568
      {0.230940107675850, 0.000000000000000, -0.140545673785261, -0.099380798999991, -0.130120009726471, 0.000000000000000, 0.000000000000000, 0.029095718698132, 0.023756554836660, 0.016798421022632};
 
28569
      
 
28570
      // Tables of derivatives of the polynomial base (transpose).
 
28571
      static const double dmats0[10][10] = \
 
28572
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28573
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28574
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28575
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28576
      {0.000000000000000, 11.224972160321824, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28577
      {4.582575694955839, 0.000000000000000, 8.366600265340754, -1.183215956619923, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28578
      {3.741657386773944, 0.000000000000000, 0.000000000000000, 8.694826047713663, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28579
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28580
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28581
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28582
      
 
28583
      static const double dmats1[10][10] = \
 
28584
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28585
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28586
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28587
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28588
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28589
      {2.291287847477921, 7.245688373094720, 4.183300132670378, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28590
      {1.870828693386972, 0.000000000000000, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28591
      {-2.645751311064595, 0.000000000000000, 9.660917830792959, 0.683130051063973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28592
      {3.240370349203932, 0.000000000000000, 0.000000000000000, 7.529940238806679, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28593
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28594
      
 
28595
      static const double dmats2[10][10] = \
 
28596
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28597
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28598
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28599
      {5.163977794943224, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28600
      {2.958039891549810, 5.612486080160912, -1.080123449734643, -0.763762615825973, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28601
      {2.291287847477920, 1.449137674618944, 4.183300132670377, -0.591607978309962, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28602
      {1.870828693386973, 7.099295739719540, 0.000000000000000, 4.347413023856832, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28603
      {1.322875655532295, 0.000000000000000, 3.864367132317183, -0.341565025531987, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28604
      {1.080123449734643, 0.000000000000000, 7.099295739719538, 2.509980079602226, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28605
      {-3.818813079129869, 0.000000000000000, 0.000000000000000, 8.874119674649425, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28606
      
 
28607
      // Compute reference derivatives.
 
28608
      // Declare pointer to array of derivatives on FIAT element.
 
28609
      double *derivatives = new double[num_derivatives];
 
28610
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28611
      {
 
28612
        derivatives[r] = 0.000000000000000;
 
28613
      }// end loop over 'r'
 
28614
      
 
28615
      // Declare derivative matrix (of polynomial basis).
 
28616
      double dmats[10][10] = \
 
28617
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28618
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28619
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28620
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28621
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28622
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28623
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28624
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28625
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28626
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28627
      
 
28628
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
28629
      double dmats_old[10][10] = \
 
28630
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28631
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28632
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28633
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28634
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28635
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28636
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28637
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28638
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28639
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28640
      
 
28641
      // Loop possible derivatives.
 
28642
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28643
      {
 
28644
        // Resetting dmats values to compute next derivative.
 
28645
        for (unsigned int t = 0; t < 10; t++)
 
28646
        {
 
28647
          for (unsigned int u = 0; u < 10; u++)
 
28648
          {
 
28649
            dmats[t][u] = 0.000000000000000;
 
28650
            if (t == u)
 
28651
            {
 
28652
            dmats[t][u] = 1.000000000000000;
 
28653
            }
 
28654
            
 
28655
          }// end loop over 'u'
 
28656
        }// end loop over 't'
 
28657
        
 
28658
        // Looping derivative order to generate dmats.
 
28659
        for (unsigned int s = 0; s < n; s++)
 
28660
        {
 
28661
          // Updating dmats_old with new values and resetting dmats.
 
28662
          for (unsigned int t = 0; t < 10; t++)
 
28663
          {
 
28664
            for (unsigned int u = 0; u < 10; u++)
 
28665
            {
 
28666
              dmats_old[t][u] = dmats[t][u];
 
28667
              dmats[t][u] = 0.000000000000000;
 
28668
            }// end loop over 'u'
 
28669
          }// end loop over 't'
 
28670
          
 
28671
          // Update dmats using an inner product.
 
28672
          if (combinations[r][s] == 0)
 
28673
          {
 
28674
          for (unsigned int t = 0; t < 10; t++)
 
28675
          {
 
28676
            for (unsigned int u = 0; u < 10; u++)
 
28677
            {
 
28678
              for (unsigned int tu = 0; tu < 10; tu++)
 
28679
              {
 
28680
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
28681
              }// end loop over 'tu'
 
28682
            }// end loop over 'u'
 
28683
          }// end loop over 't'
 
28684
          }
 
28685
          
 
28686
          if (combinations[r][s] == 1)
 
28687
          {
 
28688
          for (unsigned int t = 0; t < 10; t++)
 
28689
          {
 
28690
            for (unsigned int u = 0; u < 10; u++)
 
28691
            {
 
28692
              for (unsigned int tu = 0; tu < 10; tu++)
 
28693
              {
 
28694
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
28695
              }// end loop over 'tu'
 
28696
            }// end loop over 'u'
 
28697
          }// end loop over 't'
 
28698
          }
 
28699
          
 
28700
          if (combinations[r][s] == 2)
 
28701
          {
 
28702
          for (unsigned int t = 0; t < 10; t++)
 
28703
          {
 
28704
            for (unsigned int u = 0; u < 10; u++)
 
28705
            {
 
28706
              for (unsigned int tu = 0; tu < 10; tu++)
 
28707
              {
 
28708
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
28709
              }// end loop over 'tu'
 
28710
            }// end loop over 'u'
 
28711
          }// end loop over 't'
 
28712
          }
 
28713
          
 
28714
        }// end loop over 's'
 
28715
        for (unsigned int s = 0; s < 10; s++)
 
28716
        {
 
28717
          for (unsigned int t = 0; t < 10; t++)
 
28718
          {
 
28719
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
28720
          }// end loop over 't'
 
28721
        }// end loop over 's'
 
28722
      }// end loop over 'r'
 
28723
      
 
28724
      // Transform derivatives back to physical element
 
28725
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28726
      {
 
28727
        for (unsigned int s = 0; s < num_derivatives; s++)
 
28728
        {
 
28729
          values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
 
28730
        }// end loop over 's'
 
28731
      }// end loop over 'r'
 
28732
      
 
28733
      // Delete pointer to array of derivatives on FIAT element
 
28734
      delete [] derivatives;
 
28735
      
 
28736
      // Delete pointer to array of combinations of derivatives and transform
 
28737
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28738
      {
 
28739
        delete [] combinations[r];
 
28740
      }// end loop over 'r'
 
28741
      delete [] combinations;
 
28742
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28743
      {
 
28744
        delete [] transform[r];
 
28745
      }// end loop over 'r'
 
28746
      delete [] transform;
 
28747
        break;
 
28748
      }
 
28749
    case 30:
 
28750
      {
 
28751
        
 
28752
      // Array of basisvalues.
 
28753
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
28754
      
 
28755
      // Declare helper variables.
 
28756
      unsigned int rr = 0;
 
28757
      unsigned int ss = 0;
 
28758
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
28759
      
 
28760
      // Compute basisvalues.
 
28761
      basisvalues[0] = 1.000000000000000;
 
28762
      basisvalues[1] = tmp0;
 
28763
      for (unsigned int r = 0; r < 1; r++)
 
28764
      {
 
28765
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
28766
        ss = r*(r + 1)*(r + 2)/6;
 
28767
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
28768
      }// end loop over 'r'
 
28769
      for (unsigned int r = 0; r < 1; r++)
 
28770
      {
 
28771
        for (unsigned int s = 0; s < 1 - r; s++)
 
28772
        {
 
28773
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
28774
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
28775
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
28776
        }// end loop over 's'
 
28777
      }// end loop over 'r'
 
28778
      for (unsigned int r = 0; r < 2; r++)
 
28779
      {
 
28780
        for (unsigned int s = 0; s < 2 - r; s++)
 
28781
        {
 
28782
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
28783
          {
 
28784
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28785
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
28786
          }// end loop over 't'
 
28787
        }// end loop over 's'
 
28788
      }// end loop over 'r'
 
28789
      
 
28790
      // Table(s) of coefficients.
 
28791
      static const double coefficients0[4] = \
 
28792
      {0.288675134594813, -0.182574185835055, -0.105409255338946, -0.074535599249993};
 
28793
      
 
28794
      // Tables of derivatives of the polynomial base (transpose).
 
28795
      static const double dmats0[4][4] = \
 
28796
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28797
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28798
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28799
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28800
      
 
28801
      static const double dmats1[4][4] = \
 
28802
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28803
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28804
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28805
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28806
      
 
28807
      static const double dmats2[4][4] = \
 
28808
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28809
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28810
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28811
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28812
      
 
28813
      // Compute reference derivatives.
 
28814
      // Declare pointer to array of derivatives on FIAT element.
 
28815
      double *derivatives = new double[num_derivatives];
 
28816
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28817
      {
 
28818
        derivatives[r] = 0.000000000000000;
 
28819
      }// end loop over 'r'
 
28820
      
 
28821
      // Declare derivative matrix (of polynomial basis).
 
28822
      double dmats[4][4] = \
 
28823
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28824
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28825
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28826
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28827
      
 
28828
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
28829
      double dmats_old[4][4] = \
 
28830
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28831
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
28832
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
28833
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
28834
      
 
28835
      // Loop possible derivatives.
 
28836
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28837
      {
 
28838
        // Resetting dmats values to compute next derivative.
 
28839
        for (unsigned int t = 0; t < 4; t++)
 
28840
        {
 
28841
          for (unsigned int u = 0; u < 4; u++)
 
28842
          {
 
28843
            dmats[t][u] = 0.000000000000000;
 
28844
            if (t == u)
 
28845
            {
 
28846
            dmats[t][u] = 1.000000000000000;
 
28847
            }
 
28848
            
 
28849
          }// end loop over 'u'
 
28850
        }// end loop over 't'
 
28851
        
 
28852
        // Looping derivative order to generate dmats.
 
28853
        for (unsigned int s = 0; s < n; s++)
 
28854
        {
 
28855
          // Updating dmats_old with new values and resetting dmats.
 
28856
          for (unsigned int t = 0; t < 4; t++)
 
28857
          {
 
28858
            for (unsigned int u = 0; u < 4; u++)
 
28859
            {
 
28860
              dmats_old[t][u] = dmats[t][u];
 
28861
              dmats[t][u] = 0.000000000000000;
 
28862
            }// end loop over 'u'
 
28863
          }// end loop over 't'
 
28864
          
 
28865
          // Update dmats using an inner product.
 
28866
          if (combinations[r][s] == 0)
 
28867
          {
 
28868
          for (unsigned int t = 0; t < 4; t++)
 
28869
          {
 
28870
            for (unsigned int u = 0; u < 4; u++)
 
28871
            {
 
28872
              for (unsigned int tu = 0; tu < 4; tu++)
 
28873
              {
 
28874
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
28875
              }// end loop over 'tu'
 
28876
            }// end loop over 'u'
 
28877
          }// end loop over 't'
 
28878
          }
 
28879
          
 
28880
          if (combinations[r][s] == 1)
 
28881
          {
 
28882
          for (unsigned int t = 0; t < 4; t++)
 
28883
          {
 
28884
            for (unsigned int u = 0; u < 4; u++)
 
28885
            {
 
28886
              for (unsigned int tu = 0; tu < 4; tu++)
 
28887
              {
 
28888
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
28889
              }// end loop over 'tu'
 
28890
            }// end loop over 'u'
 
28891
          }// end loop over 't'
 
28892
          }
 
28893
          
 
28894
          if (combinations[r][s] == 2)
 
28895
          {
 
28896
          for (unsigned int t = 0; t < 4; t++)
 
28897
          {
 
28898
            for (unsigned int u = 0; u < 4; u++)
 
28899
            {
 
28900
              for (unsigned int tu = 0; tu < 4; tu++)
 
28901
              {
 
28902
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
28903
              }// end loop over 'tu'
 
28904
            }// end loop over 'u'
 
28905
          }// end loop over 't'
 
28906
          }
 
28907
          
 
28908
        }// end loop over 's'
 
28909
        for (unsigned int s = 0; s < 4; s++)
 
28910
        {
 
28911
          for (unsigned int t = 0; t < 4; t++)
 
28912
          {
 
28913
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
28914
          }// end loop over 't'
 
28915
        }// end loop over 's'
 
28916
      }// end loop over 'r'
 
28917
      
 
28918
      // Transform derivatives back to physical element
 
28919
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28920
      {
 
28921
        for (unsigned int s = 0; s < num_derivatives; s++)
 
28922
        {
 
28923
          values[3*num_derivatives + r] += transform[r][s]*derivatives[s];
 
28924
        }// end loop over 's'
 
28925
      }// end loop over 'r'
 
28926
      
 
28927
      // Delete pointer to array of derivatives on FIAT element
 
28928
      delete [] derivatives;
 
28929
      
 
28930
      // Delete pointer to array of combinations of derivatives and transform
 
28931
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28932
      {
 
28933
        delete [] combinations[r];
 
28934
      }// end loop over 'r'
 
28935
      delete [] combinations;
 
28936
      for (unsigned int r = 0; r < num_derivatives; r++)
 
28937
      {
 
28938
        delete [] transform[r];
 
28939
      }// end loop over 'r'
 
28940
      delete [] transform;
 
28941
        break;
 
28942
      }
 
28943
    case 31:
 
28944
      {
 
28945
        
 
28946
      // Array of basisvalues.
 
28947
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
28948
      
 
28949
      // Declare helper variables.
 
28950
      unsigned int rr = 0;
 
28951
      unsigned int ss = 0;
 
28952
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
28953
      
 
28954
      // Compute basisvalues.
 
28955
      basisvalues[0] = 1.000000000000000;
 
28956
      basisvalues[1] = tmp0;
 
28957
      for (unsigned int r = 0; r < 1; r++)
 
28958
      {
 
28959
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
28960
        ss = r*(r + 1)*(r + 2)/6;
 
28961
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
28962
      }// end loop over 'r'
 
28963
      for (unsigned int r = 0; r < 1; r++)
 
28964
      {
 
28965
        for (unsigned int s = 0; s < 1 - r; s++)
 
28966
        {
 
28967
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
28968
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
28969
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
28970
        }// end loop over 's'
 
28971
      }// end loop over 'r'
 
28972
      for (unsigned int r = 0; r < 2; r++)
 
28973
      {
 
28974
        for (unsigned int s = 0; s < 2 - r; s++)
 
28975
        {
 
28976
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
28977
          {
 
28978
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
28979
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
28980
          }// end loop over 't'
 
28981
        }// end loop over 's'
 
28982
      }// end loop over 'r'
 
28983
      
 
28984
      // Table(s) of coefficients.
 
28985
      static const double coefficients0[4] = \
 
28986
      {0.288675134594813, 0.182574185835055, -0.105409255338946, -0.074535599249993};
 
28987
      
 
28988
      // Tables of derivatives of the polynomial base (transpose).
 
28989
      static const double dmats0[4][4] = \
 
28990
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28991
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28992
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28993
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
28994
      
 
28995
      static const double dmats1[4][4] = \
 
28996
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28997
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28998
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
28999
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29000
      
 
29001
      static const double dmats2[4][4] = \
 
29002
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29003
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29004
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29005
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29006
      
 
29007
      // Compute reference derivatives.
 
29008
      // Declare pointer to array of derivatives on FIAT element.
 
29009
      double *derivatives = new double[num_derivatives];
 
29010
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29011
      {
 
29012
        derivatives[r] = 0.000000000000000;
 
29013
      }// end loop over 'r'
 
29014
      
 
29015
      // Declare derivative matrix (of polynomial basis).
 
29016
      double dmats[4][4] = \
 
29017
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29018
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
29019
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
29020
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
29021
      
 
29022
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
29023
      double dmats_old[4][4] = \
 
29024
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29025
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
29026
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
29027
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
29028
      
 
29029
      // Loop possible derivatives.
 
29030
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29031
      {
 
29032
        // Resetting dmats values to compute next derivative.
 
29033
        for (unsigned int t = 0; t < 4; t++)
 
29034
        {
 
29035
          for (unsigned int u = 0; u < 4; u++)
 
29036
          {
 
29037
            dmats[t][u] = 0.000000000000000;
 
29038
            if (t == u)
 
29039
            {
 
29040
            dmats[t][u] = 1.000000000000000;
 
29041
            }
 
29042
            
 
29043
          }// end loop over 'u'
 
29044
        }// end loop over 't'
 
29045
        
 
29046
        // Looping derivative order to generate dmats.
 
29047
        for (unsigned int s = 0; s < n; s++)
 
29048
        {
 
29049
          // Updating dmats_old with new values and resetting dmats.
 
29050
          for (unsigned int t = 0; t < 4; t++)
 
29051
          {
 
29052
            for (unsigned int u = 0; u < 4; u++)
 
29053
            {
 
29054
              dmats_old[t][u] = dmats[t][u];
 
29055
              dmats[t][u] = 0.000000000000000;
 
29056
            }// end loop over 'u'
 
29057
          }// end loop over 't'
 
29058
          
 
29059
          // Update dmats using an inner product.
 
29060
          if (combinations[r][s] == 0)
 
29061
          {
 
29062
          for (unsigned int t = 0; t < 4; t++)
 
29063
          {
 
29064
            for (unsigned int u = 0; u < 4; u++)
 
29065
            {
 
29066
              for (unsigned int tu = 0; tu < 4; tu++)
 
29067
              {
 
29068
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
29069
              }// end loop over 'tu'
 
29070
            }// end loop over 'u'
 
29071
          }// end loop over 't'
 
29072
          }
 
29073
          
 
29074
          if (combinations[r][s] == 1)
 
29075
          {
 
29076
          for (unsigned int t = 0; t < 4; t++)
 
29077
          {
 
29078
            for (unsigned int u = 0; u < 4; u++)
 
29079
            {
 
29080
              for (unsigned int tu = 0; tu < 4; tu++)
 
29081
              {
 
29082
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
29083
              }// end loop over 'tu'
 
29084
            }// end loop over 'u'
 
29085
          }// end loop over 't'
 
29086
          }
 
29087
          
 
29088
          if (combinations[r][s] == 2)
 
29089
          {
 
29090
          for (unsigned int t = 0; t < 4; t++)
 
29091
          {
 
29092
            for (unsigned int u = 0; u < 4; u++)
 
29093
            {
 
29094
              for (unsigned int tu = 0; tu < 4; tu++)
 
29095
              {
 
29096
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
29097
              }// end loop over 'tu'
 
29098
            }// end loop over 'u'
 
29099
          }// end loop over 't'
 
29100
          }
 
29101
          
 
29102
        }// end loop over 's'
 
29103
        for (unsigned int s = 0; s < 4; s++)
 
29104
        {
 
29105
          for (unsigned int t = 0; t < 4; t++)
 
29106
          {
 
29107
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
29108
          }// end loop over 't'
 
29109
        }// end loop over 's'
 
29110
      }// end loop over 'r'
 
29111
      
 
29112
      // Transform derivatives back to physical element
 
29113
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29114
      {
 
29115
        for (unsigned int s = 0; s < num_derivatives; s++)
 
29116
        {
 
29117
          values[3*num_derivatives + r] += transform[r][s]*derivatives[s];
 
29118
        }// end loop over 's'
 
29119
      }// end loop over 'r'
 
29120
      
 
29121
      // Delete pointer to array of derivatives on FIAT element
 
29122
      delete [] derivatives;
 
29123
      
 
29124
      // Delete pointer to array of combinations of derivatives and transform
 
29125
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29126
      {
 
29127
        delete [] combinations[r];
 
29128
      }// end loop over 'r'
 
29129
      delete [] combinations;
 
29130
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29131
      {
 
29132
        delete [] transform[r];
 
29133
      }// end loop over 'r'
 
29134
      delete [] transform;
 
29135
        break;
 
29136
      }
 
29137
    case 32:
 
29138
      {
 
29139
        
 
29140
      // Array of basisvalues.
 
29141
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
29142
      
 
29143
      // Declare helper variables.
 
29144
      unsigned int rr = 0;
 
29145
      unsigned int ss = 0;
 
29146
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
29147
      
 
29148
      // Compute basisvalues.
 
29149
      basisvalues[0] = 1.000000000000000;
 
29150
      basisvalues[1] = tmp0;
 
29151
      for (unsigned int r = 0; r < 1; r++)
 
29152
      {
 
29153
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
29154
        ss = r*(r + 1)*(r + 2)/6;
 
29155
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
29156
      }// end loop over 'r'
 
29157
      for (unsigned int r = 0; r < 1; r++)
 
29158
      {
 
29159
        for (unsigned int s = 0; s < 1 - r; s++)
 
29160
        {
 
29161
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
29162
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
29163
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
29164
        }// end loop over 's'
 
29165
      }// end loop over 'r'
 
29166
      for (unsigned int r = 0; r < 2; r++)
 
29167
      {
 
29168
        for (unsigned int s = 0; s < 2 - r; s++)
 
29169
        {
 
29170
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
29171
          {
 
29172
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
29173
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
29174
          }// end loop over 't'
 
29175
        }// end loop over 's'
 
29176
      }// end loop over 'r'
 
29177
      
 
29178
      // Table(s) of coefficients.
 
29179
      static const double coefficients0[4] = \
 
29180
      {0.288675134594813, 0.000000000000000, 0.210818510677892, -0.074535599249993};
 
29181
      
 
29182
      // Tables of derivatives of the polynomial base (transpose).
 
29183
      static const double dmats0[4][4] = \
 
29184
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29185
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29186
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29187
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29188
      
 
29189
      static const double dmats1[4][4] = \
 
29190
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29191
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29192
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29193
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29194
      
 
29195
      static const double dmats2[4][4] = \
 
29196
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29197
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29198
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29199
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29200
      
 
29201
      // Compute reference derivatives.
 
29202
      // Declare pointer to array of derivatives on FIAT element.
 
29203
      double *derivatives = new double[num_derivatives];
 
29204
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29205
      {
 
29206
        derivatives[r] = 0.000000000000000;
 
29207
      }// end loop over 'r'
 
29208
      
 
29209
      // Declare derivative matrix (of polynomial basis).
 
29210
      double dmats[4][4] = \
 
29211
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29212
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
29213
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
29214
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
29215
      
 
29216
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
29217
      double dmats_old[4][4] = \
 
29218
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29219
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
29220
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
29221
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
29222
      
 
29223
      // Loop possible derivatives.
 
29224
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29225
      {
 
29226
        // Resetting dmats values to compute next derivative.
 
29227
        for (unsigned int t = 0; t < 4; t++)
 
29228
        {
 
29229
          for (unsigned int u = 0; u < 4; u++)
 
29230
          {
 
29231
            dmats[t][u] = 0.000000000000000;
 
29232
            if (t == u)
 
29233
            {
 
29234
            dmats[t][u] = 1.000000000000000;
 
29235
            }
 
29236
            
 
29237
          }// end loop over 'u'
 
29238
        }// end loop over 't'
 
29239
        
 
29240
        // Looping derivative order to generate dmats.
 
29241
        for (unsigned int s = 0; s < n; s++)
 
29242
        {
 
29243
          // Updating dmats_old with new values and resetting dmats.
 
29244
          for (unsigned int t = 0; t < 4; t++)
 
29245
          {
 
29246
            for (unsigned int u = 0; u < 4; u++)
 
29247
            {
 
29248
              dmats_old[t][u] = dmats[t][u];
 
29249
              dmats[t][u] = 0.000000000000000;
 
29250
            }// end loop over 'u'
 
29251
          }// end loop over 't'
 
29252
          
 
29253
          // Update dmats using an inner product.
 
29254
          if (combinations[r][s] == 0)
 
29255
          {
 
29256
          for (unsigned int t = 0; t < 4; t++)
 
29257
          {
 
29258
            for (unsigned int u = 0; u < 4; u++)
 
29259
            {
 
29260
              for (unsigned int tu = 0; tu < 4; tu++)
 
29261
              {
 
29262
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
29263
              }// end loop over 'tu'
 
29264
            }// end loop over 'u'
 
29265
          }// end loop over 't'
 
29266
          }
 
29267
          
 
29268
          if (combinations[r][s] == 1)
 
29269
          {
 
29270
          for (unsigned int t = 0; t < 4; t++)
 
29271
          {
 
29272
            for (unsigned int u = 0; u < 4; u++)
 
29273
            {
 
29274
              for (unsigned int tu = 0; tu < 4; tu++)
 
29275
              {
 
29276
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
29277
              }// end loop over 'tu'
 
29278
            }// end loop over 'u'
 
29279
          }// end loop over 't'
 
29280
          }
 
29281
          
 
29282
          if (combinations[r][s] == 2)
 
29283
          {
 
29284
          for (unsigned int t = 0; t < 4; t++)
 
29285
          {
 
29286
            for (unsigned int u = 0; u < 4; u++)
 
29287
            {
 
29288
              for (unsigned int tu = 0; tu < 4; tu++)
 
29289
              {
 
29290
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
29291
              }// end loop over 'tu'
 
29292
            }// end loop over 'u'
 
29293
          }// end loop over 't'
 
29294
          }
 
29295
          
 
29296
        }// end loop over 's'
 
29297
        for (unsigned int s = 0; s < 4; s++)
 
29298
        {
 
29299
          for (unsigned int t = 0; t < 4; t++)
 
29300
          {
 
29301
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
29302
          }// end loop over 't'
 
29303
        }// end loop over 's'
 
29304
      }// end loop over 'r'
 
29305
      
 
29306
      // Transform derivatives back to physical element
 
29307
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29308
      {
 
29309
        for (unsigned int s = 0; s < num_derivatives; s++)
 
29310
        {
 
29311
          values[3*num_derivatives + r] += transform[r][s]*derivatives[s];
 
29312
        }// end loop over 's'
 
29313
      }// end loop over 'r'
 
29314
      
 
29315
      // Delete pointer to array of derivatives on FIAT element
 
29316
      delete [] derivatives;
 
29317
      
 
29318
      // Delete pointer to array of combinations of derivatives and transform
 
29319
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29320
      {
 
29321
        delete [] combinations[r];
 
29322
      }// end loop over 'r'
 
29323
      delete [] combinations;
 
29324
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29325
      {
 
29326
        delete [] transform[r];
 
29327
      }// end loop over 'r'
 
29328
      delete [] transform;
 
29329
        break;
 
29330
      }
 
29331
    case 33:
 
29332
      {
 
29333
        
 
29334
      // Array of basisvalues.
 
29335
      double basisvalues[4] = {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000};
 
29336
      
 
29337
      // Declare helper variables.
 
29338
      unsigned int rr = 0;
 
29339
      unsigned int ss = 0;
 
29340
      double tmp0 = 0.500000000000000*(2.000000000000000 + Y + Z + 2.000000000000000*X);
 
29341
      
 
29342
      // Compute basisvalues.
 
29343
      basisvalues[0] = 1.000000000000000;
 
29344
      basisvalues[1] = tmp0;
 
29345
      for (unsigned int r = 0; r < 1; r++)
 
29346
      {
 
29347
        rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
 
29348
        ss = r*(r + 1)*(r + 2)/6;
 
29349
        basisvalues[rr] = basisvalues[ss]*(r*(1.000000000000000 + Y) + (2.000000000000000 + Z + 3.000000000000000*Y)/2.000000000000000);
 
29350
      }// end loop over 'r'
 
29351
      for (unsigned int r = 0; r < 1; r++)
 
29352
      {
 
29353
        for (unsigned int s = 0; s < 1 - r; s++)
 
29354
        {
 
29355
          rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
 
29356
          ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
 
29357
          basisvalues[rr] = basisvalues[ss]*(1.000000000000000 + r + s + Z*(2.000000000000000 + r + s));
 
29358
        }// end loop over 's'
 
29359
      }// end loop over 'r'
 
29360
      for (unsigned int r = 0; r < 2; r++)
 
29361
      {
 
29362
        for (unsigned int s = 0; s < 2 - r; s++)
 
29363
        {
 
29364
          for (unsigned int t = 0; t < 2 - r - s; t++)
 
29365
          {
 
29366
            rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
 
29367
            basisvalues[rr] *= std::sqrt((0.500000000000000 + r)*(1.000000000000000 + r + s)*(1.500000000000000 + r + s + t));
 
29368
          }// end loop over 't'
 
29369
        }// end loop over 's'
 
29370
      }// end loop over 'r'
 
29371
      
 
29372
      // Table(s) of coefficients.
 
29373
      static const double coefficients0[4] = \
 
29374
      {0.288675134594813, 0.000000000000000, 0.000000000000000, 0.223606797749979};
 
29375
      
 
29376
      // Tables of derivatives of the polynomial base (transpose).
 
29377
      static const double dmats0[4][4] = \
 
29378
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29379
      {6.324555320336760, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29380
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29381
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29382
      
 
29383
      static const double dmats1[4][4] = \
 
29384
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29385
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29386
      {5.477225575051662, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29387
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29388
      
 
29389
      static const double dmats2[4][4] = \
 
29390
      {{0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29391
      {3.162277660168380, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29392
      {1.825741858350554, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29393
      {5.163977794943223, 0.000000000000000, 0.000000000000000, 0.000000000000000}};
 
29394
      
 
29395
      // Compute reference derivatives.
 
29396
      // Declare pointer to array of derivatives on FIAT element.
 
29397
      double *derivatives = new double[num_derivatives];
 
29398
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29399
      {
 
29400
        derivatives[r] = 0.000000000000000;
 
29401
      }// end loop over 'r'
 
29402
      
 
29403
      // Declare derivative matrix (of polynomial basis).
 
29404
      double dmats[4][4] = \
 
29405
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29406
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
29407
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
29408
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
29409
      
 
29410
      // Declare (auxiliary) derivative matrix (of polynomial basis).
 
29411
      double dmats_old[4][4] = \
 
29412
      {{1.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000},
 
29413
      {0.000000000000000, 1.000000000000000, 0.000000000000000, 0.000000000000000},
 
29414
      {0.000000000000000, 0.000000000000000, 1.000000000000000, 0.000000000000000},
 
29415
      {0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000}};
 
29416
      
 
29417
      // Loop possible derivatives.
 
29418
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29419
      {
 
29420
        // Resetting dmats values to compute next derivative.
 
29421
        for (unsigned int t = 0; t < 4; t++)
 
29422
        {
 
29423
          for (unsigned int u = 0; u < 4; u++)
 
29424
          {
 
29425
            dmats[t][u] = 0.000000000000000;
 
29426
            if (t == u)
 
29427
            {
 
29428
            dmats[t][u] = 1.000000000000000;
 
29429
            }
 
29430
            
 
29431
          }// end loop over 'u'
 
29432
        }// end loop over 't'
 
29433
        
 
29434
        // Looping derivative order to generate dmats.
 
29435
        for (unsigned int s = 0; s < n; s++)
 
29436
        {
 
29437
          // Updating dmats_old with new values and resetting dmats.
 
29438
          for (unsigned int t = 0; t < 4; t++)
 
29439
          {
 
29440
            for (unsigned int u = 0; u < 4; u++)
 
29441
            {
 
29442
              dmats_old[t][u] = dmats[t][u];
 
29443
              dmats[t][u] = 0.000000000000000;
 
29444
            }// end loop over 'u'
 
29445
          }// end loop over 't'
 
29446
          
 
29447
          // Update dmats using an inner product.
 
29448
          if (combinations[r][s] == 0)
 
29449
          {
 
29450
          for (unsigned int t = 0; t < 4; t++)
 
29451
          {
 
29452
            for (unsigned int u = 0; u < 4; u++)
 
29453
            {
 
29454
              for (unsigned int tu = 0; tu < 4; tu++)
 
29455
              {
 
29456
                dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
 
29457
              }// end loop over 'tu'
 
29458
            }// end loop over 'u'
 
29459
          }// end loop over 't'
 
29460
          }
 
29461
          
 
29462
          if (combinations[r][s] == 1)
 
29463
          {
 
29464
          for (unsigned int t = 0; t < 4; t++)
 
29465
          {
 
29466
            for (unsigned int u = 0; u < 4; u++)
 
29467
            {
 
29468
              for (unsigned int tu = 0; tu < 4; tu++)
 
29469
              {
 
29470
                dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
 
29471
              }// end loop over 'tu'
 
29472
            }// end loop over 'u'
 
29473
          }// end loop over 't'
 
29474
          }
 
29475
          
 
29476
          if (combinations[r][s] == 2)
 
29477
          {
 
29478
          for (unsigned int t = 0; t < 4; t++)
 
29479
          {
 
29480
            for (unsigned int u = 0; u < 4; u++)
 
29481
            {
 
29482
              for (unsigned int tu = 0; tu < 4; tu++)
 
29483
              {
 
29484
                dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
 
29485
              }// end loop over 'tu'
 
29486
            }// end loop over 'u'
 
29487
          }// end loop over 't'
 
29488
          }
 
29489
          
 
29490
        }// end loop over 's'
 
29491
        for (unsigned int s = 0; s < 4; s++)
 
29492
        {
 
29493
          for (unsigned int t = 0; t < 4; t++)
 
29494
          {
 
29495
            derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
 
29496
          }// end loop over 't'
 
29497
        }// end loop over 's'
 
29498
      }// end loop over 'r'
 
29499
      
 
29500
      // Transform derivatives back to physical element
 
29501
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29502
      {
 
29503
        for (unsigned int s = 0; s < num_derivatives; s++)
 
29504
        {
 
29505
          values[3*num_derivatives + r] += transform[r][s]*derivatives[s];
 
29506
        }// end loop over 's'
 
29507
      }// end loop over 'r'
 
29508
      
 
29509
      // Delete pointer to array of derivatives on FIAT element
 
29510
      delete [] derivatives;
 
29511
      
 
29512
      // Delete pointer to array of combinations of derivatives and transform
 
29513
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29514
      {
 
29515
        delete [] combinations[r];
 
29516
      }// end loop over 'r'
 
29517
      delete [] combinations;
 
29518
      for (unsigned int r = 0; r < num_derivatives; r++)
 
29519
      {
 
29520
        delete [] transform[r];
 
29521
      }// end loop over 'r'
 
29522
      delete [] transform;
 
29523
        break;
 
29524
      }
 
29525
    }
 
29526
    
 
29527
  }
 
29528
 
 
29529
  /// Evaluate order n derivatives of all basis functions at given point in cell
 
29530
  virtual void evaluate_basis_derivatives_all(unsigned int n,
 
29531
                                              double* values,
 
29532
                                              const double* coordinates,
 
29533
                                              const ufc::cell& c) const
 
29534
  {
 
29535
    // Compute number of derivatives.
 
29536
    unsigned int num_derivatives = 1;
 
29537
    for (unsigned int r = 0; r < n; r++)
 
29538
    {
 
29539
      num_derivatives *= 3;
 
29540
    }// end loop over 'r'
 
29541
    
 
29542
    // Helper variable to hold values of a single dof.
 
29543
    double *dof_values = new double[4*num_derivatives];
 
29544
    for (unsigned int r = 0; r < 4*num_derivatives; r++)
 
29545
    {
 
29546
      dof_values[r] = 0.000000000000000;
 
29547
    }// end loop over 'r'
 
29548
    
 
29549
    // Loop dofs and call evaluate_basis_derivatives.
 
29550
    for (unsigned int r = 0; r < 34; r++)
 
29551
    {
 
29552
      evaluate_basis_derivatives(r, n, dof_values, coordinates, c);
 
29553
      for (unsigned int s = 0; s < 4*num_derivatives; s++)
 
29554
      {
 
29555
        values[r*4*num_derivatives + s] = dof_values[s];
 
29556
      }// end loop over 's'
 
29557
    }// end loop over 'r'
 
29558
    
 
29559
    // Delete pointer.
 
29560
    delete [] dof_values;
 
29561
  }
 
29562
 
 
29563
  /// Evaluate linear functional for dof i on the function f
 
29564
  virtual double evaluate_dof(unsigned int i,
 
29565
                              const ufc::function& f,
 
29566
                              const ufc::cell& c) const
 
29567
  {
 
29568
    // Declare variables for result of evaluation.
 
29569
    double vals[4];
 
29570
    
 
29571
    // Declare variable for physical coordinates.
 
29572
    double y[3];
 
29573
    const double * const * x = c.coordinates;
 
29574
    switch (i)
 
29575
    {
 
29576
    case 0:
 
29577
      {
 
29578
        y[0] = x[0][0];
 
29579
      y[1] = x[0][1];
 
29580
      y[2] = x[0][2];
 
29581
      f.evaluate(vals, y, c);
 
29582
      return vals[0];
 
29583
        break;
 
29584
      }
 
29585
    case 1:
 
29586
      {
 
29587
        y[0] = x[1][0];
 
29588
      y[1] = x[1][1];
 
29589
      y[2] = x[1][2];
 
29590
      f.evaluate(vals, y, c);
 
29591
      return vals[0];
 
29592
        break;
 
29593
      }
 
29594
    case 2:
 
29595
      {
 
29596
        y[0] = x[2][0];
 
29597
      y[1] = x[2][1];
 
29598
      y[2] = x[2][2];
 
29599
      f.evaluate(vals, y, c);
 
29600
      return vals[0];
 
29601
        break;
 
29602
      }
 
29603
    case 3:
 
29604
      {
 
29605
        y[0] = x[3][0];
 
29606
      y[1] = x[3][1];
 
29607
      y[2] = x[3][2];
 
29608
      f.evaluate(vals, y, c);
 
29609
      return vals[0];
 
29610
        break;
 
29611
      }
 
29612
    case 4:
 
29613
      {
 
29614
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
29615
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
29616
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
29617
      f.evaluate(vals, y, c);
 
29618
      return vals[0];
 
29619
        break;
 
29620
      }
 
29621
    case 5:
 
29622
      {
 
29623
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
29624
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
29625
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
29626
      f.evaluate(vals, y, c);
 
29627
      return vals[0];
 
29628
        break;
 
29629
      }
 
29630
    case 6:
 
29631
      {
 
29632
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
29633
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
29634
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
29635
      f.evaluate(vals, y, c);
 
29636
      return vals[0];
 
29637
        break;
 
29638
      }
 
29639
    case 7:
 
29640
      {
 
29641
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
29642
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
29643
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
29644
      f.evaluate(vals, y, c);
 
29645
      return vals[0];
 
29646
        break;
 
29647
      }
 
29648
    case 8:
 
29649
      {
 
29650
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
29651
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
29652
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
29653
      f.evaluate(vals, y, c);
 
29654
      return vals[0];
 
29655
        break;
 
29656
      }
 
29657
    case 9:
 
29658
      {
 
29659
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
29660
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
29661
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
29662
      f.evaluate(vals, y, c);
 
29663
      return vals[0];
 
29664
        break;
 
29665
      }
 
29666
    case 10:
 
29667
      {
 
29668
        y[0] = x[0][0];
 
29669
      y[1] = x[0][1];
 
29670
      y[2] = x[0][2];
 
29671
      f.evaluate(vals, y, c);
 
29672
      return vals[1];
 
29673
        break;
 
29674
      }
 
29675
    case 11:
 
29676
      {
 
29677
        y[0] = x[1][0];
 
29678
      y[1] = x[1][1];
 
29679
      y[2] = x[1][2];
 
29680
      f.evaluate(vals, y, c);
 
29681
      return vals[1];
 
29682
        break;
 
29683
      }
 
29684
    case 12:
 
29685
      {
 
29686
        y[0] = x[2][0];
 
29687
      y[1] = x[2][1];
 
29688
      y[2] = x[2][2];
 
29689
      f.evaluate(vals, y, c);
 
29690
      return vals[1];
 
29691
        break;
 
29692
      }
 
29693
    case 13:
 
29694
      {
 
29695
        y[0] = x[3][0];
 
29696
      y[1] = x[3][1];
 
29697
      y[2] = x[3][2];
 
29698
      f.evaluate(vals, y, c);
 
29699
      return vals[1];
 
29700
        break;
 
29701
      }
 
29702
    case 14:
 
29703
      {
 
29704
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
29705
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
29706
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
29707
      f.evaluate(vals, y, c);
 
29708
      return vals[1];
 
29709
        break;
 
29710
      }
 
29711
    case 15:
 
29712
      {
 
29713
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
29714
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
29715
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
29716
      f.evaluate(vals, y, c);
 
29717
      return vals[1];
 
29718
        break;
 
29719
      }
 
29720
    case 16:
 
29721
      {
 
29722
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
29723
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
29724
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
29725
      f.evaluate(vals, y, c);
 
29726
      return vals[1];
 
29727
        break;
 
29728
      }
 
29729
    case 17:
 
29730
      {
 
29731
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
29732
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
29733
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
29734
      f.evaluate(vals, y, c);
 
29735
      return vals[1];
 
29736
        break;
 
29737
      }
 
29738
    case 18:
 
29739
      {
 
29740
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
29741
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
29742
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
29743
      f.evaluate(vals, y, c);
 
29744
      return vals[1];
 
29745
        break;
 
29746
      }
 
29747
    case 19:
 
29748
      {
 
29749
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
29750
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
29751
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
29752
      f.evaluate(vals, y, c);
 
29753
      return vals[1];
 
29754
        break;
 
29755
      }
 
29756
    case 20:
 
29757
      {
 
29758
        y[0] = x[0][0];
 
29759
      y[1] = x[0][1];
 
29760
      y[2] = x[0][2];
 
29761
      f.evaluate(vals, y, c);
 
29762
      return vals[2];
 
29763
        break;
 
29764
      }
 
29765
    case 21:
 
29766
      {
 
29767
        y[0] = x[1][0];
 
29768
      y[1] = x[1][1];
 
29769
      y[2] = x[1][2];
 
29770
      f.evaluate(vals, y, c);
 
29771
      return vals[2];
 
29772
        break;
 
29773
      }
 
29774
    case 22:
 
29775
      {
 
29776
        y[0] = x[2][0];
 
29777
      y[1] = x[2][1];
 
29778
      y[2] = x[2][2];
 
29779
      f.evaluate(vals, y, c);
 
29780
      return vals[2];
 
29781
        break;
 
29782
      }
 
29783
    case 23:
 
29784
      {
 
29785
        y[0] = x[3][0];
 
29786
      y[1] = x[3][1];
 
29787
      y[2] = x[3][2];
 
29788
      f.evaluate(vals, y, c);
 
29789
      return vals[2];
 
29790
        break;
 
29791
      }
 
29792
    case 24:
 
29793
      {
 
29794
        y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
29795
      y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
29796
      y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
29797
      f.evaluate(vals, y, c);
 
29798
      return vals[2];
 
29799
        break;
 
29800
      }
 
29801
    case 25:
 
29802
      {
 
29803
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
29804
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
29805
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
29806
      f.evaluate(vals, y, c);
 
29807
      return vals[2];
 
29808
        break;
 
29809
      }
 
29810
    case 26:
 
29811
      {
 
29812
        y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
29813
      y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
29814
      y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
29815
      f.evaluate(vals, y, c);
 
29816
      return vals[2];
 
29817
        break;
 
29818
      }
 
29819
    case 27:
 
29820
      {
 
29821
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
29822
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
29823
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
29824
      f.evaluate(vals, y, c);
 
29825
      return vals[2];
 
29826
        break;
 
29827
      }
 
29828
    case 28:
 
29829
      {
 
29830
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
29831
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
29832
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
29833
      f.evaluate(vals, y, c);
 
29834
      return vals[2];
 
29835
        break;
 
29836
      }
 
29837
    case 29:
 
29838
      {
 
29839
        y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
29840
      y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
29841
      y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
29842
      f.evaluate(vals, y, c);
 
29843
      return vals[2];
 
29844
        break;
 
29845
      }
 
29846
    case 30:
 
29847
      {
 
29848
        y[0] = x[0][0];
 
29849
      y[1] = x[0][1];
 
29850
      y[2] = x[0][2];
 
29851
      f.evaluate(vals, y, c);
 
29852
      return vals[3];
 
29853
        break;
 
29854
      }
 
29855
    case 31:
 
29856
      {
 
29857
        y[0] = x[1][0];
 
29858
      y[1] = x[1][1];
 
29859
      y[2] = x[1][2];
 
29860
      f.evaluate(vals, y, c);
 
29861
      return vals[3];
 
29862
        break;
 
29863
      }
 
29864
    case 32:
 
29865
      {
 
29866
        y[0] = x[2][0];
 
29867
      y[1] = x[2][1];
 
29868
      y[2] = x[2][2];
 
29869
      f.evaluate(vals, y, c);
 
29870
      return vals[3];
 
29871
        break;
 
29872
      }
 
29873
    case 33:
 
29874
      {
 
29875
        y[0] = x[3][0];
 
29876
      y[1] = x[3][1];
 
29877
      y[2] = x[3][2];
 
29878
      f.evaluate(vals, y, c);
 
29879
      return vals[3];
 
29880
        break;
 
29881
      }
 
29882
    }
 
29883
    
 
29884
    return 0.000000000000000;
 
29885
  }
 
29886
 
 
29887
  /// Evaluate linear functionals for all dofs on the function f
 
29888
  virtual void evaluate_dofs(double* values,
 
29889
                             const ufc::function& f,
 
29890
                             const ufc::cell& c) const
 
29891
  {
 
29892
    // Declare variables for result of evaluation.
 
29893
    double vals[4];
 
29894
    
 
29895
    // Declare variable for physical coordinates.
 
29896
    double y[3];
 
29897
    const double * const * x = c.coordinates;
 
29898
    y[0] = x[0][0];
 
29899
    y[1] = x[0][1];
 
29900
    y[2] = x[0][2];
 
29901
    f.evaluate(vals, y, c);
 
29902
    values[0] = vals[0];
 
29903
    y[0] = x[1][0];
 
29904
    y[1] = x[1][1];
 
29905
    y[2] = x[1][2];
 
29906
    f.evaluate(vals, y, c);
 
29907
    values[1] = vals[0];
 
29908
    y[0] = x[2][0];
 
29909
    y[1] = x[2][1];
 
29910
    y[2] = x[2][2];
 
29911
    f.evaluate(vals, y, c);
 
29912
    values[2] = vals[0];
 
29913
    y[0] = x[3][0];
 
29914
    y[1] = x[3][1];
 
29915
    y[2] = x[3][2];
 
29916
    f.evaluate(vals, y, c);
 
29917
    values[3] = vals[0];
 
29918
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
29919
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
29920
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
29921
    f.evaluate(vals, y, c);
 
29922
    values[4] = vals[0];
 
29923
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
29924
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
29925
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
29926
    f.evaluate(vals, y, c);
 
29927
    values[5] = vals[0];
 
29928
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
29929
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
29930
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
29931
    f.evaluate(vals, y, c);
 
29932
    values[6] = vals[0];
 
29933
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
29934
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
29935
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
29936
    f.evaluate(vals, y, c);
 
29937
    values[7] = vals[0];
 
29938
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
29939
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
29940
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
29941
    f.evaluate(vals, y, c);
 
29942
    values[8] = vals[0];
 
29943
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
29944
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
29945
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
29946
    f.evaluate(vals, y, c);
 
29947
    values[9] = vals[0];
 
29948
    y[0] = x[0][0];
 
29949
    y[1] = x[0][1];
 
29950
    y[2] = x[0][2];
 
29951
    f.evaluate(vals, y, c);
 
29952
    values[10] = vals[1];
 
29953
    y[0] = x[1][0];
 
29954
    y[1] = x[1][1];
 
29955
    y[2] = x[1][2];
 
29956
    f.evaluate(vals, y, c);
 
29957
    values[11] = vals[1];
 
29958
    y[0] = x[2][0];
 
29959
    y[1] = x[2][1];
 
29960
    y[2] = x[2][2];
 
29961
    f.evaluate(vals, y, c);
 
29962
    values[12] = vals[1];
 
29963
    y[0] = x[3][0];
 
29964
    y[1] = x[3][1];
 
29965
    y[2] = x[3][2];
 
29966
    f.evaluate(vals, y, c);
 
29967
    values[13] = vals[1];
 
29968
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
29969
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
29970
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
29971
    f.evaluate(vals, y, c);
 
29972
    values[14] = vals[1];
 
29973
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
29974
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
29975
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
29976
    f.evaluate(vals, y, c);
 
29977
    values[15] = vals[1];
 
29978
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
29979
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
29980
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
29981
    f.evaluate(vals, y, c);
 
29982
    values[16] = vals[1];
 
29983
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
29984
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
29985
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
29986
    f.evaluate(vals, y, c);
 
29987
    values[17] = vals[1];
 
29988
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
29989
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
29990
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
29991
    f.evaluate(vals, y, c);
 
29992
    values[18] = vals[1];
 
29993
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
29994
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
29995
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
29996
    f.evaluate(vals, y, c);
 
29997
    values[19] = vals[1];
 
29998
    y[0] = x[0][0];
 
29999
    y[1] = x[0][1];
 
30000
    y[2] = x[0][2];
 
30001
    f.evaluate(vals, y, c);
 
30002
    values[20] = vals[2];
 
30003
    y[0] = x[1][0];
 
30004
    y[1] = x[1][1];
 
30005
    y[2] = x[1][2];
 
30006
    f.evaluate(vals, y, c);
 
30007
    values[21] = vals[2];
 
30008
    y[0] = x[2][0];
 
30009
    y[1] = x[2][1];
 
30010
    y[2] = x[2][2];
 
30011
    f.evaluate(vals, y, c);
 
30012
    values[22] = vals[2];
 
30013
    y[0] = x[3][0];
 
30014
    y[1] = x[3][1];
 
30015
    y[2] = x[3][2];
 
30016
    f.evaluate(vals, y, c);
 
30017
    values[23] = vals[2];
 
30018
    y[0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
30019
    y[1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
30020
    y[2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
30021
    f.evaluate(vals, y, c);
 
30022
    values[24] = vals[2];
 
30023
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
30024
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
30025
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
30026
    f.evaluate(vals, y, c);
 
30027
    values[25] = vals[2];
 
30028
    y[0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
30029
    y[1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
30030
    y[2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
30031
    f.evaluate(vals, y, c);
 
30032
    values[26] = vals[2];
 
30033
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
30034
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
30035
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
30036
    f.evaluate(vals, y, c);
 
30037
    values[27] = vals[2];
 
30038
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
30039
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
30040
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
30041
    f.evaluate(vals, y, c);
 
30042
    values[28] = vals[2];
 
30043
    y[0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
30044
    y[1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
30045
    y[2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
30046
    f.evaluate(vals, y, c);
 
30047
    values[29] = vals[2];
 
30048
    y[0] = x[0][0];
 
30049
    y[1] = x[0][1];
 
30050
    y[2] = x[0][2];
 
30051
    f.evaluate(vals, y, c);
 
30052
    values[30] = vals[3];
 
30053
    y[0] = x[1][0];
 
30054
    y[1] = x[1][1];
 
30055
    y[2] = x[1][2];
 
30056
    f.evaluate(vals, y, c);
 
30057
    values[31] = vals[3];
 
30058
    y[0] = x[2][0];
 
30059
    y[1] = x[2][1];
 
30060
    y[2] = x[2][2];
 
30061
    f.evaluate(vals, y, c);
 
30062
    values[32] = vals[3];
 
30063
    y[0] = x[3][0];
 
30064
    y[1] = x[3][1];
 
30065
    y[2] = x[3][2];
 
30066
    f.evaluate(vals, y, c);
 
30067
    values[33] = vals[3];
 
30068
  }
 
30069
 
 
30070
  /// Interpolate vertex values from dof values
 
30071
  virtual void interpolate_vertex_values(double* vertex_values,
 
30072
                                         const double* dof_values,
 
30073
                                         const ufc::cell& c) const
 
30074
  {
 
30075
    // Evaluate function and change variables
 
30076
    vertex_values[0] = dof_values[0];
 
30077
    vertex_values[4] = dof_values[1];
 
30078
    vertex_values[8] = dof_values[2];
 
30079
    vertex_values[12] = dof_values[3];
 
30080
    // Evaluate function and change variables
 
30081
    vertex_values[1] = dof_values[10];
 
30082
    vertex_values[5] = dof_values[11];
 
30083
    vertex_values[9] = dof_values[12];
 
30084
    vertex_values[13] = dof_values[13];
 
30085
    // Evaluate function and change variables
 
30086
    vertex_values[2] = dof_values[20];
 
30087
    vertex_values[6] = dof_values[21];
 
30088
    vertex_values[10] = dof_values[22];
 
30089
    vertex_values[14] = dof_values[23];
 
30090
    // Evaluate function and change variables
 
30091
    vertex_values[3] = dof_values[30];
 
30092
    vertex_values[7] = dof_values[31];
 
30093
    vertex_values[11] = dof_values[32];
 
30094
    vertex_values[15] = dof_values[33];
 
30095
  }
 
30096
 
 
30097
  /// Map coordinate xhat from reference cell to coordinate x in cell
 
30098
  virtual void map_from_reference_cell(double* x,
 
30099
                                       const double* xhat,
 
30100
                                       const ufc::cell& c)
 
30101
  {
 
30102
    throw std::runtime_error("map_from_reference_cell not yet implemented (introduced in UFC 2.0).");
 
30103
  }
 
30104
 
 
30105
  /// Map from coordinate x in cell to coordinate xhat in reference cell
 
30106
  virtual void map_to_reference_cell(double* xhat,
 
30107
                                     const double* x,
 
30108
                                     const ufc::cell& c)
 
30109
  {
 
30110
    throw std::runtime_error("map_to_reference_cell not yet implemented (introduced in UFC 2.0).");
 
30111
  }
 
30112
 
 
30113
  /// Return the number of sub elements (for a mixed element)
 
30114
  virtual unsigned int num_sub_elements() const
 
30115
  {
 
30116
    return 2;
 
30117
  }
 
30118
 
 
30119
  /// Create a new finite element for sub element i (for a mixed element)
 
30120
  virtual ufc::finite_element* create_sub_element(unsigned int i) const
 
30121
  {
 
30122
    switch (i)
 
30123
    {
 
30124
    case 0:
 
30125
      {
 
30126
        return new stokes_finite_element_1();
 
30127
        break;
 
30128
      }
 
30129
    case 1:
 
30130
      {
 
30131
        return new stokes_finite_element_2();
 
30132
        break;
 
30133
      }
 
30134
    }
 
30135
    
 
30136
    return 0;
 
30137
  }
 
30138
 
 
30139
  /// Create a new class instance
 
30140
  virtual ufc::finite_element* create() const
 
30141
  {
 
30142
    return new stokes_finite_element_3();
 
30143
  }
 
30144
 
 
30145
};
 
30146
 
 
30147
/// This class defines the interface for a local-to-global mapping of
 
30148
/// degrees of freedom (dofs).
 
30149
 
 
30150
class stokes_dofmap_0: public ufc::dofmap
 
30151
{
 
30152
private:
 
30153
 
 
30154
  unsigned int _global_dimension;
 
30155
public:
 
30156
 
 
30157
  /// Constructor
 
30158
  stokes_dofmap_0() : ufc::dofmap()
 
30159
  {
 
30160
    _global_dimension = 0;
 
30161
  }
 
30162
 
 
30163
  /// Destructor
 
30164
  virtual ~stokes_dofmap_0()
 
30165
  {
 
30166
    // Do nothing
 
30167
  }
 
30168
 
 
30169
  /// Return a string identifying the dofmap
 
30170
  virtual const char* signature() const
 
30171
  {
 
30172
    return "FFC dofmap for FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2)";
 
30173
  }
 
30174
 
 
30175
  /// Return true iff mesh entities of topological dimension d are needed
 
30176
  virtual bool needs_mesh_entities(unsigned int d) const
 
30177
  {
 
30178
    switch (d)
 
30179
    {
 
30180
    case 0:
 
30181
      {
 
30182
        return true;
 
30183
        break;
 
30184
      }
 
30185
    case 1:
 
30186
      {
 
30187
        return true;
 
30188
        break;
 
30189
      }
 
30190
    case 2:
 
30191
      {
 
30192
        return false;
 
30193
        break;
 
30194
      }
 
30195
    case 3:
 
30196
      {
 
30197
        return false;
 
30198
        break;
 
30199
      }
 
30200
    }
 
30201
    
 
30202
    return false;
 
30203
  }
 
30204
 
 
30205
  /// Initialize dofmap for mesh (return true iff init_cell() is needed)
 
30206
  virtual bool init_mesh(const ufc::mesh& m)
 
30207
  {
 
30208
    _global_dimension = m.num_entities[0] + m.num_entities[1];
 
30209
    return false;
 
30210
  }
 
30211
 
 
30212
  /// Initialize dofmap for given cell
 
30213
  virtual void init_cell(const ufc::mesh& m,
 
30214
                         const ufc::cell& c)
 
30215
  {
 
30216
    // Do nothing
 
30217
  }
 
30218
 
 
30219
  /// Finish initialization of dofmap for cells
 
30220
  virtual void init_cell_finalize()
 
30221
  {
 
30222
    // Do nothing
 
30223
  }
 
30224
 
 
30225
  /// Return the topological dimension of the associated cell shape
 
30226
  virtual unsigned int topological_dimension() const
 
30227
  {
 
30228
    return 3;
 
30229
  }
 
30230
 
 
30231
  /// Return the geometric dimension of the associated cell shape
 
30232
  virtual unsigned int geometric_dimension() const
 
30233
  {
 
30234
    return 3;
 
30235
  }
 
30236
 
 
30237
  /// Return the dimension of the global finite element function space
 
30238
  virtual unsigned int global_dimension() const
 
30239
  {
 
30240
    return _global_dimension;
 
30241
  }
 
30242
 
 
30243
  /// Return the dimension of the local finite element function space for a cell
 
30244
  virtual unsigned int local_dimension(const ufc::cell& c) const
 
30245
  {
 
30246
    return 10;
 
30247
  }
 
30248
 
 
30249
  /// Return the maximum dimension of the local finite element function space
 
30250
  virtual unsigned int max_local_dimension() const
 
30251
  {
 
30252
    return 10;
 
30253
  }
 
30254
 
 
30255
  /// Return the number of dofs on each cell facet
 
30256
  virtual unsigned int num_facet_dofs() const
 
30257
  {
 
30258
    return 6;
 
30259
  }
 
30260
 
 
30261
  /// Return the number of dofs associated with each cell entity of dimension d
 
30262
  virtual unsigned int num_entity_dofs(unsigned int d) const
 
30263
  {
 
30264
    switch (d)
 
30265
    {
 
30266
    case 0:
 
30267
      {
 
30268
        return 1;
 
30269
        break;
 
30270
      }
 
30271
    case 1:
 
30272
      {
 
30273
        return 1;
 
30274
        break;
 
30275
      }
 
30276
    case 2:
 
30277
      {
 
30278
        return 0;
 
30279
        break;
 
30280
      }
 
30281
    case 3:
 
30282
      {
 
30283
        return 0;
 
30284
        break;
 
30285
      }
 
30286
    }
 
30287
    
 
30288
    return 0;
 
30289
  }
 
30290
 
 
30291
  /// Tabulate the local-to-global mapping of dofs on a cell
 
30292
  virtual void tabulate_dofs(unsigned int* dofs,
 
30293
                             const ufc::mesh& m,
 
30294
                             const ufc::cell& c) const
 
30295
  {
 
30296
    unsigned int offset = 0;
 
30297
    dofs[0] = offset + c.entity_indices[0][0];
 
30298
    dofs[1] = offset + c.entity_indices[0][1];
 
30299
    dofs[2] = offset + c.entity_indices[0][2];
 
30300
    dofs[3] = offset + c.entity_indices[0][3];
 
30301
    offset += m.num_entities[0];
 
30302
    dofs[4] = offset + c.entity_indices[1][0];
 
30303
    dofs[5] = offset + c.entity_indices[1][1];
 
30304
    dofs[6] = offset + c.entity_indices[1][2];
 
30305
    dofs[7] = offset + c.entity_indices[1][3];
 
30306
    dofs[8] = offset + c.entity_indices[1][4];
 
30307
    dofs[9] = offset + c.entity_indices[1][5];
 
30308
    offset += m.num_entities[1];
 
30309
  }
 
30310
 
 
30311
  /// Tabulate the local-to-local mapping from facet dofs to cell dofs
 
30312
  virtual void tabulate_facet_dofs(unsigned int* dofs,
 
30313
                                   unsigned int facet) const
 
30314
  {
 
30315
    switch (facet)
 
30316
    {
 
30317
    case 0:
 
30318
      {
 
30319
        dofs[0] = 1;
 
30320
      dofs[1] = 2;
 
30321
      dofs[2] = 3;
 
30322
      dofs[3] = 4;
 
30323
      dofs[4] = 5;
 
30324
      dofs[5] = 6;
 
30325
        break;
 
30326
      }
 
30327
    case 1:
 
30328
      {
 
30329
        dofs[0] = 0;
 
30330
      dofs[1] = 2;
 
30331
      dofs[2] = 3;
 
30332
      dofs[3] = 4;
 
30333
      dofs[4] = 7;
 
30334
      dofs[5] = 8;
 
30335
        break;
 
30336
      }
 
30337
    case 2:
 
30338
      {
 
30339
        dofs[0] = 0;
 
30340
      dofs[1] = 1;
 
30341
      dofs[2] = 3;
 
30342
      dofs[3] = 5;
 
30343
      dofs[4] = 7;
 
30344
      dofs[5] = 9;
 
30345
        break;
 
30346
      }
 
30347
    case 3:
 
30348
      {
 
30349
        dofs[0] = 0;
 
30350
      dofs[1] = 1;
 
30351
      dofs[2] = 2;
 
30352
      dofs[3] = 6;
 
30353
      dofs[4] = 8;
 
30354
      dofs[5] = 9;
 
30355
        break;
 
30356
      }
 
30357
    }
 
30358
    
 
30359
  }
 
30360
 
 
30361
  /// Tabulate the local-to-local mapping of dofs on entity (d, i)
 
30362
  virtual void tabulate_entity_dofs(unsigned int* dofs,
 
30363
                                    unsigned int d, unsigned int i) const
 
30364
  {
 
30365
    if (d > 3)
 
30366
    {
 
30367
    throw std::runtime_error("d is larger than dimension (3)");
 
30368
    }
 
30369
    
 
30370
    switch (d)
 
30371
    {
 
30372
    case 0:
 
30373
      {
 
30374
        if (i > 3)
 
30375
      {
 
30376
      throw std::runtime_error("i is larger than number of entities (3)");
 
30377
      }
 
30378
      
 
30379
      switch (i)
 
30380
      {
 
30381
      case 0:
 
30382
        {
 
30383
          dofs[0] = 0;
 
30384
          break;
 
30385
        }
 
30386
      case 1:
 
30387
        {
 
30388
          dofs[0] = 1;
 
30389
          break;
 
30390
        }
 
30391
      case 2:
 
30392
        {
 
30393
          dofs[0] = 2;
 
30394
          break;
 
30395
        }
 
30396
      case 3:
 
30397
        {
 
30398
          dofs[0] = 3;
 
30399
          break;
 
30400
        }
 
30401
      }
 
30402
      
 
30403
        break;
 
30404
      }
 
30405
    case 1:
 
30406
      {
 
30407
        if (i > 5)
 
30408
      {
 
30409
      throw std::runtime_error("i is larger than number of entities (5)");
 
30410
      }
 
30411
      
 
30412
      switch (i)
 
30413
      {
 
30414
      case 0:
 
30415
        {
 
30416
          dofs[0] = 4;
 
30417
          break;
 
30418
        }
 
30419
      case 1:
 
30420
        {
 
30421
          dofs[0] = 5;
 
30422
          break;
 
30423
        }
 
30424
      case 2:
 
30425
        {
 
30426
          dofs[0] = 6;
 
30427
          break;
 
30428
        }
 
30429
      case 3:
 
30430
        {
 
30431
          dofs[0] = 7;
 
30432
          break;
 
30433
        }
 
30434
      case 4:
 
30435
        {
 
30436
          dofs[0] = 8;
 
30437
          break;
 
30438
        }
 
30439
      case 5:
 
30440
        {
 
30441
          dofs[0] = 9;
 
30442
          break;
 
30443
        }
 
30444
      }
 
30445
      
 
30446
        break;
 
30447
      }
 
30448
    case 2:
 
30449
      {
 
30450
        
 
30451
        break;
 
30452
      }
 
30453
    case 3:
 
30454
      {
 
30455
        
 
30456
        break;
 
30457
      }
 
30458
    }
 
30459
    
 
30460
  }
 
30461
 
 
30462
  /// Tabulate the coordinates of all dofs on a cell
 
30463
  virtual void tabulate_coordinates(double** coordinates,
 
30464
                                    const ufc::cell& c) const
 
30465
  {
 
30466
    const double * const * x = c.coordinates;
 
30467
    
 
30468
    coordinates[0][0] = x[0][0];
 
30469
    coordinates[0][1] = x[0][1];
 
30470
    coordinates[0][2] = x[0][2];
 
30471
    coordinates[1][0] = x[1][0];
 
30472
    coordinates[1][1] = x[1][1];
 
30473
    coordinates[1][2] = x[1][2];
 
30474
    coordinates[2][0] = x[2][0];
 
30475
    coordinates[2][1] = x[2][1];
 
30476
    coordinates[2][2] = x[2][2];
 
30477
    coordinates[3][0] = x[3][0];
 
30478
    coordinates[3][1] = x[3][1];
 
30479
    coordinates[3][2] = x[3][2];
 
30480
    coordinates[4][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
30481
    coordinates[4][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
30482
    coordinates[4][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
30483
    coordinates[5][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
30484
    coordinates[5][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
30485
    coordinates[5][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
30486
    coordinates[6][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
30487
    coordinates[6][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
30488
    coordinates[6][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
30489
    coordinates[7][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
30490
    coordinates[7][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
30491
    coordinates[7][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
30492
    coordinates[8][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
30493
    coordinates[8][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
30494
    coordinates[8][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
30495
    coordinates[9][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
30496
    coordinates[9][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
30497
    coordinates[9][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
30498
  }
 
30499
 
 
30500
  /// Return the number of sub dofmaps (for a mixed element)
 
30501
  virtual unsigned int num_sub_dofmaps() const
 
30502
  {
 
30503
    return 0;
 
30504
  }
 
30505
 
 
30506
  /// Create a new dofmap for sub dofmap i (for a mixed element)
 
30507
  virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const
 
30508
  {
 
30509
    return 0;
 
30510
  }
 
30511
 
 
30512
  /// Create a new class instance
 
30513
  virtual ufc::dofmap* create() const
 
30514
  {
 
30515
    return new stokes_dofmap_0();
 
30516
  }
 
30517
 
 
30518
};
 
30519
 
 
30520
/// This class defines the interface for a local-to-global mapping of
 
30521
/// degrees of freedom (dofs).
 
30522
 
 
30523
class stokes_dofmap_1: public ufc::dofmap
 
30524
{
 
30525
private:
 
30526
 
 
30527
  unsigned int _global_dimension;
 
30528
public:
 
30529
 
 
30530
  /// Constructor
 
30531
  stokes_dofmap_1() : ufc::dofmap()
 
30532
  {
 
30533
    _global_dimension = 0;
 
30534
  }
 
30535
 
 
30536
  /// Destructor
 
30537
  virtual ~stokes_dofmap_1()
 
30538
  {
 
30539
    // Do nothing
 
30540
  }
 
30541
 
 
30542
  /// Return a string identifying the dofmap
 
30543
  virtual const char* signature() const
 
30544
  {
 
30545
    return "FFC dofmap for VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3)";
 
30546
  }
 
30547
 
 
30548
  /// Return true iff mesh entities of topological dimension d are needed
 
30549
  virtual bool needs_mesh_entities(unsigned int d) const
 
30550
  {
 
30551
    switch (d)
 
30552
    {
 
30553
    case 0:
 
30554
      {
 
30555
        return true;
 
30556
        break;
 
30557
      }
 
30558
    case 1:
 
30559
      {
 
30560
        return true;
 
30561
        break;
 
30562
      }
 
30563
    case 2:
 
30564
      {
 
30565
        return false;
 
30566
        break;
 
30567
      }
 
30568
    case 3:
 
30569
      {
 
30570
        return false;
 
30571
        break;
 
30572
      }
 
30573
    }
 
30574
    
 
30575
    return false;
 
30576
  }
 
30577
 
 
30578
  /// Initialize dofmap for mesh (return true iff init_cell() is needed)
 
30579
  virtual bool init_mesh(const ufc::mesh& m)
 
30580
  {
 
30581
    _global_dimension = 3.000000000000000*m.num_entities[0] + 3.000000000000000*m.num_entities[1];
 
30582
    return false;
 
30583
  }
 
30584
 
 
30585
  /// Initialize dofmap for given cell
 
30586
  virtual void init_cell(const ufc::mesh& m,
 
30587
                         const ufc::cell& c)
 
30588
  {
 
30589
    // Do nothing
 
30590
  }
 
30591
 
 
30592
  /// Finish initialization of dofmap for cells
 
30593
  virtual void init_cell_finalize()
 
30594
  {
 
30595
    // Do nothing
 
30596
  }
 
30597
 
 
30598
  /// Return the topological dimension of the associated cell shape
 
30599
  virtual unsigned int topological_dimension() const
 
30600
  {
 
30601
    return 3;
 
30602
  }
 
30603
 
 
30604
  /// Return the geometric dimension of the associated cell shape
 
30605
  virtual unsigned int geometric_dimension() const
 
30606
  {
 
30607
    return 3;
 
30608
  }
 
30609
 
 
30610
  /// Return the dimension of the global finite element function space
 
30611
  virtual unsigned int global_dimension() const
 
30612
  {
 
30613
    return _global_dimension;
 
30614
  }
 
30615
 
 
30616
  /// Return the dimension of the local finite element function space for a cell
 
30617
  virtual unsigned int local_dimension(const ufc::cell& c) const
 
30618
  {
 
30619
    return 30;
 
30620
  }
 
30621
 
 
30622
  /// Return the maximum dimension of the local finite element function space
 
30623
  virtual unsigned int max_local_dimension() const
 
30624
  {
 
30625
    return 30;
 
30626
  }
 
30627
 
 
30628
  /// Return the number of dofs on each cell facet
 
30629
  virtual unsigned int num_facet_dofs() const
 
30630
  {
 
30631
    return 18;
 
30632
  }
 
30633
 
 
30634
  /// Return the number of dofs associated with each cell entity of dimension d
 
30635
  virtual unsigned int num_entity_dofs(unsigned int d) const
 
30636
  {
 
30637
    switch (d)
 
30638
    {
 
30639
    case 0:
 
30640
      {
 
30641
        return 3;
 
30642
        break;
 
30643
      }
 
30644
    case 1:
 
30645
      {
 
30646
        return 3;
 
30647
        break;
 
30648
      }
 
30649
    case 2:
 
30650
      {
 
30651
        return 0;
 
30652
        break;
 
30653
      }
 
30654
    case 3:
 
30655
      {
 
30656
        return 0;
 
30657
        break;
 
30658
      }
 
30659
    }
 
30660
    
 
30661
    return 0;
 
30662
  }
 
30663
 
 
30664
  /// Tabulate the local-to-global mapping of dofs on a cell
 
30665
  virtual void tabulate_dofs(unsigned int* dofs,
 
30666
                             const ufc::mesh& m,
 
30667
                             const ufc::cell& c) const
 
30668
  {
 
30669
    unsigned int offset = 0;
 
30670
    dofs[0] = offset + c.entity_indices[0][0];
 
30671
    dofs[1] = offset + c.entity_indices[0][1];
 
30672
    dofs[2] = offset + c.entity_indices[0][2];
 
30673
    dofs[3] = offset + c.entity_indices[0][3];
 
30674
    offset += m.num_entities[0];
 
30675
    dofs[4] = offset + c.entity_indices[1][0];
 
30676
    dofs[5] = offset + c.entity_indices[1][1];
 
30677
    dofs[6] = offset + c.entity_indices[1][2];
 
30678
    dofs[7] = offset + c.entity_indices[1][3];
 
30679
    dofs[8] = offset + c.entity_indices[1][4];
 
30680
    dofs[9] = offset + c.entity_indices[1][5];
 
30681
    offset += m.num_entities[1];
 
30682
    dofs[10] = offset + c.entity_indices[0][0];
 
30683
    dofs[11] = offset + c.entity_indices[0][1];
 
30684
    dofs[12] = offset + c.entity_indices[0][2];
 
30685
    dofs[13] = offset + c.entity_indices[0][3];
 
30686
    offset += m.num_entities[0];
 
30687
    dofs[14] = offset + c.entity_indices[1][0];
 
30688
    dofs[15] = offset + c.entity_indices[1][1];
 
30689
    dofs[16] = offset + c.entity_indices[1][2];
 
30690
    dofs[17] = offset + c.entity_indices[1][3];
 
30691
    dofs[18] = offset + c.entity_indices[1][4];
 
30692
    dofs[19] = offset + c.entity_indices[1][5];
 
30693
    offset += m.num_entities[1];
 
30694
    dofs[20] = offset + c.entity_indices[0][0];
 
30695
    dofs[21] = offset + c.entity_indices[0][1];
 
30696
    dofs[22] = offset + c.entity_indices[0][2];
 
30697
    dofs[23] = offset + c.entity_indices[0][3];
 
30698
    offset += m.num_entities[0];
 
30699
    dofs[24] = offset + c.entity_indices[1][0];
 
30700
    dofs[25] = offset + c.entity_indices[1][1];
 
30701
    dofs[26] = offset + c.entity_indices[1][2];
 
30702
    dofs[27] = offset + c.entity_indices[1][3];
 
30703
    dofs[28] = offset + c.entity_indices[1][4];
 
30704
    dofs[29] = offset + c.entity_indices[1][5];
 
30705
    offset += m.num_entities[1];
 
30706
  }
 
30707
 
 
30708
  /// Tabulate the local-to-local mapping from facet dofs to cell dofs
 
30709
  virtual void tabulate_facet_dofs(unsigned int* dofs,
 
30710
                                   unsigned int facet) const
 
30711
  {
 
30712
    switch (facet)
 
30713
    {
 
30714
    case 0:
 
30715
      {
 
30716
        dofs[0] = 1;
 
30717
      dofs[1] = 2;
 
30718
      dofs[2] = 3;
 
30719
      dofs[3] = 4;
 
30720
      dofs[4] = 5;
 
30721
      dofs[5] = 6;
 
30722
      dofs[6] = 11;
 
30723
      dofs[7] = 12;
 
30724
      dofs[8] = 13;
 
30725
      dofs[9] = 14;
 
30726
      dofs[10] = 15;
 
30727
      dofs[11] = 16;
 
30728
      dofs[12] = 21;
 
30729
      dofs[13] = 22;
 
30730
      dofs[14] = 23;
 
30731
      dofs[15] = 24;
 
30732
      dofs[16] = 25;
 
30733
      dofs[17] = 26;
 
30734
        break;
 
30735
      }
 
30736
    case 1:
 
30737
      {
 
30738
        dofs[0] = 0;
 
30739
      dofs[1] = 2;
 
30740
      dofs[2] = 3;
 
30741
      dofs[3] = 4;
 
30742
      dofs[4] = 7;
 
30743
      dofs[5] = 8;
 
30744
      dofs[6] = 10;
 
30745
      dofs[7] = 12;
 
30746
      dofs[8] = 13;
 
30747
      dofs[9] = 14;
 
30748
      dofs[10] = 17;
 
30749
      dofs[11] = 18;
 
30750
      dofs[12] = 20;
 
30751
      dofs[13] = 22;
 
30752
      dofs[14] = 23;
 
30753
      dofs[15] = 24;
 
30754
      dofs[16] = 27;
 
30755
      dofs[17] = 28;
 
30756
        break;
 
30757
      }
 
30758
    case 2:
 
30759
      {
 
30760
        dofs[0] = 0;
 
30761
      dofs[1] = 1;
 
30762
      dofs[2] = 3;
 
30763
      dofs[3] = 5;
 
30764
      dofs[4] = 7;
 
30765
      dofs[5] = 9;
 
30766
      dofs[6] = 10;
 
30767
      dofs[7] = 11;
 
30768
      dofs[8] = 13;
 
30769
      dofs[9] = 15;
 
30770
      dofs[10] = 17;
 
30771
      dofs[11] = 19;
 
30772
      dofs[12] = 20;
 
30773
      dofs[13] = 21;
 
30774
      dofs[14] = 23;
 
30775
      dofs[15] = 25;
 
30776
      dofs[16] = 27;
 
30777
      dofs[17] = 29;
 
30778
        break;
 
30779
      }
 
30780
    case 3:
 
30781
      {
 
30782
        dofs[0] = 0;
 
30783
      dofs[1] = 1;
 
30784
      dofs[2] = 2;
 
30785
      dofs[3] = 6;
 
30786
      dofs[4] = 8;
 
30787
      dofs[5] = 9;
 
30788
      dofs[6] = 10;
 
30789
      dofs[7] = 11;
 
30790
      dofs[8] = 12;
 
30791
      dofs[9] = 16;
 
30792
      dofs[10] = 18;
 
30793
      dofs[11] = 19;
 
30794
      dofs[12] = 20;
 
30795
      dofs[13] = 21;
 
30796
      dofs[14] = 22;
 
30797
      dofs[15] = 26;
 
30798
      dofs[16] = 28;
 
30799
      dofs[17] = 29;
 
30800
        break;
 
30801
      }
 
30802
    }
 
30803
    
 
30804
  }
 
30805
 
 
30806
  /// Tabulate the local-to-local mapping of dofs on entity (d, i)
 
30807
  virtual void tabulate_entity_dofs(unsigned int* dofs,
 
30808
                                    unsigned int d, unsigned int i) const
 
30809
  {
 
30810
    if (d > 3)
 
30811
    {
 
30812
    throw std::runtime_error("d is larger than dimension (3)");
 
30813
    }
 
30814
    
 
30815
    switch (d)
 
30816
    {
 
30817
    case 0:
 
30818
      {
 
30819
        if (i > 3)
 
30820
      {
 
30821
      throw std::runtime_error("i is larger than number of entities (3)");
 
30822
      }
 
30823
      
 
30824
      switch (i)
 
30825
      {
 
30826
      case 0:
 
30827
        {
 
30828
          dofs[0] = 0;
 
30829
        dofs[1] = 10;
 
30830
        dofs[2] = 20;
 
30831
          break;
 
30832
        }
 
30833
      case 1:
 
30834
        {
 
30835
          dofs[0] = 1;
 
30836
        dofs[1] = 11;
 
30837
        dofs[2] = 21;
 
30838
          break;
 
30839
        }
 
30840
      case 2:
 
30841
        {
 
30842
          dofs[0] = 2;
 
30843
        dofs[1] = 12;
 
30844
        dofs[2] = 22;
 
30845
          break;
 
30846
        }
 
30847
      case 3:
 
30848
        {
 
30849
          dofs[0] = 3;
 
30850
        dofs[1] = 13;
 
30851
        dofs[2] = 23;
 
30852
          break;
 
30853
        }
 
30854
      }
 
30855
      
 
30856
        break;
 
30857
      }
 
30858
    case 1:
 
30859
      {
 
30860
        if (i > 5)
 
30861
      {
 
30862
      throw std::runtime_error("i is larger than number of entities (5)");
 
30863
      }
 
30864
      
 
30865
      switch (i)
 
30866
      {
 
30867
      case 0:
 
30868
        {
 
30869
          dofs[0] = 4;
 
30870
        dofs[1] = 14;
 
30871
        dofs[2] = 24;
 
30872
          break;
 
30873
        }
 
30874
      case 1:
 
30875
        {
 
30876
          dofs[0] = 5;
 
30877
        dofs[1] = 15;
 
30878
        dofs[2] = 25;
 
30879
          break;
 
30880
        }
 
30881
      case 2:
 
30882
        {
 
30883
          dofs[0] = 6;
 
30884
        dofs[1] = 16;
 
30885
        dofs[2] = 26;
 
30886
          break;
 
30887
        }
 
30888
      case 3:
 
30889
        {
 
30890
          dofs[0] = 7;
 
30891
        dofs[1] = 17;
 
30892
        dofs[2] = 27;
 
30893
          break;
 
30894
        }
 
30895
      case 4:
 
30896
        {
 
30897
          dofs[0] = 8;
 
30898
        dofs[1] = 18;
 
30899
        dofs[2] = 28;
 
30900
          break;
 
30901
        }
 
30902
      case 5:
 
30903
        {
 
30904
          dofs[0] = 9;
 
30905
        dofs[1] = 19;
 
30906
        dofs[2] = 29;
 
30907
          break;
 
30908
        }
 
30909
      }
 
30910
      
 
30911
        break;
 
30912
      }
 
30913
    case 2:
 
30914
      {
 
30915
        
 
30916
        break;
 
30917
      }
 
30918
    case 3:
 
30919
      {
 
30920
        
 
30921
        break;
 
30922
      }
 
30923
    }
 
30924
    
 
30925
  }
 
30926
 
 
30927
  /// Tabulate the coordinates of all dofs on a cell
 
30928
  virtual void tabulate_coordinates(double** coordinates,
 
30929
                                    const ufc::cell& c) const
 
30930
  {
 
30931
    const double * const * x = c.coordinates;
 
30932
    
 
30933
    coordinates[0][0] = x[0][0];
 
30934
    coordinates[0][1] = x[0][1];
 
30935
    coordinates[0][2] = x[0][2];
 
30936
    coordinates[1][0] = x[1][0];
 
30937
    coordinates[1][1] = x[1][1];
 
30938
    coordinates[1][2] = x[1][2];
 
30939
    coordinates[2][0] = x[2][0];
 
30940
    coordinates[2][1] = x[2][1];
 
30941
    coordinates[2][2] = x[2][2];
 
30942
    coordinates[3][0] = x[3][0];
 
30943
    coordinates[3][1] = x[3][1];
 
30944
    coordinates[3][2] = x[3][2];
 
30945
    coordinates[4][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
30946
    coordinates[4][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
30947
    coordinates[4][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
30948
    coordinates[5][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
30949
    coordinates[5][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
30950
    coordinates[5][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
30951
    coordinates[6][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
30952
    coordinates[6][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
30953
    coordinates[6][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
30954
    coordinates[7][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
30955
    coordinates[7][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
30956
    coordinates[7][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
30957
    coordinates[8][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
30958
    coordinates[8][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
30959
    coordinates[8][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
30960
    coordinates[9][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
30961
    coordinates[9][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
30962
    coordinates[9][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
30963
    coordinates[10][0] = x[0][0];
 
30964
    coordinates[10][1] = x[0][1];
 
30965
    coordinates[10][2] = x[0][2];
 
30966
    coordinates[11][0] = x[1][0];
 
30967
    coordinates[11][1] = x[1][1];
 
30968
    coordinates[11][2] = x[1][2];
 
30969
    coordinates[12][0] = x[2][0];
 
30970
    coordinates[12][1] = x[2][1];
 
30971
    coordinates[12][2] = x[2][2];
 
30972
    coordinates[13][0] = x[3][0];
 
30973
    coordinates[13][1] = x[3][1];
 
30974
    coordinates[13][2] = x[3][2];
 
30975
    coordinates[14][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
30976
    coordinates[14][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
30977
    coordinates[14][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
30978
    coordinates[15][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
30979
    coordinates[15][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
30980
    coordinates[15][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
30981
    coordinates[16][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
30982
    coordinates[16][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
30983
    coordinates[16][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
30984
    coordinates[17][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
30985
    coordinates[17][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
30986
    coordinates[17][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
30987
    coordinates[18][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
30988
    coordinates[18][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
30989
    coordinates[18][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
30990
    coordinates[19][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
30991
    coordinates[19][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
30992
    coordinates[19][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
30993
    coordinates[20][0] = x[0][0];
 
30994
    coordinates[20][1] = x[0][1];
 
30995
    coordinates[20][2] = x[0][2];
 
30996
    coordinates[21][0] = x[1][0];
 
30997
    coordinates[21][1] = x[1][1];
 
30998
    coordinates[21][2] = x[1][2];
 
30999
    coordinates[22][0] = x[2][0];
 
31000
    coordinates[22][1] = x[2][1];
 
31001
    coordinates[22][2] = x[2][2];
 
31002
    coordinates[23][0] = x[3][0];
 
31003
    coordinates[23][1] = x[3][1];
 
31004
    coordinates[23][2] = x[3][2];
 
31005
    coordinates[24][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
31006
    coordinates[24][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
31007
    coordinates[24][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
31008
    coordinates[25][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
31009
    coordinates[25][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
31010
    coordinates[25][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
31011
    coordinates[26][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
31012
    coordinates[26][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
31013
    coordinates[26][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
31014
    coordinates[27][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
31015
    coordinates[27][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
31016
    coordinates[27][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
31017
    coordinates[28][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
31018
    coordinates[28][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
31019
    coordinates[28][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
31020
    coordinates[29][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
31021
    coordinates[29][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
31022
    coordinates[29][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
31023
  }
 
31024
 
 
31025
  /// Return the number of sub dofmaps (for a mixed element)
 
31026
  virtual unsigned int num_sub_dofmaps() const
 
31027
  {
 
31028
    return 3;
 
31029
  }
 
31030
 
 
31031
  /// Create a new dofmap for sub dofmap i (for a mixed element)
 
31032
  virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const
 
31033
  {
 
31034
    switch (i)
 
31035
    {
 
31036
    case 0:
 
31037
      {
 
31038
        return new stokes_dofmap_0();
 
31039
        break;
 
31040
      }
 
31041
    case 1:
 
31042
      {
 
31043
        return new stokes_dofmap_0();
 
31044
        break;
 
31045
      }
 
31046
    case 2:
 
31047
      {
 
31048
        return new stokes_dofmap_0();
 
31049
        break;
 
31050
      }
 
31051
    }
 
31052
    
 
31053
    return 0;
 
31054
  }
 
31055
 
 
31056
  /// Create a new class instance
 
31057
  virtual ufc::dofmap* create() const
 
31058
  {
 
31059
    return new stokes_dofmap_1();
 
31060
  }
 
31061
 
 
31062
};
 
31063
 
 
31064
/// This class defines the interface for a local-to-global mapping of
 
31065
/// degrees of freedom (dofs).
 
31066
 
 
31067
class stokes_dofmap_2: public ufc::dofmap
 
31068
{
 
31069
private:
 
31070
 
 
31071
  unsigned int _global_dimension;
 
31072
public:
 
31073
 
 
31074
  /// Constructor
 
31075
  stokes_dofmap_2() : ufc::dofmap()
 
31076
  {
 
31077
    _global_dimension = 0;
 
31078
  }
 
31079
 
 
31080
  /// Destructor
 
31081
  virtual ~stokes_dofmap_2()
 
31082
  {
 
31083
    // Do nothing
 
31084
  }
 
31085
 
 
31086
  /// Return a string identifying the dofmap
 
31087
  virtual const char* signature() const
 
31088
  {
 
31089
    return "FFC dofmap for FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)";
 
31090
  }
 
31091
 
 
31092
  /// Return true iff mesh entities of topological dimension d are needed
 
31093
  virtual bool needs_mesh_entities(unsigned int d) const
 
31094
  {
 
31095
    switch (d)
 
31096
    {
 
31097
    case 0:
 
31098
      {
 
31099
        return true;
 
31100
        break;
 
31101
      }
 
31102
    case 1:
 
31103
      {
 
31104
        return false;
 
31105
        break;
 
31106
      }
 
31107
    case 2:
 
31108
      {
 
31109
        return false;
 
31110
        break;
 
31111
      }
 
31112
    case 3:
 
31113
      {
 
31114
        return false;
 
31115
        break;
 
31116
      }
 
31117
    }
 
31118
    
 
31119
    return false;
 
31120
  }
 
31121
 
 
31122
  /// Initialize dofmap for mesh (return true iff init_cell() is needed)
 
31123
  virtual bool init_mesh(const ufc::mesh& m)
 
31124
  {
 
31125
    _global_dimension = m.num_entities[0];
 
31126
    return false;
 
31127
  }
 
31128
 
 
31129
  /// Initialize dofmap for given cell
 
31130
  virtual void init_cell(const ufc::mesh& m,
 
31131
                         const ufc::cell& c)
 
31132
  {
 
31133
    // Do nothing
 
31134
  }
 
31135
 
 
31136
  /// Finish initialization of dofmap for cells
 
31137
  virtual void init_cell_finalize()
 
31138
  {
 
31139
    // Do nothing
 
31140
  }
 
31141
 
 
31142
  /// Return the topological dimension of the associated cell shape
 
31143
  virtual unsigned int topological_dimension() const
 
31144
  {
 
31145
    return 3;
 
31146
  }
 
31147
 
 
31148
  /// Return the geometric dimension of the associated cell shape
 
31149
  virtual unsigned int geometric_dimension() const
 
31150
  {
 
31151
    return 3;
 
31152
  }
 
31153
 
 
31154
  /// Return the dimension of the global finite element function space
 
31155
  virtual unsigned int global_dimension() const
 
31156
  {
 
31157
    return _global_dimension;
 
31158
  }
 
31159
 
 
31160
  /// Return the dimension of the local finite element function space for a cell
 
31161
  virtual unsigned int local_dimension(const ufc::cell& c) const
 
31162
  {
 
31163
    return 4;
 
31164
  }
 
31165
 
 
31166
  /// Return the maximum dimension of the local finite element function space
 
31167
  virtual unsigned int max_local_dimension() const
 
31168
  {
 
31169
    return 4;
 
31170
  }
 
31171
 
 
31172
  /// Return the number of dofs on each cell facet
 
31173
  virtual unsigned int num_facet_dofs() const
 
31174
  {
 
31175
    return 3;
 
31176
  }
 
31177
 
 
31178
  /// Return the number of dofs associated with each cell entity of dimension d
 
31179
  virtual unsigned int num_entity_dofs(unsigned int d) const
 
31180
  {
 
31181
    switch (d)
 
31182
    {
 
31183
    case 0:
 
31184
      {
 
31185
        return 1;
 
31186
        break;
 
31187
      }
 
31188
    case 1:
 
31189
      {
 
31190
        return 0;
 
31191
        break;
 
31192
      }
 
31193
    case 2:
 
31194
      {
 
31195
        return 0;
 
31196
        break;
 
31197
      }
 
31198
    case 3:
 
31199
      {
 
31200
        return 0;
 
31201
        break;
 
31202
      }
 
31203
    }
 
31204
    
 
31205
    return 0;
 
31206
  }
 
31207
 
 
31208
  /// Tabulate the local-to-global mapping of dofs on a cell
 
31209
  virtual void tabulate_dofs(unsigned int* dofs,
 
31210
                             const ufc::mesh& m,
 
31211
                             const ufc::cell& c) const
 
31212
  {
 
31213
    dofs[0] = c.entity_indices[0][0];
 
31214
    dofs[1] = c.entity_indices[0][1];
 
31215
    dofs[2] = c.entity_indices[0][2];
 
31216
    dofs[3] = c.entity_indices[0][3];
 
31217
  }
 
31218
 
 
31219
  /// Tabulate the local-to-local mapping from facet dofs to cell dofs
 
31220
  virtual void tabulate_facet_dofs(unsigned int* dofs,
 
31221
                                   unsigned int facet) const
 
31222
  {
 
31223
    switch (facet)
 
31224
    {
 
31225
    case 0:
 
31226
      {
 
31227
        dofs[0] = 1;
 
31228
      dofs[1] = 2;
 
31229
      dofs[2] = 3;
 
31230
        break;
 
31231
      }
 
31232
    case 1:
 
31233
      {
 
31234
        dofs[0] = 0;
 
31235
      dofs[1] = 2;
 
31236
      dofs[2] = 3;
 
31237
        break;
 
31238
      }
 
31239
    case 2:
 
31240
      {
 
31241
        dofs[0] = 0;
 
31242
      dofs[1] = 1;
 
31243
      dofs[2] = 3;
 
31244
        break;
 
31245
      }
 
31246
    case 3:
 
31247
      {
 
31248
        dofs[0] = 0;
 
31249
      dofs[1] = 1;
 
31250
      dofs[2] = 2;
 
31251
        break;
 
31252
      }
 
31253
    }
 
31254
    
 
31255
  }
 
31256
 
 
31257
  /// Tabulate the local-to-local mapping of dofs on entity (d, i)
 
31258
  virtual void tabulate_entity_dofs(unsigned int* dofs,
 
31259
                                    unsigned int d, unsigned int i) const
 
31260
  {
 
31261
    if (d > 3)
 
31262
    {
 
31263
    throw std::runtime_error("d is larger than dimension (3)");
 
31264
    }
 
31265
    
 
31266
    switch (d)
 
31267
    {
 
31268
    case 0:
 
31269
      {
 
31270
        if (i > 3)
 
31271
      {
 
31272
      throw std::runtime_error("i is larger than number of entities (3)");
 
31273
      }
 
31274
      
 
31275
      switch (i)
 
31276
      {
 
31277
      case 0:
 
31278
        {
 
31279
          dofs[0] = 0;
 
31280
          break;
 
31281
        }
 
31282
      case 1:
 
31283
        {
 
31284
          dofs[0] = 1;
 
31285
          break;
 
31286
        }
 
31287
      case 2:
 
31288
        {
 
31289
          dofs[0] = 2;
 
31290
          break;
 
31291
        }
 
31292
      case 3:
 
31293
        {
 
31294
          dofs[0] = 3;
 
31295
          break;
 
31296
        }
 
31297
      }
 
31298
      
 
31299
        break;
 
31300
      }
 
31301
    case 1:
 
31302
      {
 
31303
        
 
31304
        break;
 
31305
      }
 
31306
    case 2:
 
31307
      {
 
31308
        
 
31309
        break;
 
31310
      }
 
31311
    case 3:
 
31312
      {
 
31313
        
 
31314
        break;
 
31315
      }
 
31316
    }
 
31317
    
 
31318
  }
 
31319
 
 
31320
  /// Tabulate the coordinates of all dofs on a cell
 
31321
  virtual void tabulate_coordinates(double** coordinates,
 
31322
                                    const ufc::cell& c) const
 
31323
  {
 
31324
    const double * const * x = c.coordinates;
 
31325
    
 
31326
    coordinates[0][0] = x[0][0];
 
31327
    coordinates[0][1] = x[0][1];
 
31328
    coordinates[0][2] = x[0][2];
 
31329
    coordinates[1][0] = x[1][0];
 
31330
    coordinates[1][1] = x[1][1];
 
31331
    coordinates[1][2] = x[1][2];
 
31332
    coordinates[2][0] = x[2][0];
 
31333
    coordinates[2][1] = x[2][1];
 
31334
    coordinates[2][2] = x[2][2];
 
31335
    coordinates[3][0] = x[3][0];
 
31336
    coordinates[3][1] = x[3][1];
 
31337
    coordinates[3][2] = x[3][2];
 
31338
  }
 
31339
 
 
31340
  /// Return the number of sub dofmaps (for a mixed element)
 
31341
  virtual unsigned int num_sub_dofmaps() const
 
31342
  {
 
31343
    return 0;
 
31344
  }
 
31345
 
 
31346
  /// Create a new dofmap for sub dofmap i (for a mixed element)
 
31347
  virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const
 
31348
  {
 
31349
    return 0;
 
31350
  }
 
31351
 
 
31352
  /// Create a new class instance
 
31353
  virtual ufc::dofmap* create() const
 
31354
  {
 
31355
    return new stokes_dofmap_2();
 
31356
  }
 
31357
 
 
31358
};
 
31359
 
 
31360
/// This class defines the interface for a local-to-global mapping of
 
31361
/// degrees of freedom (dofs).
 
31362
 
 
31363
class stokes_dofmap_3: public ufc::dofmap
 
31364
{
 
31365
private:
 
31366
 
 
31367
  unsigned int _global_dimension;
 
31368
public:
 
31369
 
 
31370
  /// Constructor
 
31371
  stokes_dofmap_3() : ufc::dofmap()
 
31372
  {
 
31373
    _global_dimension = 0;
 
31374
  }
 
31375
 
 
31376
  /// Destructor
 
31377
  virtual ~stokes_dofmap_3()
 
31378
  {
 
31379
    // Do nothing
 
31380
  }
 
31381
 
 
31382
  /// Return a string identifying the dofmap
 
31383
  virtual const char* signature() const
 
31384
  {
 
31385
    return "FFC dofmap for MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) })";
 
31386
  }
 
31387
 
 
31388
  /// Return true iff mesh entities of topological dimension d are needed
 
31389
  virtual bool needs_mesh_entities(unsigned int d) const
 
31390
  {
 
31391
    switch (d)
 
31392
    {
 
31393
    case 0:
 
31394
      {
 
31395
        return true;
 
31396
        break;
 
31397
      }
 
31398
    case 1:
 
31399
      {
 
31400
        return true;
 
31401
        break;
 
31402
      }
 
31403
    case 2:
 
31404
      {
 
31405
        return false;
 
31406
        break;
 
31407
      }
 
31408
    case 3:
 
31409
      {
 
31410
        return false;
 
31411
        break;
 
31412
      }
 
31413
    }
 
31414
    
 
31415
    return false;
 
31416
  }
 
31417
 
 
31418
  /// Initialize dofmap for mesh (return true iff init_cell() is needed)
 
31419
  virtual bool init_mesh(const ufc::mesh& m)
 
31420
  {
 
31421
    _global_dimension = 4.000000000000000*m.num_entities[0] + 3.000000000000000*m.num_entities[1];
 
31422
    return false;
 
31423
  }
 
31424
 
 
31425
  /// Initialize dofmap for given cell
 
31426
  virtual void init_cell(const ufc::mesh& m,
 
31427
                         const ufc::cell& c)
 
31428
  {
 
31429
    // Do nothing
 
31430
  }
 
31431
 
 
31432
  /// Finish initialization of dofmap for cells
 
31433
  virtual void init_cell_finalize()
 
31434
  {
 
31435
    // Do nothing
 
31436
  }
 
31437
 
 
31438
  /// Return the topological dimension of the associated cell shape
 
31439
  virtual unsigned int topological_dimension() const
 
31440
  {
 
31441
    return 3;
 
31442
  }
 
31443
 
 
31444
  /// Return the geometric dimension of the associated cell shape
 
31445
  virtual unsigned int geometric_dimension() const
 
31446
  {
 
31447
    return 3;
 
31448
  }
 
31449
 
 
31450
  /// Return the dimension of the global finite element function space
 
31451
  virtual unsigned int global_dimension() const
 
31452
  {
 
31453
    return _global_dimension;
 
31454
  }
 
31455
 
 
31456
  /// Return the dimension of the local finite element function space for a cell
 
31457
  virtual unsigned int local_dimension(const ufc::cell& c) const
 
31458
  {
 
31459
    return 34;
 
31460
  }
 
31461
 
 
31462
  /// Return the maximum dimension of the local finite element function space
 
31463
  virtual unsigned int max_local_dimension() const
 
31464
  {
 
31465
    return 34;
 
31466
  }
 
31467
 
 
31468
  /// Return the number of dofs on each cell facet
 
31469
  virtual unsigned int num_facet_dofs() const
 
31470
  {
 
31471
    return 21;
 
31472
  }
 
31473
 
 
31474
  /// Return the number of dofs associated with each cell entity of dimension d
 
31475
  virtual unsigned int num_entity_dofs(unsigned int d) const
 
31476
  {
 
31477
    switch (d)
 
31478
    {
 
31479
    case 0:
 
31480
      {
 
31481
        return 4;
 
31482
        break;
 
31483
      }
 
31484
    case 1:
 
31485
      {
 
31486
        return 3;
 
31487
        break;
 
31488
      }
 
31489
    case 2:
 
31490
      {
 
31491
        return 0;
 
31492
        break;
 
31493
      }
 
31494
    case 3:
 
31495
      {
 
31496
        return 0;
 
31497
        break;
 
31498
      }
 
31499
    }
 
31500
    
 
31501
    return 0;
 
31502
  }
 
31503
 
 
31504
  /// Tabulate the local-to-global mapping of dofs on a cell
 
31505
  virtual void tabulate_dofs(unsigned int* dofs,
 
31506
                             const ufc::mesh& m,
 
31507
                             const ufc::cell& c) const
 
31508
  {
 
31509
    unsigned int offset = 0;
 
31510
    dofs[0] = offset + c.entity_indices[0][0];
 
31511
    dofs[1] = offset + c.entity_indices[0][1];
 
31512
    dofs[2] = offset + c.entity_indices[0][2];
 
31513
    dofs[3] = offset + c.entity_indices[0][3];
 
31514
    offset += m.num_entities[0];
 
31515
    dofs[4] = offset + c.entity_indices[1][0];
 
31516
    dofs[5] = offset + c.entity_indices[1][1];
 
31517
    dofs[6] = offset + c.entity_indices[1][2];
 
31518
    dofs[7] = offset + c.entity_indices[1][3];
 
31519
    dofs[8] = offset + c.entity_indices[1][4];
 
31520
    dofs[9] = offset + c.entity_indices[1][5];
 
31521
    offset += m.num_entities[1];
 
31522
    dofs[10] = offset + c.entity_indices[0][0];
 
31523
    dofs[11] = offset + c.entity_indices[0][1];
 
31524
    dofs[12] = offset + c.entity_indices[0][2];
 
31525
    dofs[13] = offset + c.entity_indices[0][3];
 
31526
    offset += m.num_entities[0];
 
31527
    dofs[14] = offset + c.entity_indices[1][0];
 
31528
    dofs[15] = offset + c.entity_indices[1][1];
 
31529
    dofs[16] = offset + c.entity_indices[1][2];
 
31530
    dofs[17] = offset + c.entity_indices[1][3];
 
31531
    dofs[18] = offset + c.entity_indices[1][4];
 
31532
    dofs[19] = offset + c.entity_indices[1][5];
 
31533
    offset += m.num_entities[1];
 
31534
    dofs[20] = offset + c.entity_indices[0][0];
 
31535
    dofs[21] = offset + c.entity_indices[0][1];
 
31536
    dofs[22] = offset + c.entity_indices[0][2];
 
31537
    dofs[23] = offset + c.entity_indices[0][3];
 
31538
    offset += m.num_entities[0];
 
31539
    dofs[24] = offset + c.entity_indices[1][0];
 
31540
    dofs[25] = offset + c.entity_indices[1][1];
 
31541
    dofs[26] = offset + c.entity_indices[1][2];
 
31542
    dofs[27] = offset + c.entity_indices[1][3];
 
31543
    dofs[28] = offset + c.entity_indices[1][4];
 
31544
    dofs[29] = offset + c.entity_indices[1][5];
 
31545
    offset += m.num_entities[1];
 
31546
    dofs[30] = offset + c.entity_indices[0][0];
 
31547
    dofs[31] = offset + c.entity_indices[0][1];
 
31548
    dofs[32] = offset + c.entity_indices[0][2];
 
31549
    dofs[33] = offset + c.entity_indices[0][3];
 
31550
    offset += m.num_entities[0];
 
31551
  }
 
31552
 
 
31553
  /// Tabulate the local-to-local mapping from facet dofs to cell dofs
 
31554
  virtual void tabulate_facet_dofs(unsigned int* dofs,
 
31555
                                   unsigned int facet) const
 
31556
  {
 
31557
    switch (facet)
 
31558
    {
 
31559
    case 0:
 
31560
      {
 
31561
        dofs[0] = 1;
 
31562
      dofs[1] = 2;
 
31563
      dofs[2] = 3;
 
31564
      dofs[3] = 4;
 
31565
      dofs[4] = 5;
 
31566
      dofs[5] = 6;
 
31567
      dofs[6] = 11;
 
31568
      dofs[7] = 12;
 
31569
      dofs[8] = 13;
 
31570
      dofs[9] = 14;
 
31571
      dofs[10] = 15;
 
31572
      dofs[11] = 16;
 
31573
      dofs[12] = 21;
 
31574
      dofs[13] = 22;
 
31575
      dofs[14] = 23;
 
31576
      dofs[15] = 24;
 
31577
      dofs[16] = 25;
 
31578
      dofs[17] = 26;
 
31579
      dofs[18] = 31;
 
31580
      dofs[19] = 32;
 
31581
      dofs[20] = 33;
 
31582
        break;
 
31583
      }
 
31584
    case 1:
 
31585
      {
 
31586
        dofs[0] = 0;
 
31587
      dofs[1] = 2;
 
31588
      dofs[2] = 3;
 
31589
      dofs[3] = 4;
 
31590
      dofs[4] = 7;
 
31591
      dofs[5] = 8;
 
31592
      dofs[6] = 10;
 
31593
      dofs[7] = 12;
 
31594
      dofs[8] = 13;
 
31595
      dofs[9] = 14;
 
31596
      dofs[10] = 17;
 
31597
      dofs[11] = 18;
 
31598
      dofs[12] = 20;
 
31599
      dofs[13] = 22;
 
31600
      dofs[14] = 23;
 
31601
      dofs[15] = 24;
 
31602
      dofs[16] = 27;
 
31603
      dofs[17] = 28;
 
31604
      dofs[18] = 30;
 
31605
      dofs[19] = 32;
 
31606
      dofs[20] = 33;
 
31607
        break;
 
31608
      }
 
31609
    case 2:
 
31610
      {
 
31611
        dofs[0] = 0;
 
31612
      dofs[1] = 1;
 
31613
      dofs[2] = 3;
 
31614
      dofs[3] = 5;
 
31615
      dofs[4] = 7;
 
31616
      dofs[5] = 9;
 
31617
      dofs[6] = 10;
 
31618
      dofs[7] = 11;
 
31619
      dofs[8] = 13;
 
31620
      dofs[9] = 15;
 
31621
      dofs[10] = 17;
 
31622
      dofs[11] = 19;
 
31623
      dofs[12] = 20;
 
31624
      dofs[13] = 21;
 
31625
      dofs[14] = 23;
 
31626
      dofs[15] = 25;
 
31627
      dofs[16] = 27;
 
31628
      dofs[17] = 29;
 
31629
      dofs[18] = 30;
 
31630
      dofs[19] = 31;
 
31631
      dofs[20] = 33;
 
31632
        break;
 
31633
      }
 
31634
    case 3:
 
31635
      {
 
31636
        dofs[0] = 0;
 
31637
      dofs[1] = 1;
 
31638
      dofs[2] = 2;
 
31639
      dofs[3] = 6;
 
31640
      dofs[4] = 8;
 
31641
      dofs[5] = 9;
 
31642
      dofs[6] = 10;
 
31643
      dofs[7] = 11;
 
31644
      dofs[8] = 12;
 
31645
      dofs[9] = 16;
 
31646
      dofs[10] = 18;
 
31647
      dofs[11] = 19;
 
31648
      dofs[12] = 20;
 
31649
      dofs[13] = 21;
 
31650
      dofs[14] = 22;
 
31651
      dofs[15] = 26;
 
31652
      dofs[16] = 28;
 
31653
      dofs[17] = 29;
 
31654
      dofs[18] = 30;
 
31655
      dofs[19] = 31;
 
31656
      dofs[20] = 32;
 
31657
        break;
 
31658
      }
 
31659
    }
 
31660
    
 
31661
  }
 
31662
 
 
31663
  /// Tabulate the local-to-local mapping of dofs on entity (d, i)
 
31664
  virtual void tabulate_entity_dofs(unsigned int* dofs,
 
31665
                                    unsigned int d, unsigned int i) const
 
31666
  {
 
31667
    if (d > 3)
 
31668
    {
 
31669
    throw std::runtime_error("d is larger than dimension (3)");
 
31670
    }
 
31671
    
 
31672
    switch (d)
 
31673
    {
 
31674
    case 0:
 
31675
      {
 
31676
        if (i > 3)
 
31677
      {
 
31678
      throw std::runtime_error("i is larger than number of entities (3)");
 
31679
      }
 
31680
      
 
31681
      switch (i)
 
31682
      {
 
31683
      case 0:
 
31684
        {
 
31685
          dofs[0] = 0;
 
31686
        dofs[1] = 10;
 
31687
        dofs[2] = 20;
 
31688
        dofs[3] = 30;
 
31689
          break;
 
31690
        }
 
31691
      case 1:
 
31692
        {
 
31693
          dofs[0] = 1;
 
31694
        dofs[1] = 11;
 
31695
        dofs[2] = 21;
 
31696
        dofs[3] = 31;
 
31697
          break;
 
31698
        }
 
31699
      case 2:
 
31700
        {
 
31701
          dofs[0] = 2;
 
31702
        dofs[1] = 12;
 
31703
        dofs[2] = 22;
 
31704
        dofs[3] = 32;
 
31705
          break;
 
31706
        }
 
31707
      case 3:
 
31708
        {
 
31709
          dofs[0] = 3;
 
31710
        dofs[1] = 13;
 
31711
        dofs[2] = 23;
 
31712
        dofs[3] = 33;
 
31713
          break;
 
31714
        }
 
31715
      }
 
31716
      
 
31717
        break;
 
31718
      }
 
31719
    case 1:
 
31720
      {
 
31721
        if (i > 5)
 
31722
      {
 
31723
      throw std::runtime_error("i is larger than number of entities (5)");
 
31724
      }
 
31725
      
 
31726
      switch (i)
 
31727
      {
 
31728
      case 0:
 
31729
        {
 
31730
          dofs[0] = 4;
 
31731
        dofs[1] = 14;
 
31732
        dofs[2] = 24;
 
31733
          break;
 
31734
        }
 
31735
      case 1:
 
31736
        {
 
31737
          dofs[0] = 5;
 
31738
        dofs[1] = 15;
 
31739
        dofs[2] = 25;
 
31740
          break;
 
31741
        }
 
31742
      case 2:
 
31743
        {
 
31744
          dofs[0] = 6;
 
31745
        dofs[1] = 16;
 
31746
        dofs[2] = 26;
 
31747
          break;
 
31748
        }
 
31749
      case 3:
 
31750
        {
 
31751
          dofs[0] = 7;
 
31752
        dofs[1] = 17;
 
31753
        dofs[2] = 27;
 
31754
          break;
 
31755
        }
 
31756
      case 4:
 
31757
        {
 
31758
          dofs[0] = 8;
 
31759
        dofs[1] = 18;
 
31760
        dofs[2] = 28;
 
31761
          break;
 
31762
        }
 
31763
      case 5:
 
31764
        {
 
31765
          dofs[0] = 9;
 
31766
        dofs[1] = 19;
 
31767
        dofs[2] = 29;
 
31768
          break;
 
31769
        }
 
31770
      }
 
31771
      
 
31772
        break;
 
31773
      }
 
31774
    case 2:
 
31775
      {
 
31776
        
 
31777
        break;
 
31778
      }
 
31779
    case 3:
 
31780
      {
 
31781
        
 
31782
        break;
 
31783
      }
 
31784
    }
 
31785
    
 
31786
  }
 
31787
 
 
31788
  /// Tabulate the coordinates of all dofs on a cell
 
31789
  virtual void tabulate_coordinates(double** coordinates,
 
31790
                                    const ufc::cell& c) const
 
31791
  {
 
31792
    const double * const * x = c.coordinates;
 
31793
    
 
31794
    coordinates[0][0] = x[0][0];
 
31795
    coordinates[0][1] = x[0][1];
 
31796
    coordinates[0][2] = x[0][2];
 
31797
    coordinates[1][0] = x[1][0];
 
31798
    coordinates[1][1] = x[1][1];
 
31799
    coordinates[1][2] = x[1][2];
 
31800
    coordinates[2][0] = x[2][0];
 
31801
    coordinates[2][1] = x[2][1];
 
31802
    coordinates[2][2] = x[2][2];
 
31803
    coordinates[3][0] = x[3][0];
 
31804
    coordinates[3][1] = x[3][1];
 
31805
    coordinates[3][2] = x[3][2];
 
31806
    coordinates[4][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
31807
    coordinates[4][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
31808
    coordinates[4][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
31809
    coordinates[5][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
31810
    coordinates[5][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
31811
    coordinates[5][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
31812
    coordinates[6][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
31813
    coordinates[6][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
31814
    coordinates[6][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
31815
    coordinates[7][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
31816
    coordinates[7][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
31817
    coordinates[7][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
31818
    coordinates[8][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
31819
    coordinates[8][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
31820
    coordinates[8][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
31821
    coordinates[9][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
31822
    coordinates[9][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
31823
    coordinates[9][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
31824
    coordinates[10][0] = x[0][0];
 
31825
    coordinates[10][1] = x[0][1];
 
31826
    coordinates[10][2] = x[0][2];
 
31827
    coordinates[11][0] = x[1][0];
 
31828
    coordinates[11][1] = x[1][1];
 
31829
    coordinates[11][2] = x[1][2];
 
31830
    coordinates[12][0] = x[2][0];
 
31831
    coordinates[12][1] = x[2][1];
 
31832
    coordinates[12][2] = x[2][2];
 
31833
    coordinates[13][0] = x[3][0];
 
31834
    coordinates[13][1] = x[3][1];
 
31835
    coordinates[13][2] = x[3][2];
 
31836
    coordinates[14][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
31837
    coordinates[14][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
31838
    coordinates[14][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
31839
    coordinates[15][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
31840
    coordinates[15][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
31841
    coordinates[15][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
31842
    coordinates[16][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
31843
    coordinates[16][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
31844
    coordinates[16][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
31845
    coordinates[17][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
31846
    coordinates[17][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
31847
    coordinates[17][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
31848
    coordinates[18][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
31849
    coordinates[18][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
31850
    coordinates[18][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
31851
    coordinates[19][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
31852
    coordinates[19][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
31853
    coordinates[19][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
31854
    coordinates[20][0] = x[0][0];
 
31855
    coordinates[20][1] = x[0][1];
 
31856
    coordinates[20][2] = x[0][2];
 
31857
    coordinates[21][0] = x[1][0];
 
31858
    coordinates[21][1] = x[1][1];
 
31859
    coordinates[21][2] = x[1][2];
 
31860
    coordinates[22][0] = x[2][0];
 
31861
    coordinates[22][1] = x[2][1];
 
31862
    coordinates[22][2] = x[2][2];
 
31863
    coordinates[23][0] = x[3][0];
 
31864
    coordinates[23][1] = x[3][1];
 
31865
    coordinates[23][2] = x[3][2];
 
31866
    coordinates[24][0] = 0.500000000000000*x[2][0] + 0.500000000000000*x[3][0];
 
31867
    coordinates[24][1] = 0.500000000000000*x[2][1] + 0.500000000000000*x[3][1];
 
31868
    coordinates[24][2] = 0.500000000000000*x[2][2] + 0.500000000000000*x[3][2];
 
31869
    coordinates[25][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[3][0];
 
31870
    coordinates[25][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[3][1];
 
31871
    coordinates[25][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[3][2];
 
31872
    coordinates[26][0] = 0.500000000000000*x[1][0] + 0.500000000000000*x[2][0];
 
31873
    coordinates[26][1] = 0.500000000000000*x[1][1] + 0.500000000000000*x[2][1];
 
31874
    coordinates[26][2] = 0.500000000000000*x[1][2] + 0.500000000000000*x[2][2];
 
31875
    coordinates[27][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[3][0];
 
31876
    coordinates[27][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[3][1];
 
31877
    coordinates[27][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[3][2];
 
31878
    coordinates[28][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[2][0];
 
31879
    coordinates[28][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[2][1];
 
31880
    coordinates[28][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[2][2];
 
31881
    coordinates[29][0] = 0.500000000000000*x[0][0] + 0.500000000000000*x[1][0];
 
31882
    coordinates[29][1] = 0.500000000000000*x[0][1] + 0.500000000000000*x[1][1];
 
31883
    coordinates[29][2] = 0.500000000000000*x[0][2] + 0.500000000000000*x[1][2];
 
31884
    coordinates[30][0] = x[0][0];
 
31885
    coordinates[30][1] = x[0][1];
 
31886
    coordinates[30][2] = x[0][2];
 
31887
    coordinates[31][0] = x[1][0];
 
31888
    coordinates[31][1] = x[1][1];
 
31889
    coordinates[31][2] = x[1][2];
 
31890
    coordinates[32][0] = x[2][0];
 
31891
    coordinates[32][1] = x[2][1];
 
31892
    coordinates[32][2] = x[2][2];
 
31893
    coordinates[33][0] = x[3][0];
 
31894
    coordinates[33][1] = x[3][1];
 
31895
    coordinates[33][2] = x[3][2];
 
31896
  }
 
31897
 
 
31898
  /// Return the number of sub dofmaps (for a mixed element)
 
31899
  virtual unsigned int num_sub_dofmaps() const
 
31900
  {
 
31901
    return 2;
 
31902
  }
 
31903
 
 
31904
  /// Create a new dofmap for sub dofmap i (for a mixed element)
 
31905
  virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const
 
31906
  {
 
31907
    switch (i)
 
31908
    {
 
31909
    case 0:
 
31910
      {
 
31911
        return new stokes_dofmap_1();
 
31912
        break;
 
31913
      }
 
31914
    case 1:
 
31915
      {
 
31916
        return new stokes_dofmap_2();
 
31917
        break;
 
31918
      }
 
31919
    }
 
31920
    
 
31921
    return 0;
 
31922
  }
 
31923
 
 
31924
  /// Create a new class instance
 
31925
  virtual ufc::dofmap* create() const
 
31926
  {
 
31927
    return new stokes_dofmap_3();
 
31928
  }
 
31929
 
 
31930
};
 
31931
 
 
31932
/// This class defines the interface for the tabulation of the cell
 
31933
/// tensor corresponding to the local contribution to a form from
 
31934
/// the integral over a cell.
 
31935
 
 
31936
class stokes_cell_integral_0_0: public ufc::cell_integral
 
31937
{
 
31938
public:
 
31939
 
 
31940
  /// Constructor
 
31941
  stokes_cell_integral_0_0() : ufc::cell_integral()
 
31942
  {
 
31943
    // Do nothing
 
31944
  }
 
31945
 
 
31946
  /// Destructor
 
31947
  virtual ~stokes_cell_integral_0_0()
 
31948
  {
 
31949
    // Do nothing
 
31950
  }
 
31951
 
 
31952
  /// Tabulate the tensor for the contribution from a local cell
 
31953
  virtual void tabulate_tensor(double* A,
 
31954
                               const double * const * w,
 
31955
                               const ufc::cell& c) const
 
31956
  {
 
31957
    // Number of operations (multiply-add pairs) for Jacobian data:      32
 
31958
    // Number of operations (multiply-add pairs) for geometry tensor:    139
 
31959
    // Number of operations (multiply-add pairs) for tensor contraction: 3627
 
31960
    // Total number of operations (multiply-add pairs):                  3798
 
31961
    
 
31962
    // Extract vertex coordinates
 
31963
    const double * const * x = c.coordinates;
 
31964
    
 
31965
    // Compute Jacobian of affine map from reference cell
 
31966
    const double J_00 = x[1][0] - x[0][0];
 
31967
    const double J_01 = x[2][0] - x[0][0];
 
31968
    const double J_02 = x[3][0] - x[0][0];
 
31969
    const double J_10 = x[1][1] - x[0][1];
 
31970
    const double J_11 = x[2][1] - x[0][1];
 
31971
    const double J_12 = x[3][1] - x[0][1];
 
31972
    const double J_20 = x[1][2] - x[0][2];
 
31973
    const double J_21 = x[2][2] - x[0][2];
 
31974
    const double J_22 = x[3][2] - x[0][2];
 
31975
    
 
31976
    // Compute sub determinants
 
31977
    const double d_00 = J_11*J_22 - J_12*J_21;
 
31978
    const double d_01 = J_12*J_20 - J_10*J_22;
 
31979
    const double d_02 = J_10*J_21 - J_11*J_20;
 
31980
    const double d_10 = J_02*J_21 - J_01*J_22;
 
31981
    const double d_11 = J_00*J_22 - J_02*J_20;
 
31982
    const double d_12 = J_01*J_20 - J_00*J_21;
 
31983
    const double d_20 = J_01*J_12 - J_02*J_11;
 
31984
    const double d_21 = J_02*J_10 - J_00*J_12;
 
31985
    const double d_22 = J_00*J_11 - J_01*J_10;
 
31986
    
 
31987
    // Compute determinant of Jacobian
 
31988
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
31989
    
 
31990
    // Compute inverse of Jacobian
 
31991
    const double K_00 = d_00 / detJ;
 
31992
    const double K_01 = d_10 / detJ;
 
31993
    const double K_02 = d_20 / detJ;
 
31994
    const double K_10 = d_01 / detJ;
 
31995
    const double K_11 = d_11 / detJ;
 
31996
    const double K_12 = d_21 / detJ;
 
31997
    const double K_20 = d_02 / detJ;
 
31998
    const double K_21 = d_12 / detJ;
 
31999
    const double K_22 = d_22 / detJ;
 
32000
    
 
32001
    // Set scale factor
 
32002
    const double det = std::abs(detJ);
 
32003
    
 
32004
    // Compute geometry tensor
 
32005
    const double G0_0 = det*K_02*(1.0);
 
32006
    const double G0_1 = det*K_12*(1.0);
 
32007
    const double G0_2 = det*K_22*(1.0);
 
32008
    const double G1_0 = det*K_00*(1.0);
 
32009
    const double G1_1 = det*K_10*(1.0);
 
32010
    const double G1_2 = det*K_20*(1.0);
 
32011
    const double G2_0 = det*K_01*(1.0);
 
32012
    const double G2_1 = det*K_11*(1.0);
 
32013
    const double G2_2 = det*K_21*(1.0);
 
32014
    const double G3_0 = det*K_02*(1.0);
 
32015
    const double G3_1 = det*K_12*(1.0);
 
32016
    const double G3_2 = det*K_22*(1.0);
 
32017
    const double G4_0 = det*K_00*(1.0);
 
32018
    const double G4_1 = det*K_10*(1.0);
 
32019
    const double G4_2 = det*K_20*(1.0);
 
32020
    const double G5_0 = det*K_01*(1.0);
 
32021
    const double G5_1 = det*K_11*(1.0);
 
32022
    const double G5_2 = det*K_21*(1.0);
 
32023
    const double G6_0_0 = det*K_02*K_02*(1.0);
 
32024
    const double G6_0_1 = det*K_02*K_12*(1.0);
 
32025
    const double G6_0_2 = det*K_02*K_22*(1.0);
 
32026
    const double G6_1_0 = det*K_12*K_02*(1.0);
 
32027
    const double G6_1_1 = det*K_12*K_12*(1.0);
 
32028
    const double G6_1_2 = det*K_12*K_22*(1.0);
 
32029
    const double G6_2_0 = det*K_22*K_02*(1.0);
 
32030
    const double G6_2_1 = det*K_22*K_12*(1.0);
 
32031
    const double G6_2_2 = det*K_22*K_22*(1.0);
 
32032
    const double G7_0_0 = det*K_02*K_02*(1.0);
 
32033
    const double G7_0_1 = det*K_02*K_12*(1.0);
 
32034
    const double G7_0_2 = det*K_02*K_22*(1.0);
 
32035
    const double G7_1_0 = det*K_12*K_02*(1.0);
 
32036
    const double G7_1_1 = det*K_12*K_12*(1.0);
 
32037
    const double G7_1_2 = det*K_12*K_22*(1.0);
 
32038
    const double G7_2_0 = det*K_22*K_02*(1.0);
 
32039
    const double G7_2_1 = det*K_22*K_12*(1.0);
 
32040
    const double G7_2_2 = det*K_22*K_22*(1.0);
 
32041
    const double G8_0_0 = det*K_02*K_02*(1.0);
 
32042
    const double G8_0_1 = det*K_02*K_12*(1.0);
 
32043
    const double G8_0_2 = det*K_02*K_22*(1.0);
 
32044
    const double G8_1_0 = det*K_12*K_02*(1.0);
 
32045
    const double G8_1_1 = det*K_12*K_12*(1.0);
 
32046
    const double G8_1_2 = det*K_12*K_22*(1.0);
 
32047
    const double G8_2_0 = det*K_22*K_02*(1.0);
 
32048
    const double G8_2_1 = det*K_22*K_12*(1.0);
 
32049
    const double G8_2_2 = det*K_22*K_22*(1.0);
 
32050
    const double G9_0_0 = det*K_00*K_00*(1.0);
 
32051
    const double G9_0_1 = det*K_00*K_10*(1.0);
 
32052
    const double G9_0_2 = det*K_00*K_20*(1.0);
 
32053
    const double G9_1_0 = det*K_10*K_00*(1.0);
 
32054
    const double G9_1_1 = det*K_10*K_10*(1.0);
 
32055
    const double G9_1_2 = det*K_10*K_20*(1.0);
 
32056
    const double G9_2_0 = det*K_20*K_00*(1.0);
 
32057
    const double G9_2_1 = det*K_20*K_10*(1.0);
 
32058
    const double G9_2_2 = det*K_20*K_20*(1.0);
 
32059
    const double G10_0_0 = det*K_00*K_00*(1.0);
 
32060
    const double G10_0_1 = det*K_00*K_10*(1.0);
 
32061
    const double G10_0_2 = det*K_00*K_20*(1.0);
 
32062
    const double G10_1_0 = det*K_10*K_00*(1.0);
 
32063
    const double G10_1_1 = det*K_10*K_10*(1.0);
 
32064
    const double G10_1_2 = det*K_10*K_20*(1.0);
 
32065
    const double G10_2_0 = det*K_20*K_00*(1.0);
 
32066
    const double G10_2_1 = det*K_20*K_10*(1.0);
 
32067
    const double G10_2_2 = det*K_20*K_20*(1.0);
 
32068
    const double G11_0_0 = det*K_00*K_00*(1.0);
 
32069
    const double G11_0_1 = det*K_00*K_10*(1.0);
 
32070
    const double G11_0_2 = det*K_00*K_20*(1.0);
 
32071
    const double G11_1_0 = det*K_10*K_00*(1.0);
 
32072
    const double G11_1_1 = det*K_10*K_10*(1.0);
 
32073
    const double G11_1_2 = det*K_10*K_20*(1.0);
 
32074
    const double G11_2_0 = det*K_20*K_00*(1.0);
 
32075
    const double G11_2_1 = det*K_20*K_10*(1.0);
 
32076
    const double G11_2_2 = det*K_20*K_20*(1.0);
 
32077
    const double G12_0_0 = det*K_01*K_01*(1.0);
 
32078
    const double G12_0_1 = det*K_01*K_11*(1.0);
 
32079
    const double G12_0_2 = det*K_01*K_21*(1.0);
 
32080
    const double G12_1_0 = det*K_11*K_01*(1.0);
 
32081
    const double G12_1_1 = det*K_11*K_11*(1.0);
 
32082
    const double G12_1_2 = det*K_11*K_21*(1.0);
 
32083
    const double G12_2_0 = det*K_21*K_01*(1.0);
 
32084
    const double G12_2_1 = det*K_21*K_11*(1.0);
 
32085
    const double G12_2_2 = det*K_21*K_21*(1.0);
 
32086
    const double G13_0_0 = det*K_01*K_01*(1.0);
 
32087
    const double G13_0_1 = det*K_01*K_11*(1.0);
 
32088
    const double G13_0_2 = det*K_01*K_21*(1.0);
 
32089
    const double G13_1_0 = det*K_11*K_01*(1.0);
 
32090
    const double G13_1_1 = det*K_11*K_11*(1.0);
 
32091
    const double G13_1_2 = det*K_11*K_21*(1.0);
 
32092
    const double G13_2_0 = det*K_21*K_01*(1.0);
 
32093
    const double G13_2_1 = det*K_21*K_11*(1.0);
 
32094
    const double G13_2_2 = det*K_21*K_21*(1.0);
 
32095
    const double G14_0_0 = det*K_01*K_01*(1.0);
 
32096
    const double G14_0_1 = det*K_01*K_11*(1.0);
 
32097
    const double G14_0_2 = det*K_01*K_21*(1.0);
 
32098
    const double G14_1_0 = det*K_11*K_01*(1.0);
 
32099
    const double G14_1_1 = det*K_11*K_11*(1.0);
 
32100
    const double G14_1_2 = det*K_11*K_21*(1.0);
 
32101
    const double G14_2_0 = det*K_21*K_01*(1.0);
 
32102
    const double G14_2_1 = det*K_21*K_11*(1.0);
 
32103
    const double G14_2_2 = det*K_21*K_21*(1.0);
 
32104
    
 
32105
    // Compute element tensor
 
32106
    A[0] = 0.100000000000000*G7_0_0 + 0.100000000000000*G7_0_1 + 0.100000000000000*G7_0_2 + 0.100000000000000*G7_1_0 + 0.100000000000000*G7_1_1 + 0.100000000000000*G7_1_2 + 0.100000000000000*G7_2_0 + 0.100000000000000*G7_2_1 + 0.100000000000000*G7_2_2 + 0.100000000000000*G10_0_0 + 0.100000000000000*G10_0_1 + 0.100000000000000*G10_0_2 + 0.100000000000000*G10_1_0 + 0.100000000000000*G10_1_1 + 0.100000000000000*G10_1_2 + 0.100000000000000*G10_2_0 + 0.100000000000000*G10_2_1 + 0.100000000000000*G10_2_2 + 0.100000000000000*G13_0_0 + 0.100000000000000*G13_0_1 + 0.100000000000000*G13_0_2 + 0.100000000000000*G13_1_0 + 0.100000000000000*G13_1_1 + 0.100000000000000*G13_1_2 + 0.100000000000000*G13_2_0 + 0.100000000000000*G13_2_1 + 0.100000000000000*G13_2_2;
 
32107
    A[1] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_1_0 + 0.033333333333333*G7_2_0 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_2_0 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_2_0;
 
32108
    A[2] = 0.033333333333333*G7_0_1 + 0.033333333333333*G7_1_1 + 0.033333333333333*G7_2_1 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_2_1 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_2_1;
 
32109
    A[3] = 0.033333333333333*G7_0_2 + 0.033333333333333*G7_1_2 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_0_2 + 0.033333333333333*G10_1_2 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_0_2 + 0.033333333333333*G13_1_2 + 0.033333333333333*G13_2_2;
 
32110
    A[4] = 0.033333333333333*G7_0_1 + 0.033333333333333*G7_0_2 + 0.033333333333333*G7_1_1 + 0.033333333333333*G7_1_2 + 0.033333333333333*G7_2_1 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_0_2 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_1_2 + 0.033333333333333*G10_2_1 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_0_2 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_1_2 + 0.033333333333333*G13_2_1 + 0.033333333333333*G13_2_2;
 
32111
    A[5] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_2 + 0.033333333333333*G7_1_0 + 0.033333333333333*G7_1_2 + 0.033333333333333*G7_2_0 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_2 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_1_2 + 0.033333333333333*G10_2_0 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_2 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_1_2 + 0.033333333333333*G13_2_0 + 0.033333333333333*G13_2_2;
 
32112
    A[6] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_1 + 0.033333333333333*G7_1_0 + 0.033333333333333*G7_1_1 + 0.033333333333333*G7_2_0 + 0.033333333333333*G7_2_1 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_2_0 + 0.033333333333333*G10_2_1 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_2_0 + 0.033333333333333*G13_2_1;
 
32113
    A[7] = -0.033333333333333*G7_0_0 - 0.033333333333333*G7_0_1 - 0.133333333333333*G7_0_2 - 0.033333333333333*G7_1_0 - 0.033333333333333*G7_1_1 - 0.133333333333333*G7_1_2 - 0.033333333333333*G7_2_0 - 0.033333333333333*G7_2_1 - 0.133333333333333*G7_2_2 - 0.033333333333333*G10_0_0 - 0.033333333333333*G10_0_1 - 0.133333333333333*G10_0_2 - 0.033333333333333*G10_1_0 - 0.033333333333333*G10_1_1 - 0.133333333333333*G10_1_2 - 0.033333333333333*G10_2_0 - 0.033333333333333*G10_2_1 - 0.133333333333333*G10_2_2 - 0.033333333333333*G13_0_0 - 0.033333333333333*G13_0_1 - 0.133333333333333*G13_0_2 - 0.033333333333333*G13_1_0 - 0.033333333333333*G13_1_1 - 0.133333333333333*G13_1_2 - 0.033333333333333*G13_2_0 - 0.033333333333333*G13_2_1 - 0.133333333333333*G13_2_2;
 
32114
    A[8] = -0.033333333333333*G7_0_0 - 0.133333333333333*G7_0_1 - 0.033333333333333*G7_0_2 - 0.033333333333333*G7_1_0 - 0.133333333333333*G7_1_1 - 0.033333333333333*G7_1_2 - 0.033333333333333*G7_2_0 - 0.133333333333333*G7_2_1 - 0.033333333333333*G7_2_2 - 0.033333333333333*G10_0_0 - 0.133333333333333*G10_0_1 - 0.033333333333333*G10_0_2 - 0.033333333333333*G10_1_0 - 0.133333333333333*G10_1_1 - 0.033333333333333*G10_1_2 - 0.033333333333333*G10_2_0 - 0.133333333333333*G10_2_1 - 0.033333333333333*G10_2_2 - 0.033333333333333*G13_0_0 - 0.133333333333333*G13_0_1 - 0.033333333333333*G13_0_2 - 0.033333333333333*G13_1_0 - 0.133333333333333*G13_1_1 - 0.033333333333333*G13_1_2 - 0.033333333333333*G13_2_0 - 0.133333333333333*G13_2_1 - 0.033333333333333*G13_2_2;
 
32115
    A[9] = -0.133333333333333*G7_0_0 - 0.033333333333333*G7_0_1 - 0.033333333333333*G7_0_2 - 0.133333333333333*G7_1_0 - 0.033333333333333*G7_1_1 - 0.033333333333333*G7_1_2 - 0.133333333333333*G7_2_0 - 0.033333333333333*G7_2_1 - 0.033333333333333*G7_2_2 - 0.133333333333333*G10_0_0 - 0.033333333333333*G10_0_1 - 0.033333333333333*G10_0_2 - 0.133333333333333*G10_1_0 - 0.033333333333333*G10_1_1 - 0.033333333333333*G10_1_2 - 0.133333333333333*G10_2_0 - 0.033333333333333*G10_2_1 - 0.033333333333333*G10_2_2 - 0.133333333333333*G13_0_0 - 0.033333333333333*G13_0_1 - 0.033333333333333*G13_0_2 - 0.133333333333333*G13_1_0 - 0.033333333333333*G13_1_1 - 0.033333333333333*G13_1_2 - 0.133333333333333*G13_2_0 - 0.033333333333333*G13_2_1 - 0.033333333333333*G13_2_2;
 
32116
    A[10] = 0.000000000000000;
 
32117
    A[11] = 0.000000000000000;
 
32118
    A[12] = 0.000000000000000;
 
32119
    A[13] = 0.000000000000000;
 
32120
    A[14] = 0.000000000000000;
 
32121
    A[15] = 0.000000000000000;
 
32122
    A[16] = 0.000000000000000;
 
32123
    A[17] = 0.000000000000000;
 
32124
    A[18] = 0.000000000000000;
 
32125
    A[19] = 0.000000000000000;
 
32126
    A[20] = 0.000000000000000;
 
32127
    A[21] = 0.000000000000000;
 
32128
    A[22] = 0.000000000000000;
 
32129
    A[23] = 0.000000000000000;
 
32130
    A[24] = 0.000000000000000;
 
32131
    A[25] = 0.000000000000000;
 
32132
    A[26] = 0.000000000000000;
 
32133
    A[27] = 0.000000000000000;
 
32134
    A[28] = 0.000000000000000;
 
32135
    A[29] = 0.000000000000000;
 
32136
    A[30] = -0.025000000000000*G4_0 - 0.025000000000000*G4_1 - 0.025000000000000*G4_2;
 
32137
    A[31] = 0.008333333333333*G4_0 + 0.008333333333333*G4_1 + 0.008333333333333*G4_2;
 
32138
    A[32] = 0.008333333333333*G4_0 + 0.008333333333333*G4_1 + 0.008333333333333*G4_2;
 
32139
    A[33] = 0.008333333333333*G4_0 + 0.008333333333333*G4_1 + 0.008333333333333*G4_2;
 
32140
    A[34] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_1 + 0.033333333333333*G7_0_2 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_0_2 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_0_2;
 
32141
    A[35] = 0.100000000000000*G7_0_0 + 0.100000000000000*G10_0_0 + 0.100000000000000*G13_0_0;
 
32142
    A[36] = -0.033333333333333*G7_0_1 - 0.033333333333333*G10_0_1 - 0.033333333333333*G13_0_1;
 
32143
    A[37] = -0.033333333333333*G7_0_2 - 0.033333333333333*G10_0_2 - 0.033333333333333*G13_0_2;
 
32144
    A[38] = -0.033333333333333*G7_0_1 - 0.033333333333333*G7_0_2 - 0.033333333333333*G10_0_1 - 0.033333333333333*G10_0_2 - 0.033333333333333*G13_0_1 - 0.033333333333333*G13_0_2;
 
32145
    A[39] = -0.033333333333333*G7_0_0 + 0.100000000000000*G7_0_2 - 0.033333333333333*G10_0_0 + 0.100000000000000*G10_0_2 - 0.033333333333333*G13_0_0 + 0.100000000000000*G13_0_2;
 
32146
    A[40] = -0.033333333333333*G7_0_0 + 0.100000000000000*G7_0_1 - 0.033333333333333*G10_0_0 + 0.100000000000000*G10_0_1 - 0.033333333333333*G13_0_0 + 0.100000000000000*G13_0_1;
 
32147
    A[41] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_1 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_1 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_1;
 
32148
    A[42] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_2 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_2 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_2;
 
32149
    A[43] = -0.133333333333333*G7_0_0 - 0.100000000000000*G7_0_1 - 0.100000000000000*G7_0_2 - 0.133333333333333*G10_0_0 - 0.100000000000000*G10_0_1 - 0.100000000000000*G10_0_2 - 0.133333333333333*G13_0_0 - 0.100000000000000*G13_0_1 - 0.100000000000000*G13_0_2;
 
32150
    A[44] = 0.000000000000000;
 
32151
    A[45] = 0.000000000000000;
 
32152
    A[46] = 0.000000000000000;
 
32153
    A[47] = 0.000000000000000;
 
32154
    A[48] = 0.000000000000000;
 
32155
    A[49] = 0.000000000000000;
 
32156
    A[50] = 0.000000000000000;
 
32157
    A[51] = 0.000000000000000;
 
32158
    A[52] = 0.000000000000000;
 
32159
    A[53] = 0.000000000000000;
 
32160
    A[54] = 0.000000000000000;
 
32161
    A[55] = 0.000000000000000;
 
32162
    A[56] = 0.000000000000000;
 
32163
    A[57] = 0.000000000000000;
 
32164
    A[58] = 0.000000000000000;
 
32165
    A[59] = 0.000000000000000;
 
32166
    A[60] = 0.000000000000000;
 
32167
    A[61] = 0.000000000000000;
 
32168
    A[62] = 0.000000000000000;
 
32169
    A[63] = 0.000000000000000;
 
32170
    A[64] = -0.008333333333333*G4_0;
 
32171
    A[65] = 0.025000000000000*G4_0;
 
32172
    A[66] = -0.008333333333333*G4_0;
 
32173
    A[67] = -0.008333333333333*G4_0;
 
32174
    A[68] = 0.033333333333333*G7_1_0 + 0.033333333333333*G7_1_1 + 0.033333333333333*G7_1_2 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_1_2 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_1_2;
 
32175
    A[69] = -0.033333333333333*G7_1_0 - 0.033333333333333*G10_1_0 - 0.033333333333333*G13_1_0;
 
32176
    A[70] = 0.100000000000000*G7_1_1 + 0.100000000000000*G10_1_1 + 0.100000000000000*G13_1_1;
 
32177
    A[71] = -0.033333333333333*G7_1_2 - 0.033333333333333*G10_1_2 - 0.033333333333333*G13_1_2;
 
32178
    A[72] = -0.033333333333333*G7_1_1 + 0.100000000000000*G7_1_2 - 0.033333333333333*G10_1_1 + 0.100000000000000*G10_1_2 - 0.033333333333333*G13_1_1 + 0.100000000000000*G13_1_2;
 
32179
    A[73] = -0.033333333333333*G7_1_0 - 0.033333333333333*G7_1_2 - 0.033333333333333*G10_1_0 - 0.033333333333333*G10_1_2 - 0.033333333333333*G13_1_0 - 0.033333333333333*G13_1_2;
 
32180
    A[74] = 0.100000000000000*G7_1_0 - 0.033333333333333*G7_1_1 + 0.100000000000000*G10_1_0 - 0.033333333333333*G10_1_1 + 0.100000000000000*G13_1_0 - 0.033333333333333*G13_1_1;
 
32181
    A[75] = 0.033333333333333*G7_1_0 + 0.033333333333333*G7_1_1 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_1_1 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_1_1;
 
32182
    A[76] = -0.100000000000000*G7_1_0 - 0.133333333333333*G7_1_1 - 0.100000000000000*G7_1_2 - 0.100000000000000*G10_1_0 - 0.133333333333333*G10_1_1 - 0.100000000000000*G10_1_2 - 0.100000000000000*G13_1_0 - 0.133333333333333*G13_1_1 - 0.100000000000000*G13_1_2;
 
32183
    A[77] = 0.033333333333333*G7_1_1 + 0.033333333333333*G7_1_2 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_1_2 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_1_2;
 
32184
    A[78] = 0.000000000000000;
 
32185
    A[79] = 0.000000000000000;
 
32186
    A[80] = 0.000000000000000;
 
32187
    A[81] = 0.000000000000000;
 
32188
    A[82] = 0.000000000000000;
 
32189
    A[83] = 0.000000000000000;
 
32190
    A[84] = 0.000000000000000;
 
32191
    A[85] = 0.000000000000000;
 
32192
    A[86] = 0.000000000000000;
 
32193
    A[87] = 0.000000000000000;
 
32194
    A[88] = 0.000000000000000;
 
32195
    A[89] = 0.000000000000000;
 
32196
    A[90] = 0.000000000000000;
 
32197
    A[91] = 0.000000000000000;
 
32198
    A[92] = 0.000000000000000;
 
32199
    A[93] = 0.000000000000000;
 
32200
    A[94] = 0.000000000000000;
 
32201
    A[95] = 0.000000000000000;
 
32202
    A[96] = 0.000000000000000;
 
32203
    A[97] = 0.000000000000000;
 
32204
    A[98] = -0.008333333333333*G4_1;
 
32205
    A[99] = -0.008333333333333*G4_1;
 
32206
    A[100] = 0.025000000000000*G4_1;
 
32207
    A[101] = -0.008333333333333*G4_1;
 
32208
    A[102] = 0.033333333333333*G7_2_0 + 0.033333333333333*G7_2_1 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_2_0 + 0.033333333333333*G10_2_1 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_2_0 + 0.033333333333333*G13_2_1 + 0.033333333333333*G13_2_2;
 
32209
    A[103] = -0.033333333333333*G7_2_0 - 0.033333333333333*G10_2_0 - 0.033333333333333*G13_2_0;
 
32210
    A[104] = -0.033333333333333*G7_2_1 - 0.033333333333333*G10_2_1 - 0.033333333333333*G13_2_1;
 
32211
    A[105] = 0.100000000000000*G7_2_2 + 0.100000000000000*G10_2_2 + 0.100000000000000*G13_2_2;
 
32212
    A[106] = 0.100000000000000*G7_2_1 - 0.033333333333333*G7_2_2 + 0.100000000000000*G10_2_1 - 0.033333333333333*G10_2_2 + 0.100000000000000*G13_2_1 - 0.033333333333333*G13_2_2;
 
32213
    A[107] = 0.100000000000000*G7_2_0 - 0.033333333333333*G7_2_2 + 0.100000000000000*G10_2_0 - 0.033333333333333*G10_2_2 + 0.100000000000000*G13_2_0 - 0.033333333333333*G13_2_2;
 
32214
    A[108] = -0.033333333333333*G7_2_0 - 0.033333333333333*G7_2_1 - 0.033333333333333*G10_2_0 - 0.033333333333333*G10_2_1 - 0.033333333333333*G13_2_0 - 0.033333333333333*G13_2_1;
 
32215
    A[109] = -0.100000000000000*G7_2_0 - 0.100000000000000*G7_2_1 - 0.133333333333333*G7_2_2 - 0.100000000000000*G10_2_0 - 0.100000000000000*G10_2_1 - 0.133333333333333*G10_2_2 - 0.100000000000000*G13_2_0 - 0.100000000000000*G13_2_1 - 0.133333333333333*G13_2_2;
 
32216
    A[110] = 0.033333333333333*G7_2_0 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_2_0 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_2_0 + 0.033333333333333*G13_2_2;
 
32217
    A[111] = 0.033333333333333*G7_2_1 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_2_1 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_2_1 + 0.033333333333333*G13_2_2;
 
32218
    A[112] = 0.000000000000000;
 
32219
    A[113] = 0.000000000000000;
 
32220
    A[114] = 0.000000000000000;
 
32221
    A[115] = 0.000000000000000;
 
32222
    A[116] = 0.000000000000000;
 
32223
    A[117] = 0.000000000000000;
 
32224
    A[118] = 0.000000000000000;
 
32225
    A[119] = 0.000000000000000;
 
32226
    A[120] = 0.000000000000000;
 
32227
    A[121] = 0.000000000000000;
 
32228
    A[122] = 0.000000000000000;
 
32229
    A[123] = 0.000000000000000;
 
32230
    A[124] = 0.000000000000000;
 
32231
    A[125] = 0.000000000000000;
 
32232
    A[126] = 0.000000000000000;
 
32233
    A[127] = 0.000000000000000;
 
32234
    A[128] = 0.000000000000000;
 
32235
    A[129] = 0.000000000000000;
 
32236
    A[130] = 0.000000000000000;
 
32237
    A[131] = 0.000000000000000;
 
32238
    A[132] = -0.008333333333333*G4_2;
 
32239
    A[133] = -0.008333333333333*G4_2;
 
32240
    A[134] = -0.008333333333333*G4_2;
 
32241
    A[135] = 0.025000000000000*G4_2;
 
32242
    A[136] = 0.033333333333333*G7_1_0 + 0.033333333333333*G7_1_1 + 0.033333333333333*G7_1_2 + 0.033333333333333*G7_2_0 + 0.033333333333333*G7_2_1 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_1_2 + 0.033333333333333*G10_2_0 + 0.033333333333333*G10_2_1 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_1_2 + 0.033333333333333*G13_2_0 + 0.033333333333333*G13_2_1 + 0.033333333333333*G13_2_2;
 
32243
    A[137] = -0.033333333333333*G7_1_0 - 0.033333333333333*G7_2_0 - 0.033333333333333*G10_1_0 - 0.033333333333333*G10_2_0 - 0.033333333333333*G13_1_0 - 0.033333333333333*G13_2_0;
 
32244
    A[138] = -0.033333333333333*G7_1_1 + 0.100000000000000*G7_2_1 - 0.033333333333333*G10_1_1 + 0.100000000000000*G10_2_1 - 0.033333333333333*G13_1_1 + 0.100000000000000*G13_2_1;
 
32245
    A[139] = 0.100000000000000*G7_1_2 - 0.033333333333333*G7_2_2 + 0.100000000000000*G10_1_2 - 0.033333333333333*G10_2_2 + 0.100000000000000*G13_1_2 - 0.033333333333333*G13_2_2;
 
32246
    A[140] = 0.266666666666666*G7_1_1 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_1 + 0.266666666666666*G7_2_2 + 0.266666666666666*G10_1_1 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_1 + 0.266666666666666*G10_2_2 + 0.266666666666666*G13_1_1 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_1 + 0.266666666666666*G13_2_2;
 
32247
    A[141] = 0.266666666666666*G7_1_0 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_0 + 0.133333333333333*G7_2_2 + 0.266666666666666*G10_1_0 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_0 + 0.133333333333333*G10_2_2 + 0.266666666666666*G13_1_0 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_0 + 0.133333333333333*G13_2_2;
 
32248
    A[142] = 0.133333333333333*G7_1_0 + 0.133333333333333*G7_1_1 + 0.266666666666666*G7_2_0 + 0.133333333333333*G7_2_1 + 0.133333333333333*G10_1_0 + 0.133333333333333*G10_1_1 + 0.266666666666666*G10_2_0 + 0.133333333333333*G10_2_1 + 0.133333333333333*G13_1_0 + 0.133333333333333*G13_1_1 + 0.266666666666666*G13_2_0 + 0.133333333333333*G13_2_1;
 
32249
    A[143] = -0.266666666666666*G7_1_0 - 0.266666666666666*G7_1_1 - 0.133333333333333*G7_1_2 - 0.133333333333333*G7_2_0 - 0.133333333333333*G7_2_1 - 0.266666666666666*G10_1_0 - 0.266666666666666*G10_1_1 - 0.133333333333333*G10_1_2 - 0.133333333333333*G10_2_0 - 0.133333333333333*G10_2_1 - 0.266666666666666*G13_1_0 - 0.266666666666666*G13_1_1 - 0.133333333333333*G13_1_2 - 0.133333333333333*G13_2_0 - 0.133333333333333*G13_2_1;
 
32250
    A[144] = -0.133333333333333*G7_1_0 - 0.133333333333333*G7_1_2 - 0.266666666666666*G7_2_0 - 0.133333333333333*G7_2_1 - 0.266666666666666*G7_2_2 - 0.133333333333333*G10_1_0 - 0.133333333333333*G10_1_2 - 0.266666666666666*G10_2_0 - 0.133333333333333*G10_2_1 - 0.266666666666666*G10_2_2 - 0.133333333333333*G13_1_0 - 0.133333333333333*G13_1_2 - 0.266666666666666*G13_2_0 - 0.133333333333333*G13_2_1 - 0.266666666666666*G13_2_2;
 
32251
    A[145] = -0.133333333333333*G7_1_1 - 0.133333333333333*G7_1_2 - 0.133333333333333*G7_2_1 - 0.133333333333333*G7_2_2 - 0.133333333333333*G10_1_1 - 0.133333333333333*G10_1_2 - 0.133333333333333*G10_2_1 - 0.133333333333333*G10_2_2 - 0.133333333333333*G13_1_1 - 0.133333333333333*G13_1_2 - 0.133333333333333*G13_2_1 - 0.133333333333333*G13_2_2;
 
32252
    A[146] = 0.000000000000000;
 
32253
    A[147] = 0.000000000000000;
 
32254
    A[148] = 0.000000000000000;
 
32255
    A[149] = 0.000000000000000;
 
32256
    A[150] = 0.000000000000000;
 
32257
    A[151] = 0.000000000000000;
 
32258
    A[152] = 0.000000000000000;
 
32259
    A[153] = 0.000000000000000;
 
32260
    A[154] = 0.000000000000000;
 
32261
    A[155] = 0.000000000000000;
 
32262
    A[156] = 0.000000000000000;
 
32263
    A[157] = 0.000000000000000;
 
32264
    A[158] = 0.000000000000000;
 
32265
    A[159] = 0.000000000000000;
 
32266
    A[160] = 0.000000000000000;
 
32267
    A[161] = 0.000000000000000;
 
32268
    A[162] = 0.000000000000000;
 
32269
    A[163] = 0.000000000000000;
 
32270
    A[164] = 0.000000000000000;
 
32271
    A[165] = 0.000000000000000;
 
32272
    A[166] = 0.033333333333333*G4_1 + 0.033333333333333*G4_2;
 
32273
    A[167] = 0.033333333333333*G4_1 + 0.033333333333333*G4_2;
 
32274
    A[168] = 0.033333333333333*G4_1 + 0.066666666666666*G4_2;
 
32275
    A[169] = 0.066666666666666*G4_1 + 0.033333333333333*G4_2;
 
32276
    A[170] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_1 + 0.033333333333333*G7_0_2 + 0.033333333333333*G7_2_0 + 0.033333333333333*G7_2_1 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_0_2 + 0.033333333333333*G10_2_0 + 0.033333333333333*G10_2_1 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_0_2 + 0.033333333333333*G13_2_0 + 0.033333333333333*G13_2_1 + 0.033333333333333*G13_2_2;
 
32277
    A[171] = -0.033333333333333*G7_0_0 + 0.100000000000000*G7_2_0 - 0.033333333333333*G10_0_0 + 0.100000000000000*G10_2_0 - 0.033333333333333*G13_0_0 + 0.100000000000000*G13_2_0;
 
32278
    A[172] = -0.033333333333333*G7_0_1 - 0.033333333333333*G7_2_1 - 0.033333333333333*G10_0_1 - 0.033333333333333*G10_2_1 - 0.033333333333333*G13_0_1 - 0.033333333333333*G13_2_1;
 
32279
    A[173] = 0.100000000000000*G7_0_2 - 0.033333333333333*G7_2_2 + 0.100000000000000*G10_0_2 - 0.033333333333333*G10_2_2 + 0.100000000000000*G13_0_2 - 0.033333333333333*G13_2_2;
 
32280
    A[174] = 0.266666666666666*G7_0_1 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_2_1 + 0.133333333333333*G7_2_2 + 0.266666666666666*G10_0_1 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_2_1 + 0.133333333333333*G10_2_2 + 0.266666666666666*G13_0_1 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_2_1 + 0.133333333333333*G13_2_2;
 
32281
    A[175] = 0.266666666666666*G7_0_0 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_2_0 + 0.266666666666666*G7_2_2 + 0.266666666666666*G10_0_0 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_2_0 + 0.266666666666666*G10_2_2 + 0.266666666666666*G13_0_0 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_2_0 + 0.266666666666666*G13_2_2;
 
32282
    A[176] = 0.133333333333333*G7_0_0 + 0.133333333333333*G7_0_1 + 0.133333333333333*G7_2_0 + 0.266666666666666*G7_2_1 + 0.133333333333333*G10_0_0 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_2_0 + 0.266666666666666*G10_2_1 + 0.133333333333333*G13_0_0 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_2_0 + 0.266666666666666*G13_2_1;
 
32283
    A[177] = -0.266666666666666*G7_0_0 - 0.266666666666666*G7_0_1 - 0.133333333333333*G7_0_2 - 0.133333333333333*G7_2_0 - 0.133333333333333*G7_2_1 - 0.266666666666666*G10_0_0 - 0.266666666666666*G10_0_1 - 0.133333333333333*G10_0_2 - 0.133333333333333*G10_2_0 - 0.133333333333333*G10_2_1 - 0.266666666666666*G13_0_0 - 0.266666666666666*G13_0_1 - 0.133333333333333*G13_0_2 - 0.133333333333333*G13_2_0 - 0.133333333333333*G13_2_1;
 
32284
    A[178] = -0.133333333333333*G7_0_0 - 0.133333333333333*G7_0_2 - 0.133333333333333*G7_2_0 - 0.133333333333333*G7_2_2 - 0.133333333333333*G10_0_0 - 0.133333333333333*G10_0_2 - 0.133333333333333*G10_2_0 - 0.133333333333333*G10_2_2 - 0.133333333333333*G13_0_0 - 0.133333333333333*G13_0_2 - 0.133333333333333*G13_2_0 - 0.133333333333333*G13_2_2;
 
32285
    A[179] = -0.133333333333333*G7_0_1 - 0.133333333333333*G7_0_2 - 0.133333333333333*G7_2_0 - 0.266666666666666*G7_2_1 - 0.266666666666666*G7_2_2 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_0_2 - 0.133333333333333*G10_2_0 - 0.266666666666666*G10_2_1 - 0.266666666666666*G10_2_2 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_0_2 - 0.133333333333333*G13_2_0 - 0.266666666666666*G13_2_1 - 0.266666666666666*G13_2_2;
 
32286
    A[180] = 0.000000000000000;
 
32287
    A[181] = 0.000000000000000;
 
32288
    A[182] = 0.000000000000000;
 
32289
    A[183] = 0.000000000000000;
 
32290
    A[184] = 0.000000000000000;
 
32291
    A[185] = 0.000000000000000;
 
32292
    A[186] = 0.000000000000000;
 
32293
    A[187] = 0.000000000000000;
 
32294
    A[188] = 0.000000000000000;
 
32295
    A[189] = 0.000000000000000;
 
32296
    A[190] = 0.000000000000000;
 
32297
    A[191] = 0.000000000000000;
 
32298
    A[192] = 0.000000000000000;
 
32299
    A[193] = 0.000000000000000;
 
32300
    A[194] = 0.000000000000000;
 
32301
    A[195] = 0.000000000000000;
 
32302
    A[196] = 0.000000000000000;
 
32303
    A[197] = 0.000000000000000;
 
32304
    A[198] = 0.000000000000000;
 
32305
    A[199] = 0.000000000000000;
 
32306
    A[200] = 0.033333333333333*G4_0 + 0.033333333333333*G4_2;
 
32307
    A[201] = 0.033333333333333*G4_0 + 0.066666666666667*G4_2;
 
32308
    A[202] = 0.033333333333333*G4_0 + 0.033333333333333*G4_2;
 
32309
    A[203] = 0.066666666666667*G4_0 + 0.033333333333333*G4_2;
 
32310
    A[204] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_0_1 + 0.033333333333333*G7_0_2 + 0.033333333333333*G7_1_0 + 0.033333333333333*G7_1_1 + 0.033333333333333*G7_1_2 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_0_2 + 0.033333333333333*G10_1_0 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_1_2 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_0_2 + 0.033333333333333*G13_1_0 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_1_2;
 
32311
    A[205] = -0.033333333333333*G7_0_0 + 0.100000000000000*G7_1_0 - 0.033333333333333*G10_0_0 + 0.100000000000000*G10_1_0 - 0.033333333333333*G13_0_0 + 0.100000000000000*G13_1_0;
 
32312
    A[206] = 0.100000000000000*G7_0_1 - 0.033333333333333*G7_1_1 + 0.100000000000000*G10_0_1 - 0.033333333333333*G10_1_1 + 0.100000000000000*G13_0_1 - 0.033333333333333*G13_1_1;
 
32313
    A[207] = -0.033333333333333*G7_0_2 - 0.033333333333333*G7_1_2 - 0.033333333333333*G10_0_2 - 0.033333333333333*G10_1_2 - 0.033333333333333*G13_0_2 - 0.033333333333333*G13_1_2;
 
32314
    A[208] = 0.133333333333333*G7_0_1 + 0.266666666666666*G7_0_2 + 0.133333333333333*G7_1_1 + 0.133333333333333*G7_1_2 + 0.133333333333333*G10_0_1 + 0.266666666666666*G10_0_2 + 0.133333333333333*G10_1_1 + 0.133333333333333*G10_1_2 + 0.133333333333333*G13_0_1 + 0.266666666666666*G13_0_2 + 0.133333333333333*G13_1_1 + 0.133333333333333*G13_1_2;
 
32315
    A[209] = 0.133333333333333*G7_0_0 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_1_0 + 0.266666666666666*G7_1_2 + 0.133333333333333*G10_0_0 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_1_0 + 0.266666666666666*G10_1_2 + 0.133333333333333*G13_0_0 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_1_0 + 0.266666666666666*G13_1_2;
 
32316
    A[210] = 0.266666666666666*G7_0_0 + 0.133333333333333*G7_0_1 + 0.133333333333333*G7_1_0 + 0.266666666666666*G7_1_1 + 0.266666666666666*G10_0_0 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_1_0 + 0.266666666666666*G10_1_1 + 0.266666666666666*G13_0_0 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_1_0 + 0.266666666666666*G13_1_1;
 
32317
    A[211] = -0.133333333333333*G7_0_0 - 0.133333333333333*G7_0_1 - 0.133333333333333*G7_1_0 - 0.133333333333333*G7_1_1 - 0.133333333333333*G10_0_0 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_1_0 - 0.133333333333333*G10_1_1 - 0.133333333333333*G13_0_0 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_1_0 - 0.133333333333333*G13_1_1;
 
32318
    A[212] = -0.266666666666666*G7_0_0 - 0.133333333333333*G7_0_1 - 0.266666666666666*G7_0_2 - 0.133333333333333*G7_1_0 - 0.133333333333333*G7_1_2 - 0.266666666666666*G10_0_0 - 0.133333333333333*G10_0_1 - 0.266666666666666*G10_0_2 - 0.133333333333333*G10_1_0 - 0.133333333333333*G10_1_2 - 0.266666666666666*G13_0_0 - 0.133333333333333*G13_0_1 - 0.266666666666666*G13_0_2 - 0.133333333333333*G13_1_0 - 0.133333333333333*G13_1_2;
 
32319
    A[213] = -0.133333333333333*G7_0_1 - 0.133333333333333*G7_0_2 - 0.133333333333333*G7_1_0 - 0.266666666666666*G7_1_1 - 0.266666666666666*G7_1_2 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_0_2 - 0.133333333333333*G10_1_0 - 0.266666666666666*G10_1_1 - 0.266666666666666*G10_1_2 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_0_2 - 0.133333333333333*G13_1_0 - 0.266666666666666*G13_1_1 - 0.266666666666666*G13_1_2;
 
32320
    A[214] = 0.000000000000000;
 
32321
    A[215] = 0.000000000000000;
 
32322
    A[216] = 0.000000000000000;
 
32323
    A[217] = 0.000000000000000;
 
32324
    A[218] = 0.000000000000000;
 
32325
    A[219] = 0.000000000000000;
 
32326
    A[220] = 0.000000000000000;
 
32327
    A[221] = 0.000000000000000;
 
32328
    A[222] = 0.000000000000000;
 
32329
    A[223] = 0.000000000000000;
 
32330
    A[224] = 0.000000000000000;
 
32331
    A[225] = 0.000000000000000;
 
32332
    A[226] = 0.000000000000000;
 
32333
    A[227] = 0.000000000000000;
 
32334
    A[228] = 0.000000000000000;
 
32335
    A[229] = 0.000000000000000;
 
32336
    A[230] = 0.000000000000000;
 
32337
    A[231] = 0.000000000000000;
 
32338
    A[232] = 0.000000000000000;
 
32339
    A[233] = 0.000000000000000;
 
32340
    A[234] = 0.033333333333333*G4_0 + 0.033333333333333*G4_1;
 
32341
    A[235] = 0.033333333333333*G4_0 + 0.066666666666667*G4_1;
 
32342
    A[236] = 0.066666666666666*G4_0 + 0.033333333333333*G4_1;
 
32343
    A[237] = 0.033333333333333*G4_0 + 0.033333333333333*G4_1;
 
32344
    A[238] = -0.033333333333333*G7_0_0 - 0.033333333333333*G7_0_1 - 0.033333333333333*G7_0_2 - 0.033333333333333*G7_1_0 - 0.033333333333333*G7_1_1 - 0.033333333333333*G7_1_2 - 0.133333333333333*G7_2_0 - 0.133333333333333*G7_2_1 - 0.133333333333333*G7_2_2 - 0.033333333333333*G10_0_0 - 0.033333333333333*G10_0_1 - 0.033333333333333*G10_0_2 - 0.033333333333333*G10_1_0 - 0.033333333333333*G10_1_1 - 0.033333333333333*G10_1_2 - 0.133333333333333*G10_2_0 - 0.133333333333333*G10_2_1 - 0.133333333333333*G10_2_2 - 0.033333333333333*G13_0_0 - 0.033333333333333*G13_0_1 - 0.033333333333333*G13_0_2 - 0.033333333333333*G13_1_0 - 0.033333333333333*G13_1_1 - 0.033333333333333*G13_1_2 - 0.133333333333333*G13_2_0 - 0.133333333333333*G13_2_1 - 0.133333333333333*G13_2_2;
 
32345
    A[239] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_1_0 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_1_0 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_1_0;
 
32346
    A[240] = 0.033333333333333*G7_0_1 + 0.033333333333333*G7_1_1 + 0.033333333333333*G10_0_1 + 0.033333333333333*G10_1_1 + 0.033333333333333*G13_0_1 + 0.033333333333333*G13_1_1;
 
32347
    A[241] = -0.100000000000000*G7_0_2 - 0.100000000000000*G7_1_2 - 0.133333333333333*G7_2_2 - 0.100000000000000*G10_0_2 - 0.100000000000000*G10_1_2 - 0.133333333333333*G10_2_2 - 0.100000000000000*G13_0_2 - 0.100000000000000*G13_1_2 - 0.133333333333333*G13_2_2;
 
32348
    A[242] = -0.266666666666666*G7_0_1 - 0.133333333333333*G7_0_2 - 0.266666666666666*G7_1_1 - 0.133333333333333*G7_1_2 - 0.133333333333333*G7_2_1 - 0.266666666666666*G10_0_1 - 0.133333333333333*G10_0_2 - 0.266666666666666*G10_1_1 - 0.133333333333333*G10_1_2 - 0.133333333333333*G10_2_1 - 0.266666666666666*G13_0_1 - 0.133333333333333*G13_0_2 - 0.266666666666666*G13_1_1 - 0.133333333333333*G13_1_2 - 0.133333333333333*G13_2_1;
 
32349
    A[243] = -0.266666666666666*G7_0_0 - 0.133333333333333*G7_0_2 - 0.266666666666666*G7_1_0 - 0.133333333333333*G7_1_2 - 0.133333333333333*G7_2_0 - 0.266666666666666*G10_0_0 - 0.133333333333333*G10_0_2 - 0.266666666666666*G10_1_0 - 0.133333333333333*G10_1_2 - 0.133333333333333*G10_2_0 - 0.266666666666666*G13_0_0 - 0.133333333333333*G13_0_2 - 0.266666666666666*G13_1_0 - 0.133333333333333*G13_1_2 - 0.133333333333333*G13_2_0;
 
32350
    A[244] = -0.133333333333333*G7_0_0 - 0.133333333333333*G7_0_1 - 0.133333333333333*G7_1_0 - 0.133333333333333*G7_1_1 - 0.133333333333333*G10_0_0 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_1_0 - 0.133333333333333*G10_1_1 - 0.133333333333333*G13_0_0 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_1_0 - 0.133333333333333*G13_1_1;
 
32351
    A[245] = 0.266666666666666*G7_0_0 + 0.266666666666666*G7_0_1 + 0.133333333333333*G7_0_2 + 0.266666666666666*G7_1_0 + 0.266666666666666*G7_1_1 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_0 + 0.133333333333333*G7_2_1 + 0.266666666666666*G7_2_2 + 0.266666666666666*G10_0_0 + 0.266666666666666*G10_0_1 + 0.133333333333333*G10_0_2 + 0.266666666666666*G10_1_0 + 0.266666666666666*G10_1_1 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_0 + 0.133333333333333*G10_2_1 + 0.266666666666666*G10_2_2 + 0.266666666666666*G13_0_0 + 0.266666666666666*G13_0_1 + 0.133333333333333*G13_0_2 + 0.266666666666666*G13_1_0 + 0.266666666666666*G13_1_1 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_0 + 0.133333333333333*G13_2_1 + 0.266666666666666*G13_2_2;
 
32352
    A[246] = 0.133333333333333*G7_0_0 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_1_0 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_1 + 0.133333333333333*G10_0_0 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_1_0 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_1 + 0.133333333333333*G13_0_0 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_1_0 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_1;
 
32353
    A[247] = 0.133333333333333*G7_0_1 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_1_1 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_0 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_1_1 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_0 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_1_1 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_0;
 
32354
    A[248] = 0.000000000000000;
 
32355
    A[249] = 0.000000000000000;
 
32356
    A[250] = 0.000000000000000;
 
32357
    A[251] = 0.000000000000000;
 
32358
    A[252] = 0.000000000000000;
 
32359
    A[253] = 0.000000000000000;
 
32360
    A[254] = 0.000000000000000;
 
32361
    A[255] = 0.000000000000000;
 
32362
    A[256] = 0.000000000000000;
 
32363
    A[257] = 0.000000000000000;
 
32364
    A[258] = 0.000000000000000;
 
32365
    A[259] = 0.000000000000000;
 
32366
    A[260] = 0.000000000000000;
 
32367
    A[261] = 0.000000000000000;
 
32368
    A[262] = 0.000000000000000;
 
32369
    A[263] = 0.000000000000000;
 
32370
    A[264] = 0.000000000000000;
 
32371
    A[265] = 0.000000000000000;
 
32372
    A[266] = 0.000000000000000;
 
32373
    A[267] = 0.000000000000000;
 
32374
    A[268] = -0.033333333333333*G4_0 - 0.033333333333333*G4_1 + 0.033333333333333*G4_2;
 
32375
    A[269] = -0.033333333333333*G4_0 - 0.033333333333333*G4_1;
 
32376
    A[270] = -0.033333333333333*G4_0 - 0.033333333333333*G4_1;
 
32377
    A[271] = -0.066666666666667*G4_0 - 0.066666666666666*G4_1 - 0.033333333333333*G4_2;
 
32378
    A[272] = -0.033333333333333*G7_0_0 - 0.033333333333333*G7_0_1 - 0.033333333333333*G7_0_2 - 0.133333333333333*G7_1_0 - 0.133333333333333*G7_1_1 - 0.133333333333333*G7_1_2 - 0.033333333333333*G7_2_0 - 0.033333333333333*G7_2_1 - 0.033333333333333*G7_2_2 - 0.033333333333333*G10_0_0 - 0.033333333333333*G10_0_1 - 0.033333333333333*G10_0_2 - 0.133333333333333*G10_1_0 - 0.133333333333333*G10_1_1 - 0.133333333333333*G10_1_2 - 0.033333333333333*G10_2_0 - 0.033333333333333*G10_2_1 - 0.033333333333333*G10_2_2 - 0.033333333333333*G13_0_0 - 0.033333333333333*G13_0_1 - 0.033333333333333*G13_0_2 - 0.133333333333333*G13_1_0 - 0.133333333333333*G13_1_1 - 0.133333333333333*G13_1_2 - 0.033333333333333*G13_2_0 - 0.033333333333333*G13_2_1 - 0.033333333333333*G13_2_2;
 
32379
    A[273] = 0.033333333333333*G7_0_0 + 0.033333333333333*G7_2_0 + 0.033333333333333*G10_0_0 + 0.033333333333333*G10_2_0 + 0.033333333333333*G13_0_0 + 0.033333333333333*G13_2_0;
 
32380
    A[274] = -0.100000000000000*G7_0_1 - 0.133333333333333*G7_1_1 - 0.100000000000000*G7_2_1 - 0.100000000000000*G10_0_1 - 0.133333333333333*G10_1_1 - 0.100000000000000*G10_2_1 - 0.100000000000000*G13_0_1 - 0.133333333333333*G13_1_1 - 0.100000000000000*G13_2_1;
 
32381
    A[275] = 0.033333333333333*G7_0_2 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_0_2 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_0_2 + 0.033333333333333*G13_2_2;
 
32382
    A[276] = -0.133333333333333*G7_0_1 - 0.266666666666666*G7_0_2 - 0.133333333333333*G7_1_2 - 0.133333333333333*G7_2_1 - 0.266666666666666*G7_2_2 - 0.133333333333333*G10_0_1 - 0.266666666666666*G10_0_2 - 0.133333333333333*G10_1_2 - 0.133333333333333*G10_2_1 - 0.266666666666666*G10_2_2 - 0.133333333333333*G13_0_1 - 0.266666666666666*G13_0_2 - 0.133333333333333*G13_1_2 - 0.133333333333333*G13_2_1 - 0.266666666666666*G13_2_2;
 
32383
    A[277] = -0.133333333333333*G7_0_0 - 0.133333333333333*G7_0_2 - 0.133333333333333*G7_2_0 - 0.133333333333333*G7_2_2 - 0.133333333333333*G10_0_0 - 0.133333333333333*G10_0_2 - 0.133333333333333*G10_2_0 - 0.133333333333333*G10_2_2 - 0.133333333333333*G13_0_0 - 0.133333333333333*G13_0_2 - 0.133333333333333*G13_2_0 - 0.133333333333333*G13_2_2;
 
32384
    A[278] = -0.266666666666666*G7_0_0 - 0.133333333333333*G7_0_1 - 0.133333333333333*G7_1_0 - 0.266666666666666*G7_2_0 - 0.133333333333333*G7_2_1 - 0.266666666666666*G10_0_0 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_1_0 - 0.266666666666666*G10_2_0 - 0.133333333333333*G10_2_1 - 0.266666666666666*G13_0_0 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_1_0 - 0.266666666666666*G13_2_0 - 0.133333333333333*G13_2_1;
 
32385
    A[279] = 0.133333333333333*G7_0_0 + 0.133333333333333*G7_0_1 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_0 + 0.133333333333333*G7_2_1 + 0.133333333333333*G10_0_0 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_0 + 0.133333333333333*G10_2_1 + 0.133333333333333*G13_0_0 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_0 + 0.133333333333333*G13_2_1;
 
32386
    A[280] = 0.266666666666666*G7_0_0 + 0.133333333333333*G7_0_1 + 0.266666666666666*G7_0_2 + 0.133333333333333*G7_1_0 + 0.266666666666666*G7_1_1 + 0.133333333333333*G7_1_2 + 0.266666666666666*G7_2_0 + 0.133333333333333*G7_2_1 + 0.266666666666666*G7_2_2 + 0.266666666666666*G10_0_0 + 0.133333333333333*G10_0_1 + 0.266666666666666*G10_0_2 + 0.133333333333333*G10_1_0 + 0.266666666666666*G10_1_1 + 0.133333333333333*G10_1_2 + 0.266666666666666*G10_2_0 + 0.133333333333333*G10_2_1 + 0.266666666666666*G10_2_2 + 0.266666666666666*G13_0_0 + 0.133333333333333*G13_0_1 + 0.266666666666666*G13_0_2 + 0.133333333333333*G13_1_0 + 0.266666666666666*G13_1_1 + 0.133333333333333*G13_1_2 + 0.266666666666666*G13_2_0 + 0.133333333333333*G13_2_1 + 0.266666666666666*G13_2_2;
 
32387
    A[281] = 0.133333333333333*G7_0_1 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_1_0 + 0.133333333333333*G7_2_1 + 0.133333333333333*G7_2_2 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_1_0 + 0.133333333333333*G10_2_1 + 0.133333333333333*G10_2_2 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_1_0 + 0.133333333333333*G13_2_1 + 0.133333333333333*G13_2_2;
 
32388
    A[282] = 0.000000000000000;
 
32389
    A[283] = 0.000000000000000;
 
32390
    A[284] = 0.000000000000000;
 
32391
    A[285] = 0.000000000000000;
 
32392
    A[286] = 0.000000000000000;
 
32393
    A[287] = 0.000000000000000;
 
32394
    A[288] = 0.000000000000000;
 
32395
    A[289] = 0.000000000000000;
 
32396
    A[290] = 0.000000000000000;
 
32397
    A[291] = 0.000000000000000;
 
32398
    A[292] = 0.000000000000000;
 
32399
    A[293] = 0.000000000000000;
 
32400
    A[294] = 0.000000000000000;
 
32401
    A[295] = 0.000000000000000;
 
32402
    A[296] = 0.000000000000000;
 
32403
    A[297] = 0.000000000000000;
 
32404
    A[298] = 0.000000000000000;
 
32405
    A[299] = 0.000000000000000;
 
32406
    A[300] = 0.000000000000000;
 
32407
    A[301] = 0.000000000000000;
 
32408
    A[302] = -0.033333333333333*G4_0 + 0.033333333333333*G4_1 - 0.033333333333333*G4_2;
 
32409
    A[303] = -0.033333333333333*G4_0 - 0.033333333333333*G4_2;
 
32410
    A[304] = -0.066666666666666*G4_0 - 0.033333333333333*G4_1 - 0.066666666666666*G4_2;
 
32411
    A[305] = -0.033333333333333*G4_0 - 0.033333333333333*G4_2;
 
32412
    A[306] = -0.133333333333333*G7_0_0 - 0.133333333333333*G7_0_1 - 0.133333333333333*G7_0_2 - 0.033333333333333*G7_1_0 - 0.033333333333333*G7_1_1 - 0.033333333333333*G7_1_2 - 0.033333333333333*G7_2_0 - 0.033333333333333*G7_2_1 - 0.033333333333333*G7_2_2 - 0.133333333333333*G10_0_0 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_0_2 - 0.033333333333333*G10_1_0 - 0.033333333333333*G10_1_1 - 0.033333333333333*G10_1_2 - 0.033333333333333*G10_2_0 - 0.033333333333333*G10_2_1 - 0.033333333333333*G10_2_2 - 0.133333333333333*G13_0_0 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_0_2 - 0.033333333333333*G13_1_0 - 0.033333333333333*G13_1_1 - 0.033333333333333*G13_1_2 - 0.033333333333333*G13_2_0 - 0.033333333333333*G13_2_1 - 0.033333333333333*G13_2_2;
 
32413
    A[307] = -0.133333333333333*G7_0_0 - 0.100000000000000*G7_1_0 - 0.100000000000000*G7_2_0 - 0.133333333333333*G10_0_0 - 0.100000000000000*G10_1_0 - 0.100000000000000*G10_2_0 - 0.133333333333333*G13_0_0 - 0.100000000000000*G13_1_0 - 0.100000000000000*G13_2_0;
 
32414
    A[308] = 0.033333333333333*G7_1_1 + 0.033333333333333*G7_2_1 + 0.033333333333333*G10_1_1 + 0.033333333333333*G10_2_1 + 0.033333333333333*G13_1_1 + 0.033333333333333*G13_2_1;
 
32415
    A[309] = 0.033333333333333*G7_1_2 + 0.033333333333333*G7_2_2 + 0.033333333333333*G10_1_2 + 0.033333333333333*G10_2_2 + 0.033333333333333*G13_1_2 + 0.033333333333333*G13_2_2;
 
32416
    A[310] = -0.133333333333333*G7_1_1 - 0.133333333333333*G7_1_2 - 0.133333333333333*G7_2_1 - 0.133333333333333*G7_2_2 - 0.133333333333333*G10_1_1 - 0.133333333333333*G10_1_2 - 0.133333333333333*G10_2_1 - 0.133333333333333*G10_2_2 - 0.133333333333333*G13_1_1 - 0.133333333333333*G13_1_2 - 0.133333333333333*G13_2_1 - 0.133333333333333*G13_2_2;
 
32417
    A[311] = -0.133333333333333*G7_0_2 - 0.133333333333333*G7_1_0 - 0.266666666666666*G7_1_2 - 0.133333333333333*G7_2_0 - 0.266666666666666*G7_2_2 - 0.133333333333333*G10_0_2 - 0.133333333333333*G10_1_0 - 0.266666666666666*G10_1_2 - 0.133333333333333*G10_2_0 - 0.266666666666666*G10_2_2 - 0.133333333333333*G13_0_2 - 0.133333333333333*G13_1_0 - 0.266666666666666*G13_1_2 - 0.133333333333333*G13_2_0 - 0.266666666666666*G13_2_2;
 
32418
    A[312] = -0.133333333333333*G7_0_1 - 0.133333333333333*G7_1_0 - 0.266666666666666*G7_1_1 - 0.133333333333333*G7_2_0 - 0.266666666666666*G7_2_1 - 0.133333333333333*G10_0_1 - 0.133333333333333*G10_1_0 - 0.266666666666666*G10_1_1 - 0.133333333333333*G10_2_0 - 0.266666666666666*G10_2_1 - 0.133333333333333*G13_0_1 - 0.133333333333333*G13_1_0 - 0.266666666666666*G13_1_1 - 0.133333333333333*G13_2_0 - 0.266666666666666*G13_2_1;
 
32419
    A[313] = 0.133333333333333*G7_0_2 + 0.133333333333333*G7_1_0 + 0.133333333333333*G7_1_1 + 0.133333333333333*G7_2_0 + 0.133333333333333*G7_2_1 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_1_0 + 0.133333333333333*G10_1_1 + 0.133333333333333*G10_2_0 + 0.133333333333333*G10_2_1 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_1_0 + 0.133333333333333*G13_1_1 + 0.133333333333333*G13_2_0 + 0.133333333333333*G13_2_1;
 
32420
    A[314] = 0.133333333333333*G7_0_1 + 0.133333333333333*G7_1_0 + 0.133333333333333*G7_1_2 + 0.133333333333333*G7_2_0 + 0.133333333333333*G7_2_2 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_1_0 + 0.133333333333333*G10_1_2 + 0.133333333333333*G10_2_0 + 0.133333333333333*G10_2_2 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_1_0 + 0.133333333333333*G13_1_2 + 0.133333333333333*G13_2_0 + 0.133333333333333*G13_2_2;
 
32421
    A[315] = 0.266666666666666*G7_0_0 + 0.133333333333333*G7_0_1 + 0.133333333333333*G7_0_2 + 0.133333333333333*G7_1_0 + 0.266666666666666*G7_1_1 + 0.266666666666666*G7_1_2 + 0.133333333333333*G7_2_0 + 0.266666666666666*G7_2_1 + 0.266666666666666*G7_2_2 + 0.266666666666666*G10_0_0 + 0.133333333333333*G10_0_1 + 0.133333333333333*G10_0_2 + 0.133333333333333*G10_1_0 + 0.266666666666666*G10_1_1 + 0.266666666666666*G10_1_2 + 0.133333333333333*G10_2_0 + 0.266666666666666*G10_2_1 + 0.266666666666666*G10_2_2 + 0.266666666666666*G13_0_0 + 0.133333333333333*G13_0_1 + 0.133333333333333*G13_0_2 + 0.133333333333333*G13_1_0 + 0.266666666666666*G13_1_1 + 0.266666666666666*G13_1_2 + 0.133333333333333*G13_2_0 + 0.266666666666666*G13_2_1 + 0.266666666666666*G13_2_2;
 
32422
    A[316] = 0.000000000000000;
 
32423
    A[317] = 0.000000000000000;
 
32424
    A[318] = 0.000000000000000;
 
32425
    A[319] = 0.000000000000000;
 
32426
    A[320] = 0.000000000000000;
 
32427
    A[321] = 0.000000000000000;
 
32428
    A[322] = 0.000000000000000;
 
32429
    A[323] = 0.000000000000000;
 
32430
    A[324] = 0.000000000000000;
 
32431
    A[325] = 0.000000000000000;
 
32432
    A[326] = 0.000000000000000;
 
32433
    A[327] = 0.000000000000000;
 
32434
    A[328] = 0.000000000000000;
 
32435
    A[329] = 0.000000000000000;
 
32436
    A[330] = 0.000000000000000;
 
32437
    A[331] = 0.000000000000000;
 
32438
    A[332] = 0.000000000000000;
 
32439
    A[333] = 0.000000000000000;
 
32440
    A[334] = 0.000000000000000;
 
32441
    A[335] = 0.000000000000000;
 
32442
    A[336] = 0.033333333333333*G4_0 - 0.033333333333333*G4_1 - 0.033333333333333*G4_2;
 
32443
    A[337] = -0.033333333333333*G4_0 - 0.066666666666666*G4_1 - 0.066666666666667*G4_2;
 
32444
    A[338] = -0.033333333333333*G4_1 - 0.033333333333333*G4_2;
 
32445
    A[339] = -0.033333333333333*G4_1 - 0.033333333333333*G4_2;
 
32446
    A[340] = 0.000000000000000;
 
32447
    A[341] = 0.000000000000000;
 
32448
    A[342] = 0.000000000000000;
 
32449
    A[343] = 0.000000000000000;
 
32450
    A[344] = 0.000000000000000;
 
32451
    A[345] = 0.000000000000000;
 
32452
    A[346] = 0.000000000000000;
 
32453
    A[347] = 0.000000000000000;
 
32454
    A[348] = 0.000000000000000;
 
32455
    A[349] = 0.000000000000000;
 
32456
    A[350] = 0.100000000000000*G8_0_0 + 0.100000000000000*G8_0_1 + 0.100000000000000*G8_0_2 + 0.100000000000000*G8_1_0 + 0.100000000000000*G8_1_1 + 0.100000000000000*G8_1_2 + 0.100000000000000*G8_2_0 + 0.100000000000000*G8_2_1 + 0.100000000000000*G8_2_2 + 0.100000000000000*G11_0_0 + 0.100000000000000*G11_0_1 + 0.100000000000000*G11_0_2 + 0.100000000000000*G11_1_0 + 0.100000000000000*G11_1_1 + 0.100000000000000*G11_1_2 + 0.100000000000000*G11_2_0 + 0.100000000000000*G11_2_1 + 0.100000000000000*G11_2_2 + 0.100000000000000*G14_0_0 + 0.100000000000000*G14_0_1 + 0.100000000000000*G14_0_2 + 0.100000000000000*G14_1_0 + 0.100000000000000*G14_1_1 + 0.100000000000000*G14_1_2 + 0.100000000000000*G14_2_0 + 0.100000000000000*G14_2_1 + 0.100000000000000*G14_2_2;
 
32457
    A[351] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_1_0 + 0.033333333333333*G8_2_0 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_2_0 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_2_0;
 
32458
    A[352] = 0.033333333333333*G8_0_1 + 0.033333333333333*G8_1_1 + 0.033333333333333*G8_2_1 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_2_1 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_2_1;
 
32459
    A[353] = 0.033333333333333*G8_0_2 + 0.033333333333333*G8_1_2 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_0_2 + 0.033333333333333*G11_1_2 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_0_2 + 0.033333333333333*G14_1_2 + 0.033333333333333*G14_2_2;
 
32460
    A[354] = 0.033333333333333*G8_0_1 + 0.033333333333333*G8_0_2 + 0.033333333333333*G8_1_1 + 0.033333333333333*G8_1_2 + 0.033333333333333*G8_2_1 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_0_2 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_1_2 + 0.033333333333333*G11_2_1 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_0_2 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_1_2 + 0.033333333333333*G14_2_1 + 0.033333333333333*G14_2_2;
 
32461
    A[355] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_2 + 0.033333333333333*G8_1_0 + 0.033333333333333*G8_1_2 + 0.033333333333333*G8_2_0 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_2 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_1_2 + 0.033333333333333*G11_2_0 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_2 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_1_2 + 0.033333333333333*G14_2_0 + 0.033333333333333*G14_2_2;
 
32462
    A[356] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_1 + 0.033333333333333*G8_1_0 + 0.033333333333333*G8_1_1 + 0.033333333333333*G8_2_0 + 0.033333333333333*G8_2_1 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_2_0 + 0.033333333333333*G11_2_1 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_2_0 + 0.033333333333333*G14_2_1;
 
32463
    A[357] = -0.033333333333333*G8_0_0 - 0.033333333333333*G8_0_1 - 0.133333333333333*G8_0_2 - 0.033333333333333*G8_1_0 - 0.033333333333333*G8_1_1 - 0.133333333333333*G8_1_2 - 0.033333333333333*G8_2_0 - 0.033333333333333*G8_2_1 - 0.133333333333333*G8_2_2 - 0.033333333333333*G11_0_0 - 0.033333333333333*G11_0_1 - 0.133333333333333*G11_0_2 - 0.033333333333333*G11_1_0 - 0.033333333333333*G11_1_1 - 0.133333333333333*G11_1_2 - 0.033333333333333*G11_2_0 - 0.033333333333333*G11_2_1 - 0.133333333333333*G11_2_2 - 0.033333333333333*G14_0_0 - 0.033333333333333*G14_0_1 - 0.133333333333333*G14_0_2 - 0.033333333333333*G14_1_0 - 0.033333333333333*G14_1_1 - 0.133333333333333*G14_1_2 - 0.033333333333333*G14_2_0 - 0.033333333333333*G14_2_1 - 0.133333333333333*G14_2_2;
 
32464
    A[358] = -0.033333333333333*G8_0_0 - 0.133333333333333*G8_0_1 - 0.033333333333333*G8_0_2 - 0.033333333333333*G8_1_0 - 0.133333333333333*G8_1_1 - 0.033333333333333*G8_1_2 - 0.033333333333333*G8_2_0 - 0.133333333333333*G8_2_1 - 0.033333333333333*G8_2_2 - 0.033333333333333*G11_0_0 - 0.133333333333333*G11_0_1 - 0.033333333333333*G11_0_2 - 0.033333333333333*G11_1_0 - 0.133333333333333*G11_1_1 - 0.033333333333333*G11_1_2 - 0.033333333333333*G11_2_0 - 0.133333333333333*G11_2_1 - 0.033333333333333*G11_2_2 - 0.033333333333333*G14_0_0 - 0.133333333333333*G14_0_1 - 0.033333333333333*G14_0_2 - 0.033333333333333*G14_1_0 - 0.133333333333333*G14_1_1 - 0.033333333333333*G14_1_2 - 0.033333333333333*G14_2_0 - 0.133333333333333*G14_2_1 - 0.033333333333333*G14_2_2;
 
32465
    A[359] = -0.133333333333333*G8_0_0 - 0.033333333333333*G8_0_1 - 0.033333333333333*G8_0_2 - 0.133333333333333*G8_1_0 - 0.033333333333333*G8_1_1 - 0.033333333333333*G8_1_2 - 0.133333333333333*G8_2_0 - 0.033333333333333*G8_2_1 - 0.033333333333333*G8_2_2 - 0.133333333333333*G11_0_0 - 0.033333333333333*G11_0_1 - 0.033333333333333*G11_0_2 - 0.133333333333333*G11_1_0 - 0.033333333333333*G11_1_1 - 0.033333333333333*G11_1_2 - 0.133333333333333*G11_2_0 - 0.033333333333333*G11_2_1 - 0.033333333333333*G11_2_2 - 0.133333333333333*G14_0_0 - 0.033333333333333*G14_0_1 - 0.033333333333333*G14_0_2 - 0.133333333333333*G14_1_0 - 0.033333333333333*G14_1_1 - 0.033333333333333*G14_1_2 - 0.133333333333333*G14_2_0 - 0.033333333333333*G14_2_1 - 0.033333333333333*G14_2_2;
 
32466
    A[360] = 0.000000000000000;
 
32467
    A[361] = 0.000000000000000;
 
32468
    A[362] = 0.000000000000000;
 
32469
    A[363] = 0.000000000000000;
 
32470
    A[364] = 0.000000000000000;
 
32471
    A[365] = 0.000000000000000;
 
32472
    A[366] = 0.000000000000000;
 
32473
    A[367] = 0.000000000000000;
 
32474
    A[368] = 0.000000000000000;
 
32475
    A[369] = 0.000000000000000;
 
32476
    A[370] = -0.025000000000000*G5_0 - 0.025000000000000*G5_1 - 0.025000000000000*G5_2;
 
32477
    A[371] = 0.008333333333333*G5_0 + 0.008333333333333*G5_1 + 0.008333333333333*G5_2;
 
32478
    A[372] = 0.008333333333333*G5_0 + 0.008333333333333*G5_1 + 0.008333333333333*G5_2;
 
32479
    A[373] = 0.008333333333333*G5_0 + 0.008333333333333*G5_1 + 0.008333333333333*G5_2;
 
32480
    A[374] = 0.000000000000000;
 
32481
    A[375] = 0.000000000000000;
 
32482
    A[376] = 0.000000000000000;
 
32483
    A[377] = 0.000000000000000;
 
32484
    A[378] = 0.000000000000000;
 
32485
    A[379] = 0.000000000000000;
 
32486
    A[380] = 0.000000000000000;
 
32487
    A[381] = 0.000000000000000;
 
32488
    A[382] = 0.000000000000000;
 
32489
    A[383] = 0.000000000000000;
 
32490
    A[384] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_1 + 0.033333333333333*G8_0_2 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_0_2 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_0_2;
 
32491
    A[385] = 0.100000000000000*G8_0_0 + 0.100000000000000*G11_0_0 + 0.100000000000000*G14_0_0;
 
32492
    A[386] = -0.033333333333333*G8_0_1 - 0.033333333333333*G11_0_1 - 0.033333333333333*G14_0_1;
 
32493
    A[387] = -0.033333333333333*G8_0_2 - 0.033333333333333*G11_0_2 - 0.033333333333333*G14_0_2;
 
32494
    A[388] = -0.033333333333333*G8_0_1 - 0.033333333333333*G8_0_2 - 0.033333333333333*G11_0_1 - 0.033333333333333*G11_0_2 - 0.033333333333333*G14_0_1 - 0.033333333333333*G14_0_2;
 
32495
    A[389] = -0.033333333333333*G8_0_0 + 0.100000000000000*G8_0_2 - 0.033333333333333*G11_0_0 + 0.100000000000000*G11_0_2 - 0.033333333333333*G14_0_0 + 0.100000000000000*G14_0_2;
 
32496
    A[390] = -0.033333333333333*G8_0_0 + 0.100000000000000*G8_0_1 - 0.033333333333333*G11_0_0 + 0.100000000000000*G11_0_1 - 0.033333333333333*G14_0_0 + 0.100000000000000*G14_0_1;
 
32497
    A[391] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_1 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_1 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_1;
 
32498
    A[392] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_2 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_2 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_2;
 
32499
    A[393] = -0.133333333333333*G8_0_0 - 0.100000000000000*G8_0_1 - 0.100000000000000*G8_0_2 - 0.133333333333333*G11_0_0 - 0.100000000000000*G11_0_1 - 0.100000000000000*G11_0_2 - 0.133333333333333*G14_0_0 - 0.100000000000000*G14_0_1 - 0.100000000000000*G14_0_2;
 
32500
    A[394] = 0.000000000000000;
 
32501
    A[395] = 0.000000000000000;
 
32502
    A[396] = 0.000000000000000;
 
32503
    A[397] = 0.000000000000000;
 
32504
    A[398] = 0.000000000000000;
 
32505
    A[399] = 0.000000000000000;
 
32506
    A[400] = 0.000000000000000;
 
32507
    A[401] = 0.000000000000000;
 
32508
    A[402] = 0.000000000000000;
 
32509
    A[403] = 0.000000000000000;
 
32510
    A[404] = -0.008333333333333*G5_0;
 
32511
    A[405] = 0.025000000000000*G5_0;
 
32512
    A[406] = -0.008333333333333*G5_0;
 
32513
    A[407] = -0.008333333333333*G5_0;
 
32514
    A[408] = 0.000000000000000;
 
32515
    A[409] = 0.000000000000000;
 
32516
    A[410] = 0.000000000000000;
 
32517
    A[411] = 0.000000000000000;
 
32518
    A[412] = 0.000000000000000;
 
32519
    A[413] = 0.000000000000000;
 
32520
    A[414] = 0.000000000000000;
 
32521
    A[415] = 0.000000000000000;
 
32522
    A[416] = 0.000000000000000;
 
32523
    A[417] = 0.000000000000000;
 
32524
    A[418] = 0.033333333333333*G8_1_0 + 0.033333333333333*G8_1_1 + 0.033333333333333*G8_1_2 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_1_2 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_1_2;
 
32525
    A[419] = -0.033333333333333*G8_1_0 - 0.033333333333333*G11_1_0 - 0.033333333333333*G14_1_0;
 
32526
    A[420] = 0.100000000000000*G8_1_1 + 0.100000000000000*G11_1_1 + 0.100000000000000*G14_1_1;
 
32527
    A[421] = -0.033333333333333*G8_1_2 - 0.033333333333333*G11_1_2 - 0.033333333333333*G14_1_2;
 
32528
    A[422] = -0.033333333333333*G8_1_1 + 0.100000000000000*G8_1_2 - 0.033333333333333*G11_1_1 + 0.100000000000000*G11_1_2 - 0.033333333333333*G14_1_1 + 0.100000000000000*G14_1_2;
 
32529
    A[423] = -0.033333333333333*G8_1_0 - 0.033333333333333*G8_1_2 - 0.033333333333333*G11_1_0 - 0.033333333333333*G11_1_2 - 0.033333333333333*G14_1_0 - 0.033333333333333*G14_1_2;
 
32530
    A[424] = 0.100000000000000*G8_1_0 - 0.033333333333333*G8_1_1 + 0.100000000000000*G11_1_0 - 0.033333333333333*G11_1_1 + 0.100000000000000*G14_1_0 - 0.033333333333333*G14_1_1;
 
32531
    A[425] = 0.033333333333333*G8_1_0 + 0.033333333333333*G8_1_1 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_1_1 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_1_1;
 
32532
    A[426] = -0.100000000000000*G8_1_0 - 0.133333333333333*G8_1_1 - 0.100000000000000*G8_1_2 - 0.100000000000000*G11_1_0 - 0.133333333333333*G11_1_1 - 0.100000000000000*G11_1_2 - 0.100000000000000*G14_1_0 - 0.133333333333333*G14_1_1 - 0.100000000000000*G14_1_2;
 
32533
    A[427] = 0.033333333333333*G8_1_1 + 0.033333333333333*G8_1_2 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_1_2 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_1_2;
 
32534
    A[428] = 0.000000000000000;
 
32535
    A[429] = 0.000000000000000;
 
32536
    A[430] = 0.000000000000000;
 
32537
    A[431] = 0.000000000000000;
 
32538
    A[432] = 0.000000000000000;
 
32539
    A[433] = 0.000000000000000;
 
32540
    A[434] = 0.000000000000000;
 
32541
    A[435] = 0.000000000000000;
 
32542
    A[436] = 0.000000000000000;
 
32543
    A[437] = 0.000000000000000;
 
32544
    A[438] = -0.008333333333333*G5_1;
 
32545
    A[439] = -0.008333333333333*G5_1;
 
32546
    A[440] = 0.025000000000000*G5_1;
 
32547
    A[441] = -0.008333333333333*G5_1;
 
32548
    A[442] = 0.000000000000000;
 
32549
    A[443] = 0.000000000000000;
 
32550
    A[444] = 0.000000000000000;
 
32551
    A[445] = 0.000000000000000;
 
32552
    A[446] = 0.000000000000000;
 
32553
    A[447] = 0.000000000000000;
 
32554
    A[448] = 0.000000000000000;
 
32555
    A[449] = 0.000000000000000;
 
32556
    A[450] = 0.000000000000000;
 
32557
    A[451] = 0.000000000000000;
 
32558
    A[452] = 0.033333333333333*G8_2_0 + 0.033333333333333*G8_2_1 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_2_0 + 0.033333333333333*G11_2_1 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_2_0 + 0.033333333333333*G14_2_1 + 0.033333333333333*G14_2_2;
 
32559
    A[453] = -0.033333333333333*G8_2_0 - 0.033333333333333*G11_2_0 - 0.033333333333333*G14_2_0;
 
32560
    A[454] = -0.033333333333333*G8_2_1 - 0.033333333333333*G11_2_1 - 0.033333333333333*G14_2_1;
 
32561
    A[455] = 0.100000000000000*G8_2_2 + 0.100000000000000*G11_2_2 + 0.100000000000000*G14_2_2;
 
32562
    A[456] = 0.100000000000000*G8_2_1 - 0.033333333333333*G8_2_2 + 0.100000000000000*G11_2_1 - 0.033333333333333*G11_2_2 + 0.100000000000000*G14_2_1 - 0.033333333333333*G14_2_2;
 
32563
    A[457] = 0.100000000000000*G8_2_0 - 0.033333333333333*G8_2_2 + 0.100000000000000*G11_2_0 - 0.033333333333333*G11_2_2 + 0.100000000000000*G14_2_0 - 0.033333333333333*G14_2_2;
 
32564
    A[458] = -0.033333333333333*G8_2_0 - 0.033333333333333*G8_2_1 - 0.033333333333333*G11_2_0 - 0.033333333333333*G11_2_1 - 0.033333333333333*G14_2_0 - 0.033333333333333*G14_2_1;
 
32565
    A[459] = -0.100000000000000*G8_2_0 - 0.100000000000000*G8_2_1 - 0.133333333333333*G8_2_2 - 0.100000000000000*G11_2_0 - 0.100000000000000*G11_2_1 - 0.133333333333333*G11_2_2 - 0.100000000000000*G14_2_0 - 0.100000000000000*G14_2_1 - 0.133333333333333*G14_2_2;
 
32566
    A[460] = 0.033333333333333*G8_2_0 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_2_0 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_2_0 + 0.033333333333333*G14_2_2;
 
32567
    A[461] = 0.033333333333333*G8_2_1 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_2_1 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_2_1 + 0.033333333333333*G14_2_2;
 
32568
    A[462] = 0.000000000000000;
 
32569
    A[463] = 0.000000000000000;
 
32570
    A[464] = 0.000000000000000;
 
32571
    A[465] = 0.000000000000000;
 
32572
    A[466] = 0.000000000000000;
 
32573
    A[467] = 0.000000000000000;
 
32574
    A[468] = 0.000000000000000;
 
32575
    A[469] = 0.000000000000000;
 
32576
    A[470] = 0.000000000000000;
 
32577
    A[471] = 0.000000000000000;
 
32578
    A[472] = -0.008333333333333*G5_2;
 
32579
    A[473] = -0.008333333333333*G5_2;
 
32580
    A[474] = -0.008333333333333*G5_2;
 
32581
    A[475] = 0.025000000000000*G5_2;
 
32582
    A[476] = 0.000000000000000;
 
32583
    A[477] = 0.000000000000000;
 
32584
    A[478] = 0.000000000000000;
 
32585
    A[479] = 0.000000000000000;
 
32586
    A[480] = 0.000000000000000;
 
32587
    A[481] = 0.000000000000000;
 
32588
    A[482] = 0.000000000000000;
 
32589
    A[483] = 0.000000000000000;
 
32590
    A[484] = 0.000000000000000;
 
32591
    A[485] = 0.000000000000000;
 
32592
    A[486] = 0.033333333333333*G8_1_0 + 0.033333333333333*G8_1_1 + 0.033333333333333*G8_1_2 + 0.033333333333333*G8_2_0 + 0.033333333333333*G8_2_1 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_1_2 + 0.033333333333333*G11_2_0 + 0.033333333333333*G11_2_1 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_1_2 + 0.033333333333333*G14_2_0 + 0.033333333333333*G14_2_1 + 0.033333333333333*G14_2_2;
 
32593
    A[487] = -0.033333333333333*G8_1_0 - 0.033333333333333*G8_2_0 - 0.033333333333333*G11_1_0 - 0.033333333333333*G11_2_0 - 0.033333333333333*G14_1_0 - 0.033333333333333*G14_2_0;
 
32594
    A[488] = -0.033333333333333*G8_1_1 + 0.100000000000000*G8_2_1 - 0.033333333333333*G11_1_1 + 0.100000000000000*G11_2_1 - 0.033333333333333*G14_1_1 + 0.100000000000000*G14_2_1;
 
32595
    A[489] = 0.100000000000000*G8_1_2 - 0.033333333333333*G8_2_2 + 0.100000000000000*G11_1_2 - 0.033333333333333*G11_2_2 + 0.100000000000000*G14_1_2 - 0.033333333333333*G14_2_2;
 
32596
    A[490] = 0.266666666666666*G8_1_1 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_1 + 0.266666666666666*G8_2_2 + 0.266666666666666*G11_1_1 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_1 + 0.266666666666666*G11_2_2 + 0.266666666666666*G14_1_1 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_1 + 0.266666666666666*G14_2_2;
 
32597
    A[491] = 0.266666666666666*G8_1_0 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_0 + 0.133333333333333*G8_2_2 + 0.266666666666666*G11_1_0 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_0 + 0.133333333333333*G11_2_2 + 0.266666666666666*G14_1_0 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_0 + 0.133333333333333*G14_2_2;
 
32598
    A[492] = 0.133333333333333*G8_1_0 + 0.133333333333333*G8_1_1 + 0.266666666666666*G8_2_0 + 0.133333333333333*G8_2_1 + 0.133333333333333*G11_1_0 + 0.133333333333333*G11_1_1 + 0.266666666666666*G11_2_0 + 0.133333333333333*G11_2_1 + 0.133333333333333*G14_1_0 + 0.133333333333333*G14_1_1 + 0.266666666666666*G14_2_0 + 0.133333333333333*G14_2_1;
 
32599
    A[493] = -0.266666666666666*G8_1_0 - 0.266666666666666*G8_1_1 - 0.133333333333333*G8_1_2 - 0.133333333333333*G8_2_0 - 0.133333333333333*G8_2_1 - 0.266666666666666*G11_1_0 - 0.266666666666666*G11_1_1 - 0.133333333333333*G11_1_2 - 0.133333333333333*G11_2_0 - 0.133333333333333*G11_2_1 - 0.266666666666666*G14_1_0 - 0.266666666666666*G14_1_1 - 0.133333333333333*G14_1_2 - 0.133333333333333*G14_2_0 - 0.133333333333333*G14_2_1;
 
32600
    A[494] = -0.133333333333333*G8_1_0 - 0.133333333333333*G8_1_2 - 0.266666666666666*G8_2_0 - 0.133333333333333*G8_2_1 - 0.266666666666666*G8_2_2 - 0.133333333333333*G11_1_0 - 0.133333333333333*G11_1_2 - 0.266666666666666*G11_2_0 - 0.133333333333333*G11_2_1 - 0.266666666666666*G11_2_2 - 0.133333333333333*G14_1_0 - 0.133333333333333*G14_1_2 - 0.266666666666666*G14_2_0 - 0.133333333333333*G14_2_1 - 0.266666666666666*G14_2_2;
 
32601
    A[495] = -0.133333333333333*G8_1_1 - 0.133333333333333*G8_1_2 - 0.133333333333333*G8_2_1 - 0.133333333333333*G8_2_2 - 0.133333333333333*G11_1_1 - 0.133333333333333*G11_1_2 - 0.133333333333333*G11_2_1 - 0.133333333333333*G11_2_2 - 0.133333333333333*G14_1_1 - 0.133333333333333*G14_1_2 - 0.133333333333333*G14_2_1 - 0.133333333333333*G14_2_2;
 
32602
    A[496] = 0.000000000000000;
 
32603
    A[497] = 0.000000000000000;
 
32604
    A[498] = 0.000000000000000;
 
32605
    A[499] = 0.000000000000000;
 
32606
    A[500] = 0.000000000000000;
 
32607
    A[501] = 0.000000000000000;
 
32608
    A[502] = 0.000000000000000;
 
32609
    A[503] = 0.000000000000000;
 
32610
    A[504] = 0.000000000000000;
 
32611
    A[505] = 0.000000000000000;
 
32612
    A[506] = 0.033333333333333*G5_1 + 0.033333333333333*G5_2;
 
32613
    A[507] = 0.033333333333333*G5_1 + 0.033333333333333*G5_2;
 
32614
    A[508] = 0.033333333333333*G5_1 + 0.066666666666666*G5_2;
 
32615
    A[509] = 0.066666666666666*G5_1 + 0.033333333333333*G5_2;
 
32616
    A[510] = 0.000000000000000;
 
32617
    A[511] = 0.000000000000000;
 
32618
    A[512] = 0.000000000000000;
 
32619
    A[513] = 0.000000000000000;
 
32620
    A[514] = 0.000000000000000;
 
32621
    A[515] = 0.000000000000000;
 
32622
    A[516] = 0.000000000000000;
 
32623
    A[517] = 0.000000000000000;
 
32624
    A[518] = 0.000000000000000;
 
32625
    A[519] = 0.000000000000000;
 
32626
    A[520] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_1 + 0.033333333333333*G8_0_2 + 0.033333333333333*G8_2_0 + 0.033333333333333*G8_2_1 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_0_2 + 0.033333333333333*G11_2_0 + 0.033333333333333*G11_2_1 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_0_2 + 0.033333333333333*G14_2_0 + 0.033333333333333*G14_2_1 + 0.033333333333333*G14_2_2;
 
32627
    A[521] = -0.033333333333333*G8_0_0 + 0.100000000000000*G8_2_0 - 0.033333333333333*G11_0_0 + 0.100000000000000*G11_2_0 - 0.033333333333333*G14_0_0 + 0.100000000000000*G14_2_0;
 
32628
    A[522] = -0.033333333333333*G8_0_1 - 0.033333333333333*G8_2_1 - 0.033333333333333*G11_0_1 - 0.033333333333333*G11_2_1 - 0.033333333333333*G14_0_1 - 0.033333333333333*G14_2_1;
 
32629
    A[523] = 0.100000000000000*G8_0_2 - 0.033333333333333*G8_2_2 + 0.100000000000000*G11_0_2 - 0.033333333333333*G11_2_2 + 0.100000000000000*G14_0_2 - 0.033333333333333*G14_2_2;
 
32630
    A[524] = 0.266666666666666*G8_0_1 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_2_1 + 0.133333333333333*G8_2_2 + 0.266666666666666*G11_0_1 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_2_1 + 0.133333333333333*G11_2_2 + 0.266666666666666*G14_0_1 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_2_1 + 0.133333333333333*G14_2_2;
 
32631
    A[525] = 0.266666666666666*G8_0_0 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_2_0 + 0.266666666666666*G8_2_2 + 0.266666666666666*G11_0_0 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_2_0 + 0.266666666666666*G11_2_2 + 0.266666666666666*G14_0_0 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_2_0 + 0.266666666666666*G14_2_2;
 
32632
    A[526] = 0.133333333333333*G8_0_0 + 0.133333333333333*G8_0_1 + 0.133333333333333*G8_2_0 + 0.266666666666666*G8_2_1 + 0.133333333333333*G11_0_0 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_2_0 + 0.266666666666666*G11_2_1 + 0.133333333333333*G14_0_0 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_2_0 + 0.266666666666666*G14_2_1;
 
32633
    A[527] = -0.266666666666666*G8_0_0 - 0.266666666666666*G8_0_1 - 0.133333333333333*G8_0_2 - 0.133333333333333*G8_2_0 - 0.133333333333333*G8_2_1 - 0.266666666666666*G11_0_0 - 0.266666666666666*G11_0_1 - 0.133333333333333*G11_0_2 - 0.133333333333333*G11_2_0 - 0.133333333333333*G11_2_1 - 0.266666666666666*G14_0_0 - 0.266666666666666*G14_0_1 - 0.133333333333333*G14_0_2 - 0.133333333333333*G14_2_0 - 0.133333333333333*G14_2_1;
 
32634
    A[528] = -0.133333333333333*G8_0_0 - 0.133333333333333*G8_0_2 - 0.133333333333333*G8_2_0 - 0.133333333333333*G8_2_2 - 0.133333333333333*G11_0_0 - 0.133333333333333*G11_0_2 - 0.133333333333333*G11_2_0 - 0.133333333333333*G11_2_2 - 0.133333333333333*G14_0_0 - 0.133333333333333*G14_0_2 - 0.133333333333333*G14_2_0 - 0.133333333333333*G14_2_2;
 
32635
    A[529] = -0.133333333333333*G8_0_1 - 0.133333333333333*G8_0_2 - 0.133333333333333*G8_2_0 - 0.266666666666666*G8_2_1 - 0.266666666666666*G8_2_2 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_0_2 - 0.133333333333333*G11_2_0 - 0.266666666666666*G11_2_1 - 0.266666666666666*G11_2_2 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_0_2 - 0.133333333333333*G14_2_0 - 0.266666666666666*G14_2_1 - 0.266666666666666*G14_2_2;
 
32636
    A[530] = 0.000000000000000;
 
32637
    A[531] = 0.000000000000000;
 
32638
    A[532] = 0.000000000000000;
 
32639
    A[533] = 0.000000000000000;
 
32640
    A[534] = 0.000000000000000;
 
32641
    A[535] = 0.000000000000000;
 
32642
    A[536] = 0.000000000000000;
 
32643
    A[537] = 0.000000000000000;
 
32644
    A[538] = 0.000000000000000;
 
32645
    A[539] = 0.000000000000000;
 
32646
    A[540] = 0.033333333333333*G5_0 + 0.033333333333333*G5_2;
 
32647
    A[541] = 0.033333333333333*G5_0 + 0.066666666666667*G5_2;
 
32648
    A[542] = 0.033333333333333*G5_0 + 0.033333333333333*G5_2;
 
32649
    A[543] = 0.066666666666667*G5_0 + 0.033333333333333*G5_2;
 
32650
    A[544] = 0.000000000000000;
 
32651
    A[545] = 0.000000000000000;
 
32652
    A[546] = 0.000000000000000;
 
32653
    A[547] = 0.000000000000000;
 
32654
    A[548] = 0.000000000000000;
 
32655
    A[549] = 0.000000000000000;
 
32656
    A[550] = 0.000000000000000;
 
32657
    A[551] = 0.000000000000000;
 
32658
    A[552] = 0.000000000000000;
 
32659
    A[553] = 0.000000000000000;
 
32660
    A[554] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_0_1 + 0.033333333333333*G8_0_2 + 0.033333333333333*G8_1_0 + 0.033333333333333*G8_1_1 + 0.033333333333333*G8_1_2 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_0_2 + 0.033333333333333*G11_1_0 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_1_2 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_0_2 + 0.033333333333333*G14_1_0 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_1_2;
 
32661
    A[555] = -0.033333333333333*G8_0_0 + 0.100000000000000*G8_1_0 - 0.033333333333333*G11_0_0 + 0.100000000000000*G11_1_0 - 0.033333333333333*G14_0_0 + 0.100000000000000*G14_1_0;
 
32662
    A[556] = 0.100000000000000*G8_0_1 - 0.033333333333333*G8_1_1 + 0.100000000000000*G11_0_1 - 0.033333333333333*G11_1_1 + 0.100000000000000*G14_0_1 - 0.033333333333333*G14_1_1;
 
32663
    A[557] = -0.033333333333333*G8_0_2 - 0.033333333333333*G8_1_2 - 0.033333333333333*G11_0_2 - 0.033333333333333*G11_1_2 - 0.033333333333333*G14_0_2 - 0.033333333333333*G14_1_2;
 
32664
    A[558] = 0.133333333333333*G8_0_1 + 0.266666666666666*G8_0_2 + 0.133333333333333*G8_1_1 + 0.133333333333333*G8_1_2 + 0.133333333333333*G11_0_1 + 0.266666666666666*G11_0_2 + 0.133333333333333*G11_1_1 + 0.133333333333333*G11_1_2 + 0.133333333333333*G14_0_1 + 0.266666666666666*G14_0_2 + 0.133333333333333*G14_1_1 + 0.133333333333333*G14_1_2;
 
32665
    A[559] = 0.133333333333333*G8_0_0 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_1_0 + 0.266666666666666*G8_1_2 + 0.133333333333333*G11_0_0 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_1_0 + 0.266666666666666*G11_1_2 + 0.133333333333333*G14_0_0 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_1_0 + 0.266666666666666*G14_1_2;
 
32666
    A[560] = 0.266666666666666*G8_0_0 + 0.133333333333333*G8_0_1 + 0.133333333333333*G8_1_0 + 0.266666666666666*G8_1_1 + 0.266666666666666*G11_0_0 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_1_0 + 0.266666666666666*G11_1_1 + 0.266666666666666*G14_0_0 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_1_0 + 0.266666666666666*G14_1_1;
 
32667
    A[561] = -0.133333333333333*G8_0_0 - 0.133333333333333*G8_0_1 - 0.133333333333333*G8_1_0 - 0.133333333333333*G8_1_1 - 0.133333333333333*G11_0_0 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_1_0 - 0.133333333333333*G11_1_1 - 0.133333333333333*G14_0_0 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_1_0 - 0.133333333333333*G14_1_1;
 
32668
    A[562] = -0.266666666666666*G8_0_0 - 0.133333333333333*G8_0_1 - 0.266666666666666*G8_0_2 - 0.133333333333333*G8_1_0 - 0.133333333333333*G8_1_2 - 0.266666666666666*G11_0_0 - 0.133333333333333*G11_0_1 - 0.266666666666666*G11_0_2 - 0.133333333333333*G11_1_0 - 0.133333333333333*G11_1_2 - 0.266666666666666*G14_0_0 - 0.133333333333333*G14_0_1 - 0.266666666666666*G14_0_2 - 0.133333333333333*G14_1_0 - 0.133333333333333*G14_1_2;
 
32669
    A[563] = -0.133333333333333*G8_0_1 - 0.133333333333333*G8_0_2 - 0.133333333333333*G8_1_0 - 0.266666666666666*G8_1_1 - 0.266666666666666*G8_1_2 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_0_2 - 0.133333333333333*G11_1_0 - 0.266666666666666*G11_1_1 - 0.266666666666666*G11_1_2 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_0_2 - 0.133333333333333*G14_1_0 - 0.266666666666666*G14_1_1 - 0.266666666666666*G14_1_2;
 
32670
    A[564] = 0.000000000000000;
 
32671
    A[565] = 0.000000000000000;
 
32672
    A[566] = 0.000000000000000;
 
32673
    A[567] = 0.000000000000000;
 
32674
    A[568] = 0.000000000000000;
 
32675
    A[569] = 0.000000000000000;
 
32676
    A[570] = 0.000000000000000;
 
32677
    A[571] = 0.000000000000000;
 
32678
    A[572] = 0.000000000000000;
 
32679
    A[573] = 0.000000000000000;
 
32680
    A[574] = 0.033333333333333*G5_0 + 0.033333333333333*G5_1;
 
32681
    A[575] = 0.033333333333333*G5_0 + 0.066666666666667*G5_1;
 
32682
    A[576] = 0.066666666666666*G5_0 + 0.033333333333333*G5_1;
 
32683
    A[577] = 0.033333333333333*G5_0 + 0.033333333333333*G5_1;
 
32684
    A[578] = 0.000000000000000;
 
32685
    A[579] = 0.000000000000000;
 
32686
    A[580] = 0.000000000000000;
 
32687
    A[581] = 0.000000000000000;
 
32688
    A[582] = 0.000000000000000;
 
32689
    A[583] = 0.000000000000000;
 
32690
    A[584] = 0.000000000000000;
 
32691
    A[585] = 0.000000000000000;
 
32692
    A[586] = 0.000000000000000;
 
32693
    A[587] = 0.000000000000000;
 
32694
    A[588] = -0.033333333333333*G8_0_0 - 0.033333333333333*G8_0_1 - 0.033333333333333*G8_0_2 - 0.033333333333333*G8_1_0 - 0.033333333333333*G8_1_1 - 0.033333333333333*G8_1_2 - 0.133333333333333*G8_2_0 - 0.133333333333333*G8_2_1 - 0.133333333333333*G8_2_2 - 0.033333333333333*G11_0_0 - 0.033333333333333*G11_0_1 - 0.033333333333333*G11_0_2 - 0.033333333333333*G11_1_0 - 0.033333333333333*G11_1_1 - 0.033333333333333*G11_1_2 - 0.133333333333333*G11_2_0 - 0.133333333333333*G11_2_1 - 0.133333333333333*G11_2_2 - 0.033333333333333*G14_0_0 - 0.033333333333333*G14_0_1 - 0.033333333333333*G14_0_2 - 0.033333333333333*G14_1_0 - 0.033333333333333*G14_1_1 - 0.033333333333333*G14_1_2 - 0.133333333333333*G14_2_0 - 0.133333333333333*G14_2_1 - 0.133333333333333*G14_2_2;
 
32695
    A[589] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_1_0 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_1_0 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_1_0;
 
32696
    A[590] = 0.033333333333333*G8_0_1 + 0.033333333333333*G8_1_1 + 0.033333333333333*G11_0_1 + 0.033333333333333*G11_1_1 + 0.033333333333333*G14_0_1 + 0.033333333333333*G14_1_1;
 
32697
    A[591] = -0.100000000000000*G8_0_2 - 0.100000000000000*G8_1_2 - 0.133333333333333*G8_2_2 - 0.100000000000000*G11_0_2 - 0.100000000000000*G11_1_2 - 0.133333333333333*G11_2_2 - 0.100000000000000*G14_0_2 - 0.100000000000000*G14_1_2 - 0.133333333333333*G14_2_2;
 
32698
    A[592] = -0.266666666666666*G8_0_1 - 0.133333333333333*G8_0_2 - 0.266666666666666*G8_1_1 - 0.133333333333333*G8_1_2 - 0.133333333333333*G8_2_1 - 0.266666666666666*G11_0_1 - 0.133333333333333*G11_0_2 - 0.266666666666666*G11_1_1 - 0.133333333333333*G11_1_2 - 0.133333333333333*G11_2_1 - 0.266666666666666*G14_0_1 - 0.133333333333333*G14_0_2 - 0.266666666666666*G14_1_1 - 0.133333333333333*G14_1_2 - 0.133333333333333*G14_2_1;
 
32699
    A[593] = -0.266666666666666*G8_0_0 - 0.133333333333333*G8_0_2 - 0.266666666666666*G8_1_0 - 0.133333333333333*G8_1_2 - 0.133333333333333*G8_2_0 - 0.266666666666666*G11_0_0 - 0.133333333333333*G11_0_2 - 0.266666666666666*G11_1_0 - 0.133333333333333*G11_1_2 - 0.133333333333333*G11_2_0 - 0.266666666666666*G14_0_0 - 0.133333333333333*G14_0_2 - 0.266666666666666*G14_1_0 - 0.133333333333333*G14_1_2 - 0.133333333333333*G14_2_0;
 
32700
    A[594] = -0.133333333333333*G8_0_0 - 0.133333333333333*G8_0_1 - 0.133333333333333*G8_1_0 - 0.133333333333333*G8_1_1 - 0.133333333333333*G11_0_0 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_1_0 - 0.133333333333333*G11_1_1 - 0.133333333333333*G14_0_0 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_1_0 - 0.133333333333333*G14_1_1;
 
32701
    A[595] = 0.266666666666666*G8_0_0 + 0.266666666666666*G8_0_1 + 0.133333333333333*G8_0_2 + 0.266666666666666*G8_1_0 + 0.266666666666666*G8_1_1 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_0 + 0.133333333333333*G8_2_1 + 0.266666666666666*G8_2_2 + 0.266666666666666*G11_0_0 + 0.266666666666666*G11_0_1 + 0.133333333333333*G11_0_2 + 0.266666666666666*G11_1_0 + 0.266666666666666*G11_1_1 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_0 + 0.133333333333333*G11_2_1 + 0.266666666666666*G11_2_2 + 0.266666666666666*G14_0_0 + 0.266666666666666*G14_0_1 + 0.133333333333333*G14_0_2 + 0.266666666666666*G14_1_0 + 0.266666666666666*G14_1_1 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_0 + 0.133333333333333*G14_2_1 + 0.266666666666666*G14_2_2;
 
32702
    A[596] = 0.133333333333333*G8_0_0 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_1_0 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_1 + 0.133333333333333*G11_0_0 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_1_0 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_1 + 0.133333333333333*G14_0_0 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_1_0 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_1;
 
32703
    A[597] = 0.133333333333333*G8_0_1 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_1_1 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_0 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_1_1 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_0 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_1_1 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_0;
 
32704
    A[598] = 0.000000000000000;
 
32705
    A[599] = 0.000000000000000;
 
32706
    A[600] = 0.000000000000000;
 
32707
    A[601] = 0.000000000000000;
 
32708
    A[602] = 0.000000000000000;
 
32709
    A[603] = 0.000000000000000;
 
32710
    A[604] = 0.000000000000000;
 
32711
    A[605] = 0.000000000000000;
 
32712
    A[606] = 0.000000000000000;
 
32713
    A[607] = 0.000000000000000;
 
32714
    A[608] = -0.033333333333333*G5_0 - 0.033333333333333*G5_1 + 0.033333333333333*G5_2;
 
32715
    A[609] = -0.033333333333333*G5_0 - 0.033333333333333*G5_1;
 
32716
    A[610] = -0.033333333333333*G5_0 - 0.033333333333333*G5_1;
 
32717
    A[611] = -0.066666666666667*G5_0 - 0.066666666666666*G5_1 - 0.033333333333333*G5_2;
 
32718
    A[612] = 0.000000000000000;
 
32719
    A[613] = 0.000000000000000;
 
32720
    A[614] = 0.000000000000000;
 
32721
    A[615] = 0.000000000000000;
 
32722
    A[616] = 0.000000000000000;
 
32723
    A[617] = 0.000000000000000;
 
32724
    A[618] = 0.000000000000000;
 
32725
    A[619] = 0.000000000000000;
 
32726
    A[620] = 0.000000000000000;
 
32727
    A[621] = 0.000000000000000;
 
32728
    A[622] = -0.033333333333333*G8_0_0 - 0.033333333333333*G8_0_1 - 0.033333333333333*G8_0_2 - 0.133333333333333*G8_1_0 - 0.133333333333333*G8_1_1 - 0.133333333333333*G8_1_2 - 0.033333333333333*G8_2_0 - 0.033333333333333*G8_2_1 - 0.033333333333333*G8_2_2 - 0.033333333333333*G11_0_0 - 0.033333333333333*G11_0_1 - 0.033333333333333*G11_0_2 - 0.133333333333333*G11_1_0 - 0.133333333333333*G11_1_1 - 0.133333333333333*G11_1_2 - 0.033333333333333*G11_2_0 - 0.033333333333333*G11_2_1 - 0.033333333333333*G11_2_2 - 0.033333333333333*G14_0_0 - 0.033333333333333*G14_0_1 - 0.033333333333333*G14_0_2 - 0.133333333333333*G14_1_0 - 0.133333333333333*G14_1_1 - 0.133333333333333*G14_1_2 - 0.033333333333333*G14_2_0 - 0.033333333333333*G14_2_1 - 0.033333333333333*G14_2_2;
 
32729
    A[623] = 0.033333333333333*G8_0_0 + 0.033333333333333*G8_2_0 + 0.033333333333333*G11_0_0 + 0.033333333333333*G11_2_0 + 0.033333333333333*G14_0_0 + 0.033333333333333*G14_2_0;
 
32730
    A[624] = -0.100000000000000*G8_0_1 - 0.133333333333333*G8_1_1 - 0.100000000000000*G8_2_1 - 0.100000000000000*G11_0_1 - 0.133333333333333*G11_1_1 - 0.100000000000000*G11_2_1 - 0.100000000000000*G14_0_1 - 0.133333333333333*G14_1_1 - 0.100000000000000*G14_2_1;
 
32731
    A[625] = 0.033333333333333*G8_0_2 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_0_2 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_0_2 + 0.033333333333333*G14_2_2;
 
32732
    A[626] = -0.133333333333333*G8_0_1 - 0.266666666666666*G8_0_2 - 0.133333333333333*G8_1_2 - 0.133333333333333*G8_2_1 - 0.266666666666666*G8_2_2 - 0.133333333333333*G11_0_1 - 0.266666666666666*G11_0_2 - 0.133333333333333*G11_1_2 - 0.133333333333333*G11_2_1 - 0.266666666666666*G11_2_2 - 0.133333333333333*G14_0_1 - 0.266666666666666*G14_0_2 - 0.133333333333333*G14_1_2 - 0.133333333333333*G14_2_1 - 0.266666666666666*G14_2_2;
 
32733
    A[627] = -0.133333333333333*G8_0_0 - 0.133333333333333*G8_0_2 - 0.133333333333333*G8_2_0 - 0.133333333333333*G8_2_2 - 0.133333333333333*G11_0_0 - 0.133333333333333*G11_0_2 - 0.133333333333333*G11_2_0 - 0.133333333333333*G11_2_2 - 0.133333333333333*G14_0_0 - 0.133333333333333*G14_0_2 - 0.133333333333333*G14_2_0 - 0.133333333333333*G14_2_2;
 
32734
    A[628] = -0.266666666666666*G8_0_0 - 0.133333333333333*G8_0_1 - 0.133333333333333*G8_1_0 - 0.266666666666666*G8_2_0 - 0.133333333333333*G8_2_1 - 0.266666666666666*G11_0_0 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_1_0 - 0.266666666666666*G11_2_0 - 0.133333333333333*G11_2_1 - 0.266666666666666*G14_0_0 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_1_0 - 0.266666666666666*G14_2_0 - 0.133333333333333*G14_2_1;
 
32735
    A[629] = 0.133333333333333*G8_0_0 + 0.133333333333333*G8_0_1 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_0 + 0.133333333333333*G8_2_1 + 0.133333333333333*G11_0_0 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_0 + 0.133333333333333*G11_2_1 + 0.133333333333333*G14_0_0 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_0 + 0.133333333333333*G14_2_1;
 
32736
    A[630] = 0.266666666666666*G8_0_0 + 0.133333333333333*G8_0_1 + 0.266666666666666*G8_0_2 + 0.133333333333333*G8_1_0 + 0.266666666666666*G8_1_1 + 0.133333333333333*G8_1_2 + 0.266666666666666*G8_2_0 + 0.133333333333333*G8_2_1 + 0.266666666666666*G8_2_2 + 0.266666666666666*G11_0_0 + 0.133333333333333*G11_0_1 + 0.266666666666666*G11_0_2 + 0.133333333333333*G11_1_0 + 0.266666666666666*G11_1_1 + 0.133333333333333*G11_1_2 + 0.266666666666666*G11_2_0 + 0.133333333333333*G11_2_1 + 0.266666666666666*G11_2_2 + 0.266666666666666*G14_0_0 + 0.133333333333333*G14_0_1 + 0.266666666666666*G14_0_2 + 0.133333333333333*G14_1_0 + 0.266666666666666*G14_1_1 + 0.133333333333333*G14_1_2 + 0.266666666666666*G14_2_0 + 0.133333333333333*G14_2_1 + 0.266666666666666*G14_2_2;
 
32737
    A[631] = 0.133333333333333*G8_0_1 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_1_0 + 0.133333333333333*G8_2_1 + 0.133333333333333*G8_2_2 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_1_0 + 0.133333333333333*G11_2_1 + 0.133333333333333*G11_2_2 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_1_0 + 0.133333333333333*G14_2_1 + 0.133333333333333*G14_2_2;
 
32738
    A[632] = 0.000000000000000;
 
32739
    A[633] = 0.000000000000000;
 
32740
    A[634] = 0.000000000000000;
 
32741
    A[635] = 0.000000000000000;
 
32742
    A[636] = 0.000000000000000;
 
32743
    A[637] = 0.000000000000000;
 
32744
    A[638] = 0.000000000000000;
 
32745
    A[639] = 0.000000000000000;
 
32746
    A[640] = 0.000000000000000;
 
32747
    A[641] = 0.000000000000000;
 
32748
    A[642] = -0.033333333333333*G5_0 + 0.033333333333333*G5_1 - 0.033333333333333*G5_2;
 
32749
    A[643] = -0.033333333333333*G5_0 - 0.033333333333333*G5_2;
 
32750
    A[644] = -0.066666666666666*G5_0 - 0.033333333333333*G5_1 - 0.066666666666666*G5_2;
 
32751
    A[645] = -0.033333333333333*G5_0 - 0.033333333333333*G5_2;
 
32752
    A[646] = 0.000000000000000;
 
32753
    A[647] = 0.000000000000000;
 
32754
    A[648] = 0.000000000000000;
 
32755
    A[649] = 0.000000000000000;
 
32756
    A[650] = 0.000000000000000;
 
32757
    A[651] = 0.000000000000000;
 
32758
    A[652] = 0.000000000000000;
 
32759
    A[653] = 0.000000000000000;
 
32760
    A[654] = 0.000000000000000;
 
32761
    A[655] = 0.000000000000000;
 
32762
    A[656] = -0.133333333333333*G8_0_0 - 0.133333333333333*G8_0_1 - 0.133333333333333*G8_0_2 - 0.033333333333333*G8_1_0 - 0.033333333333333*G8_1_1 - 0.033333333333333*G8_1_2 - 0.033333333333333*G8_2_0 - 0.033333333333333*G8_2_1 - 0.033333333333333*G8_2_2 - 0.133333333333333*G11_0_0 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_0_2 - 0.033333333333333*G11_1_0 - 0.033333333333333*G11_1_1 - 0.033333333333333*G11_1_2 - 0.033333333333333*G11_2_0 - 0.033333333333333*G11_2_1 - 0.033333333333333*G11_2_2 - 0.133333333333333*G14_0_0 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_0_2 - 0.033333333333333*G14_1_0 - 0.033333333333333*G14_1_1 - 0.033333333333333*G14_1_2 - 0.033333333333333*G14_2_0 - 0.033333333333333*G14_2_1 - 0.033333333333333*G14_2_2;
 
32763
    A[657] = -0.133333333333333*G8_0_0 - 0.100000000000000*G8_1_0 - 0.100000000000000*G8_2_0 - 0.133333333333333*G11_0_0 - 0.100000000000000*G11_1_0 - 0.100000000000000*G11_2_0 - 0.133333333333333*G14_0_0 - 0.100000000000000*G14_1_0 - 0.100000000000000*G14_2_0;
 
32764
    A[658] = 0.033333333333333*G8_1_1 + 0.033333333333333*G8_2_1 + 0.033333333333333*G11_1_1 + 0.033333333333333*G11_2_1 + 0.033333333333333*G14_1_1 + 0.033333333333333*G14_2_1;
 
32765
    A[659] = 0.033333333333333*G8_1_2 + 0.033333333333333*G8_2_2 + 0.033333333333333*G11_1_2 + 0.033333333333333*G11_2_2 + 0.033333333333333*G14_1_2 + 0.033333333333333*G14_2_2;
 
32766
    A[660] = -0.133333333333333*G8_1_1 - 0.133333333333333*G8_1_2 - 0.133333333333333*G8_2_1 - 0.133333333333333*G8_2_2 - 0.133333333333333*G11_1_1 - 0.133333333333333*G11_1_2 - 0.133333333333333*G11_2_1 - 0.133333333333333*G11_2_2 - 0.133333333333333*G14_1_1 - 0.133333333333333*G14_1_2 - 0.133333333333333*G14_2_1 - 0.133333333333333*G14_2_2;
 
32767
    A[661] = -0.133333333333333*G8_0_2 - 0.133333333333333*G8_1_0 - 0.266666666666666*G8_1_2 - 0.133333333333333*G8_2_0 - 0.266666666666666*G8_2_2 - 0.133333333333333*G11_0_2 - 0.133333333333333*G11_1_0 - 0.266666666666666*G11_1_2 - 0.133333333333333*G11_2_0 - 0.266666666666666*G11_2_2 - 0.133333333333333*G14_0_2 - 0.133333333333333*G14_1_0 - 0.266666666666666*G14_1_2 - 0.133333333333333*G14_2_0 - 0.266666666666666*G14_2_2;
 
32768
    A[662] = -0.133333333333333*G8_0_1 - 0.133333333333333*G8_1_0 - 0.266666666666666*G8_1_1 - 0.133333333333333*G8_2_0 - 0.266666666666666*G8_2_1 - 0.133333333333333*G11_0_1 - 0.133333333333333*G11_1_0 - 0.266666666666666*G11_1_1 - 0.133333333333333*G11_2_0 - 0.266666666666666*G11_2_1 - 0.133333333333333*G14_0_1 - 0.133333333333333*G14_1_0 - 0.266666666666666*G14_1_1 - 0.133333333333333*G14_2_0 - 0.266666666666666*G14_2_1;
 
32769
    A[663] = 0.133333333333333*G8_0_2 + 0.133333333333333*G8_1_0 + 0.133333333333333*G8_1_1 + 0.133333333333333*G8_2_0 + 0.133333333333333*G8_2_1 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_1_0 + 0.133333333333333*G11_1_1 + 0.133333333333333*G11_2_0 + 0.133333333333333*G11_2_1 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_1_0 + 0.133333333333333*G14_1_1 + 0.133333333333333*G14_2_0 + 0.133333333333333*G14_2_1;
 
32770
    A[664] = 0.133333333333333*G8_0_1 + 0.133333333333333*G8_1_0 + 0.133333333333333*G8_1_2 + 0.133333333333333*G8_2_0 + 0.133333333333333*G8_2_2 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_1_0 + 0.133333333333333*G11_1_2 + 0.133333333333333*G11_2_0 + 0.133333333333333*G11_2_2 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_1_0 + 0.133333333333333*G14_1_2 + 0.133333333333333*G14_2_0 + 0.133333333333333*G14_2_2;
 
32771
    A[665] = 0.266666666666666*G8_0_0 + 0.133333333333333*G8_0_1 + 0.133333333333333*G8_0_2 + 0.133333333333333*G8_1_0 + 0.266666666666666*G8_1_1 + 0.266666666666666*G8_1_2 + 0.133333333333333*G8_2_0 + 0.266666666666666*G8_2_1 + 0.266666666666666*G8_2_2 + 0.266666666666666*G11_0_0 + 0.133333333333333*G11_0_1 + 0.133333333333333*G11_0_2 + 0.133333333333333*G11_1_0 + 0.266666666666666*G11_1_1 + 0.266666666666666*G11_1_2 + 0.133333333333333*G11_2_0 + 0.266666666666666*G11_2_1 + 0.266666666666666*G11_2_2 + 0.266666666666666*G14_0_0 + 0.133333333333333*G14_0_1 + 0.133333333333333*G14_0_2 + 0.133333333333333*G14_1_0 + 0.266666666666666*G14_1_1 + 0.266666666666666*G14_1_2 + 0.133333333333333*G14_2_0 + 0.266666666666666*G14_2_1 + 0.266666666666666*G14_2_2;
 
32772
    A[666] = 0.000000000000000;
 
32773
    A[667] = 0.000000000000000;
 
32774
    A[668] = 0.000000000000000;
 
32775
    A[669] = 0.000000000000000;
 
32776
    A[670] = 0.000000000000000;
 
32777
    A[671] = 0.000000000000000;
 
32778
    A[672] = 0.000000000000000;
 
32779
    A[673] = 0.000000000000000;
 
32780
    A[674] = 0.000000000000000;
 
32781
    A[675] = 0.000000000000000;
 
32782
    A[676] = 0.033333333333333*G5_0 - 0.033333333333333*G5_1 - 0.033333333333333*G5_2;
 
32783
    A[677] = -0.033333333333333*G5_0 - 0.066666666666666*G5_1 - 0.066666666666667*G5_2;
 
32784
    A[678] = -0.033333333333333*G5_1 - 0.033333333333333*G5_2;
 
32785
    A[679] = -0.033333333333333*G5_1 - 0.033333333333333*G5_2;
 
32786
    A[680] = 0.000000000000000;
 
32787
    A[681] = 0.000000000000000;
 
32788
    A[682] = 0.000000000000000;
 
32789
    A[683] = 0.000000000000000;
 
32790
    A[684] = 0.000000000000000;
 
32791
    A[685] = 0.000000000000000;
 
32792
    A[686] = 0.000000000000000;
 
32793
    A[687] = 0.000000000000000;
 
32794
    A[688] = 0.000000000000000;
 
32795
    A[689] = 0.000000000000000;
 
32796
    A[690] = 0.000000000000000;
 
32797
    A[691] = 0.000000000000000;
 
32798
    A[692] = 0.000000000000000;
 
32799
    A[693] = 0.000000000000000;
 
32800
    A[694] = 0.000000000000000;
 
32801
    A[695] = 0.000000000000000;
 
32802
    A[696] = 0.000000000000000;
 
32803
    A[697] = 0.000000000000000;
 
32804
    A[698] = 0.000000000000000;
 
32805
    A[699] = 0.000000000000000;
 
32806
    A[700] = 0.100000000000000*G6_0_0 + 0.100000000000000*G6_0_1 + 0.100000000000000*G6_0_2 + 0.100000000000000*G6_1_0 + 0.100000000000000*G6_1_1 + 0.100000000000000*G6_1_2 + 0.100000000000000*G6_2_0 + 0.100000000000000*G6_2_1 + 0.100000000000000*G6_2_2 + 0.100000000000000*G9_0_0 + 0.100000000000000*G9_0_1 + 0.100000000000000*G9_0_2 + 0.100000000000000*G9_1_0 + 0.100000000000000*G9_1_1 + 0.100000000000000*G9_1_2 + 0.100000000000000*G9_2_0 + 0.100000000000000*G9_2_1 + 0.100000000000000*G9_2_2 + 0.100000000000000*G12_0_0 + 0.100000000000000*G12_0_1 + 0.100000000000000*G12_0_2 + 0.100000000000000*G12_1_0 + 0.100000000000000*G12_1_1 + 0.100000000000000*G12_1_2 + 0.100000000000000*G12_2_0 + 0.100000000000000*G12_2_1 + 0.100000000000000*G12_2_2;
 
32807
    A[701] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_1_0 + 0.033333333333333*G6_2_0 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_2_0 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_2_0;
 
32808
    A[702] = 0.033333333333333*G6_0_1 + 0.033333333333333*G6_1_1 + 0.033333333333333*G6_2_1 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_2_1 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_2_1;
 
32809
    A[703] = 0.033333333333333*G6_0_2 + 0.033333333333333*G6_1_2 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_0_2 + 0.033333333333333*G9_1_2 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_0_2 + 0.033333333333333*G12_1_2 + 0.033333333333333*G12_2_2;
 
32810
    A[704] = 0.033333333333333*G6_0_1 + 0.033333333333333*G6_0_2 + 0.033333333333333*G6_1_1 + 0.033333333333333*G6_1_2 + 0.033333333333333*G6_2_1 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_0_2 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_1_2 + 0.033333333333333*G9_2_1 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_0_2 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_1_2 + 0.033333333333333*G12_2_1 + 0.033333333333333*G12_2_2;
 
32811
    A[705] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_2 + 0.033333333333333*G6_1_0 + 0.033333333333333*G6_1_2 + 0.033333333333333*G6_2_0 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_2 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_1_2 + 0.033333333333333*G9_2_0 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_2 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_1_2 + 0.033333333333333*G12_2_0 + 0.033333333333333*G12_2_2;
 
32812
    A[706] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_1 + 0.033333333333333*G6_1_0 + 0.033333333333333*G6_1_1 + 0.033333333333333*G6_2_0 + 0.033333333333333*G6_2_1 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_2_0 + 0.033333333333333*G9_2_1 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_2_0 + 0.033333333333333*G12_2_1;
 
32813
    A[707] = -0.033333333333333*G6_0_0 - 0.033333333333333*G6_0_1 - 0.133333333333333*G6_0_2 - 0.033333333333333*G6_1_0 - 0.033333333333333*G6_1_1 - 0.133333333333333*G6_1_2 - 0.033333333333333*G6_2_0 - 0.033333333333333*G6_2_1 - 0.133333333333333*G6_2_2 - 0.033333333333333*G9_0_0 - 0.033333333333333*G9_0_1 - 0.133333333333333*G9_0_2 - 0.033333333333333*G9_1_0 - 0.033333333333333*G9_1_1 - 0.133333333333333*G9_1_2 - 0.033333333333333*G9_2_0 - 0.033333333333333*G9_2_1 - 0.133333333333333*G9_2_2 - 0.033333333333333*G12_0_0 - 0.033333333333333*G12_0_1 - 0.133333333333333*G12_0_2 - 0.033333333333333*G12_1_0 - 0.033333333333333*G12_1_1 - 0.133333333333333*G12_1_2 - 0.033333333333333*G12_2_0 - 0.033333333333333*G12_2_1 - 0.133333333333333*G12_2_2;
 
32814
    A[708] = -0.033333333333333*G6_0_0 - 0.133333333333333*G6_0_1 - 0.033333333333333*G6_0_2 - 0.033333333333333*G6_1_0 - 0.133333333333333*G6_1_1 - 0.033333333333333*G6_1_2 - 0.033333333333333*G6_2_0 - 0.133333333333333*G6_2_1 - 0.033333333333333*G6_2_2 - 0.033333333333333*G9_0_0 - 0.133333333333333*G9_0_1 - 0.033333333333333*G9_0_2 - 0.033333333333333*G9_1_0 - 0.133333333333333*G9_1_1 - 0.033333333333333*G9_1_2 - 0.033333333333333*G9_2_0 - 0.133333333333333*G9_2_1 - 0.033333333333333*G9_2_2 - 0.033333333333333*G12_0_0 - 0.133333333333333*G12_0_1 - 0.033333333333333*G12_0_2 - 0.033333333333333*G12_1_0 - 0.133333333333333*G12_1_1 - 0.033333333333333*G12_1_2 - 0.033333333333333*G12_2_0 - 0.133333333333333*G12_2_1 - 0.033333333333333*G12_2_2;
 
32815
    A[709] = -0.133333333333333*G6_0_0 - 0.033333333333333*G6_0_1 - 0.033333333333333*G6_0_2 - 0.133333333333333*G6_1_0 - 0.033333333333333*G6_1_1 - 0.033333333333333*G6_1_2 - 0.133333333333333*G6_2_0 - 0.033333333333333*G6_2_1 - 0.033333333333333*G6_2_2 - 0.133333333333333*G9_0_0 - 0.033333333333333*G9_0_1 - 0.033333333333333*G9_0_2 - 0.133333333333333*G9_1_0 - 0.033333333333333*G9_1_1 - 0.033333333333333*G9_1_2 - 0.133333333333333*G9_2_0 - 0.033333333333333*G9_2_1 - 0.033333333333333*G9_2_2 - 0.133333333333333*G12_0_0 - 0.033333333333333*G12_0_1 - 0.033333333333333*G12_0_2 - 0.133333333333333*G12_1_0 - 0.033333333333333*G12_1_1 - 0.033333333333333*G12_1_2 - 0.133333333333333*G12_2_0 - 0.033333333333333*G12_2_1 - 0.033333333333333*G12_2_2;
 
32816
    A[710] = -0.025000000000000*G3_0 - 0.025000000000000*G3_1 - 0.025000000000000*G3_2;
 
32817
    A[711] = 0.008333333333333*G3_0 + 0.008333333333333*G3_1 + 0.008333333333333*G3_2;
 
32818
    A[712] = 0.008333333333333*G3_0 + 0.008333333333333*G3_1 + 0.008333333333333*G3_2;
 
32819
    A[713] = 0.008333333333333*G3_0 + 0.008333333333333*G3_1 + 0.008333333333333*G3_2;
 
32820
    A[714] = 0.000000000000000;
 
32821
    A[715] = 0.000000000000000;
 
32822
    A[716] = 0.000000000000000;
 
32823
    A[717] = 0.000000000000000;
 
32824
    A[718] = 0.000000000000000;
 
32825
    A[719] = 0.000000000000000;
 
32826
    A[720] = 0.000000000000000;
 
32827
    A[721] = 0.000000000000000;
 
32828
    A[722] = 0.000000000000000;
 
32829
    A[723] = 0.000000000000000;
 
32830
    A[724] = 0.000000000000000;
 
32831
    A[725] = 0.000000000000000;
 
32832
    A[726] = 0.000000000000000;
 
32833
    A[727] = 0.000000000000000;
 
32834
    A[728] = 0.000000000000000;
 
32835
    A[729] = 0.000000000000000;
 
32836
    A[730] = 0.000000000000000;
 
32837
    A[731] = 0.000000000000000;
 
32838
    A[732] = 0.000000000000000;
 
32839
    A[733] = 0.000000000000000;
 
32840
    A[734] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_1 + 0.033333333333333*G6_0_2 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_0_2 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_0_2;
 
32841
    A[735] = 0.100000000000000*G6_0_0 + 0.100000000000000*G9_0_0 + 0.100000000000000*G12_0_0;
 
32842
    A[736] = -0.033333333333333*G6_0_1 - 0.033333333333333*G9_0_1 - 0.033333333333333*G12_0_1;
 
32843
    A[737] = -0.033333333333333*G6_0_2 - 0.033333333333333*G9_0_2 - 0.033333333333333*G12_0_2;
 
32844
    A[738] = -0.033333333333333*G6_0_1 - 0.033333333333333*G6_0_2 - 0.033333333333333*G9_0_1 - 0.033333333333333*G9_0_2 - 0.033333333333333*G12_0_1 - 0.033333333333333*G12_0_2;
 
32845
    A[739] = -0.033333333333333*G6_0_0 + 0.100000000000000*G6_0_2 - 0.033333333333333*G9_0_0 + 0.100000000000000*G9_0_2 - 0.033333333333333*G12_0_0 + 0.100000000000000*G12_0_2;
 
32846
    A[740] = -0.033333333333333*G6_0_0 + 0.100000000000000*G6_0_1 - 0.033333333333333*G9_0_0 + 0.100000000000000*G9_0_1 - 0.033333333333333*G12_0_0 + 0.100000000000000*G12_0_1;
 
32847
    A[741] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_1 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_1 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_1;
 
32848
    A[742] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_2 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_2 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_2;
 
32849
    A[743] = -0.133333333333333*G6_0_0 - 0.100000000000000*G6_0_1 - 0.100000000000000*G6_0_2 - 0.133333333333333*G9_0_0 - 0.100000000000000*G9_0_1 - 0.100000000000000*G9_0_2 - 0.133333333333333*G12_0_0 - 0.100000000000000*G12_0_1 - 0.100000000000000*G12_0_2;
 
32850
    A[744] = -0.008333333333333*G3_0;
 
32851
    A[745] = 0.025000000000000*G3_0;
 
32852
    A[746] = -0.008333333333333*G3_0;
 
32853
    A[747] = -0.008333333333333*G3_0;
 
32854
    A[748] = 0.000000000000000;
 
32855
    A[749] = 0.000000000000000;
 
32856
    A[750] = 0.000000000000000;
 
32857
    A[751] = 0.000000000000000;
 
32858
    A[752] = 0.000000000000000;
 
32859
    A[753] = 0.000000000000000;
 
32860
    A[754] = 0.000000000000000;
 
32861
    A[755] = 0.000000000000000;
 
32862
    A[756] = 0.000000000000000;
 
32863
    A[757] = 0.000000000000000;
 
32864
    A[758] = 0.000000000000000;
 
32865
    A[759] = 0.000000000000000;
 
32866
    A[760] = 0.000000000000000;
 
32867
    A[761] = 0.000000000000000;
 
32868
    A[762] = 0.000000000000000;
 
32869
    A[763] = 0.000000000000000;
 
32870
    A[764] = 0.000000000000000;
 
32871
    A[765] = 0.000000000000000;
 
32872
    A[766] = 0.000000000000000;
 
32873
    A[767] = 0.000000000000000;
 
32874
    A[768] = 0.033333333333333*G6_1_0 + 0.033333333333333*G6_1_1 + 0.033333333333333*G6_1_2 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_1_2 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_1_2;
 
32875
    A[769] = -0.033333333333333*G6_1_0 - 0.033333333333333*G9_1_0 - 0.033333333333333*G12_1_0;
 
32876
    A[770] = 0.100000000000000*G6_1_1 + 0.100000000000000*G9_1_1 + 0.100000000000000*G12_1_1;
 
32877
    A[771] = -0.033333333333333*G6_1_2 - 0.033333333333333*G9_1_2 - 0.033333333333333*G12_1_2;
 
32878
    A[772] = -0.033333333333333*G6_1_1 + 0.100000000000000*G6_1_2 - 0.033333333333333*G9_1_1 + 0.100000000000000*G9_1_2 - 0.033333333333333*G12_1_1 + 0.100000000000000*G12_1_2;
 
32879
    A[773] = -0.033333333333333*G6_1_0 - 0.033333333333333*G6_1_2 - 0.033333333333333*G9_1_0 - 0.033333333333333*G9_1_2 - 0.033333333333333*G12_1_0 - 0.033333333333333*G12_1_2;
 
32880
    A[774] = 0.100000000000000*G6_1_0 - 0.033333333333333*G6_1_1 + 0.100000000000000*G9_1_0 - 0.033333333333333*G9_1_1 + 0.100000000000000*G12_1_0 - 0.033333333333333*G12_1_1;
 
32881
    A[775] = 0.033333333333333*G6_1_0 + 0.033333333333333*G6_1_1 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_1_1 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_1_1;
 
32882
    A[776] = -0.100000000000000*G6_1_0 - 0.133333333333333*G6_1_1 - 0.100000000000000*G6_1_2 - 0.100000000000000*G9_1_0 - 0.133333333333333*G9_1_1 - 0.100000000000000*G9_1_2 - 0.100000000000000*G12_1_0 - 0.133333333333333*G12_1_1 - 0.100000000000000*G12_1_2;
 
32883
    A[777] = 0.033333333333333*G6_1_1 + 0.033333333333333*G6_1_2 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_1_2 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_1_2;
 
32884
    A[778] = -0.008333333333333*G3_1;
 
32885
    A[779] = -0.008333333333333*G3_1;
 
32886
    A[780] = 0.025000000000000*G3_1;
 
32887
    A[781] = -0.008333333333333*G3_1;
 
32888
    A[782] = 0.000000000000000;
 
32889
    A[783] = 0.000000000000000;
 
32890
    A[784] = 0.000000000000000;
 
32891
    A[785] = 0.000000000000000;
 
32892
    A[786] = 0.000000000000000;
 
32893
    A[787] = 0.000000000000000;
 
32894
    A[788] = 0.000000000000000;
 
32895
    A[789] = 0.000000000000000;
 
32896
    A[790] = 0.000000000000000;
 
32897
    A[791] = 0.000000000000000;
 
32898
    A[792] = 0.000000000000000;
 
32899
    A[793] = 0.000000000000000;
 
32900
    A[794] = 0.000000000000000;
 
32901
    A[795] = 0.000000000000000;
 
32902
    A[796] = 0.000000000000000;
 
32903
    A[797] = 0.000000000000000;
 
32904
    A[798] = 0.000000000000000;
 
32905
    A[799] = 0.000000000000000;
 
32906
    A[800] = 0.000000000000000;
 
32907
    A[801] = 0.000000000000000;
 
32908
    A[802] = 0.033333333333333*G6_2_0 + 0.033333333333333*G6_2_1 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_2_0 + 0.033333333333333*G9_2_1 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_2_0 + 0.033333333333333*G12_2_1 + 0.033333333333333*G12_2_2;
 
32909
    A[803] = -0.033333333333333*G6_2_0 - 0.033333333333333*G9_2_0 - 0.033333333333333*G12_2_0;
 
32910
    A[804] = -0.033333333333333*G6_2_1 - 0.033333333333333*G9_2_1 - 0.033333333333333*G12_2_1;
 
32911
    A[805] = 0.100000000000000*G6_2_2 + 0.100000000000000*G9_2_2 + 0.100000000000000*G12_2_2;
 
32912
    A[806] = 0.100000000000000*G6_2_1 - 0.033333333333333*G6_2_2 + 0.100000000000000*G9_2_1 - 0.033333333333333*G9_2_2 + 0.100000000000000*G12_2_1 - 0.033333333333333*G12_2_2;
 
32913
    A[807] = 0.100000000000000*G6_2_0 - 0.033333333333333*G6_2_2 + 0.100000000000000*G9_2_0 - 0.033333333333333*G9_2_2 + 0.100000000000000*G12_2_0 - 0.033333333333333*G12_2_2;
 
32914
    A[808] = -0.033333333333333*G6_2_0 - 0.033333333333333*G6_2_1 - 0.033333333333333*G9_2_0 - 0.033333333333333*G9_2_1 - 0.033333333333333*G12_2_0 - 0.033333333333333*G12_2_1;
 
32915
    A[809] = -0.100000000000000*G6_2_0 - 0.100000000000000*G6_2_1 - 0.133333333333333*G6_2_2 - 0.100000000000000*G9_2_0 - 0.100000000000000*G9_2_1 - 0.133333333333333*G9_2_2 - 0.100000000000000*G12_2_0 - 0.100000000000000*G12_2_1 - 0.133333333333333*G12_2_2;
 
32916
    A[810] = 0.033333333333333*G6_2_0 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_2_0 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_2_0 + 0.033333333333333*G12_2_2;
 
32917
    A[811] = 0.033333333333333*G6_2_1 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_2_1 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_2_1 + 0.033333333333333*G12_2_2;
 
32918
    A[812] = -0.008333333333333*G3_2;
 
32919
    A[813] = -0.008333333333333*G3_2;
 
32920
    A[814] = -0.008333333333333*G3_2;
 
32921
    A[815] = 0.025000000000000*G3_2;
 
32922
    A[816] = 0.000000000000000;
 
32923
    A[817] = 0.000000000000000;
 
32924
    A[818] = 0.000000000000000;
 
32925
    A[819] = 0.000000000000000;
 
32926
    A[820] = 0.000000000000000;
 
32927
    A[821] = 0.000000000000000;
 
32928
    A[822] = 0.000000000000000;
 
32929
    A[823] = 0.000000000000000;
 
32930
    A[824] = 0.000000000000000;
 
32931
    A[825] = 0.000000000000000;
 
32932
    A[826] = 0.000000000000000;
 
32933
    A[827] = 0.000000000000000;
 
32934
    A[828] = 0.000000000000000;
 
32935
    A[829] = 0.000000000000000;
 
32936
    A[830] = 0.000000000000000;
 
32937
    A[831] = 0.000000000000000;
 
32938
    A[832] = 0.000000000000000;
 
32939
    A[833] = 0.000000000000000;
 
32940
    A[834] = 0.000000000000000;
 
32941
    A[835] = 0.000000000000000;
 
32942
    A[836] = 0.033333333333333*G6_1_0 + 0.033333333333333*G6_1_1 + 0.033333333333333*G6_1_2 + 0.033333333333333*G6_2_0 + 0.033333333333333*G6_2_1 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_1_2 + 0.033333333333333*G9_2_0 + 0.033333333333333*G9_2_1 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_1_2 + 0.033333333333333*G12_2_0 + 0.033333333333333*G12_2_1 + 0.033333333333333*G12_2_2;
 
32943
    A[837] = -0.033333333333333*G6_1_0 - 0.033333333333333*G6_2_0 - 0.033333333333333*G9_1_0 - 0.033333333333333*G9_2_0 - 0.033333333333333*G12_1_0 - 0.033333333333333*G12_2_0;
 
32944
    A[838] = -0.033333333333333*G6_1_1 + 0.100000000000000*G6_2_1 - 0.033333333333333*G9_1_1 + 0.100000000000000*G9_2_1 - 0.033333333333333*G12_1_1 + 0.100000000000000*G12_2_1;
 
32945
    A[839] = 0.100000000000000*G6_1_2 - 0.033333333333333*G6_2_2 + 0.100000000000000*G9_1_2 - 0.033333333333333*G9_2_2 + 0.100000000000000*G12_1_2 - 0.033333333333333*G12_2_2;
 
32946
    A[840] = 0.266666666666666*G6_1_1 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_1 + 0.266666666666666*G6_2_2 + 0.266666666666666*G9_1_1 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_1 + 0.266666666666666*G9_2_2 + 0.266666666666666*G12_1_1 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_1 + 0.266666666666666*G12_2_2;
 
32947
    A[841] = 0.266666666666666*G6_1_0 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_0 + 0.133333333333333*G6_2_2 + 0.266666666666666*G9_1_0 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_0 + 0.133333333333333*G9_2_2 + 0.266666666666666*G12_1_0 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_0 + 0.133333333333333*G12_2_2;
 
32948
    A[842] = 0.133333333333333*G6_1_0 + 0.133333333333333*G6_1_1 + 0.266666666666666*G6_2_0 + 0.133333333333333*G6_2_1 + 0.133333333333333*G9_1_0 + 0.133333333333333*G9_1_1 + 0.266666666666666*G9_2_0 + 0.133333333333333*G9_2_1 + 0.133333333333333*G12_1_0 + 0.133333333333333*G12_1_1 + 0.266666666666666*G12_2_0 + 0.133333333333333*G12_2_1;
 
32949
    A[843] = -0.266666666666666*G6_1_0 - 0.266666666666666*G6_1_1 - 0.133333333333333*G6_1_2 - 0.133333333333333*G6_2_0 - 0.133333333333333*G6_2_1 - 0.266666666666666*G9_1_0 - 0.266666666666666*G9_1_1 - 0.133333333333333*G9_1_2 - 0.133333333333333*G9_2_0 - 0.133333333333333*G9_2_1 - 0.266666666666666*G12_1_0 - 0.266666666666666*G12_1_1 - 0.133333333333333*G12_1_2 - 0.133333333333333*G12_2_0 - 0.133333333333333*G12_2_1;
 
32950
    A[844] = -0.133333333333333*G6_1_0 - 0.133333333333333*G6_1_2 - 0.266666666666666*G6_2_0 - 0.133333333333333*G6_2_1 - 0.266666666666666*G6_2_2 - 0.133333333333333*G9_1_0 - 0.133333333333333*G9_1_2 - 0.266666666666666*G9_2_0 - 0.133333333333333*G9_2_1 - 0.266666666666666*G9_2_2 - 0.133333333333333*G12_1_0 - 0.133333333333333*G12_1_2 - 0.266666666666666*G12_2_0 - 0.133333333333333*G12_2_1 - 0.266666666666666*G12_2_2;
 
32951
    A[845] = -0.133333333333333*G6_1_1 - 0.133333333333333*G6_1_2 - 0.133333333333333*G6_2_1 - 0.133333333333333*G6_2_2 - 0.133333333333333*G9_1_1 - 0.133333333333333*G9_1_2 - 0.133333333333333*G9_2_1 - 0.133333333333333*G9_2_2 - 0.133333333333333*G12_1_1 - 0.133333333333333*G12_1_2 - 0.133333333333333*G12_2_1 - 0.133333333333333*G12_2_2;
 
32952
    A[846] = 0.033333333333333*G3_1 + 0.033333333333333*G3_2;
 
32953
    A[847] = 0.033333333333333*G3_1 + 0.033333333333333*G3_2;
 
32954
    A[848] = 0.033333333333333*G3_1 + 0.066666666666666*G3_2;
 
32955
    A[849] = 0.066666666666666*G3_1 + 0.033333333333333*G3_2;
 
32956
    A[850] = 0.000000000000000;
 
32957
    A[851] = 0.000000000000000;
 
32958
    A[852] = 0.000000000000000;
 
32959
    A[853] = 0.000000000000000;
 
32960
    A[854] = 0.000000000000000;
 
32961
    A[855] = 0.000000000000000;
 
32962
    A[856] = 0.000000000000000;
 
32963
    A[857] = 0.000000000000000;
 
32964
    A[858] = 0.000000000000000;
 
32965
    A[859] = 0.000000000000000;
 
32966
    A[860] = 0.000000000000000;
 
32967
    A[861] = 0.000000000000000;
 
32968
    A[862] = 0.000000000000000;
 
32969
    A[863] = 0.000000000000000;
 
32970
    A[864] = 0.000000000000000;
 
32971
    A[865] = 0.000000000000000;
 
32972
    A[866] = 0.000000000000000;
 
32973
    A[867] = 0.000000000000000;
 
32974
    A[868] = 0.000000000000000;
 
32975
    A[869] = 0.000000000000000;
 
32976
    A[870] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_1 + 0.033333333333333*G6_0_2 + 0.033333333333333*G6_2_0 + 0.033333333333333*G6_2_1 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_0_2 + 0.033333333333333*G9_2_0 + 0.033333333333333*G9_2_1 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_0_2 + 0.033333333333333*G12_2_0 + 0.033333333333333*G12_2_1 + 0.033333333333333*G12_2_2;
 
32977
    A[871] = -0.033333333333333*G6_0_0 + 0.100000000000000*G6_2_0 - 0.033333333333333*G9_0_0 + 0.100000000000000*G9_2_0 - 0.033333333333333*G12_0_0 + 0.100000000000000*G12_2_0;
 
32978
    A[872] = -0.033333333333333*G6_0_1 - 0.033333333333333*G6_2_1 - 0.033333333333333*G9_0_1 - 0.033333333333333*G9_2_1 - 0.033333333333333*G12_0_1 - 0.033333333333333*G12_2_1;
 
32979
    A[873] = 0.100000000000000*G6_0_2 - 0.033333333333333*G6_2_2 + 0.100000000000000*G9_0_2 - 0.033333333333333*G9_2_2 + 0.100000000000000*G12_0_2 - 0.033333333333333*G12_2_2;
 
32980
    A[874] = 0.266666666666666*G6_0_1 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_2_1 + 0.133333333333333*G6_2_2 + 0.266666666666666*G9_0_1 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_2_1 + 0.133333333333333*G9_2_2 + 0.266666666666666*G12_0_1 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_2_1 + 0.133333333333333*G12_2_2;
 
32981
    A[875] = 0.266666666666666*G6_0_0 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_2_0 + 0.266666666666666*G6_2_2 + 0.266666666666666*G9_0_0 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_2_0 + 0.266666666666666*G9_2_2 + 0.266666666666666*G12_0_0 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_2_0 + 0.266666666666666*G12_2_2;
 
32982
    A[876] = 0.133333333333333*G6_0_0 + 0.133333333333333*G6_0_1 + 0.133333333333333*G6_2_0 + 0.266666666666666*G6_2_1 + 0.133333333333333*G9_0_0 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_2_0 + 0.266666666666666*G9_2_1 + 0.133333333333333*G12_0_0 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_2_0 + 0.266666666666666*G12_2_1;
 
32983
    A[877] = -0.266666666666666*G6_0_0 - 0.266666666666666*G6_0_1 - 0.133333333333333*G6_0_2 - 0.133333333333333*G6_2_0 - 0.133333333333333*G6_2_1 - 0.266666666666666*G9_0_0 - 0.266666666666666*G9_0_1 - 0.133333333333333*G9_0_2 - 0.133333333333333*G9_2_0 - 0.133333333333333*G9_2_1 - 0.266666666666666*G12_0_0 - 0.266666666666666*G12_0_1 - 0.133333333333333*G12_0_2 - 0.133333333333333*G12_2_0 - 0.133333333333333*G12_2_1;
 
32984
    A[878] = -0.133333333333333*G6_0_0 - 0.133333333333333*G6_0_2 - 0.133333333333333*G6_2_0 - 0.133333333333333*G6_2_2 - 0.133333333333333*G9_0_0 - 0.133333333333333*G9_0_2 - 0.133333333333333*G9_2_0 - 0.133333333333333*G9_2_2 - 0.133333333333333*G12_0_0 - 0.133333333333333*G12_0_2 - 0.133333333333333*G12_2_0 - 0.133333333333333*G12_2_2;
 
32985
    A[879] = -0.133333333333333*G6_0_1 - 0.133333333333333*G6_0_2 - 0.133333333333333*G6_2_0 - 0.266666666666666*G6_2_1 - 0.266666666666666*G6_2_2 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_0_2 - 0.133333333333333*G9_2_0 - 0.266666666666666*G9_2_1 - 0.266666666666666*G9_2_2 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_0_2 - 0.133333333333333*G12_2_0 - 0.266666666666666*G12_2_1 - 0.266666666666666*G12_2_2;
 
32986
    A[880] = 0.033333333333333*G3_0 + 0.033333333333333*G3_2;
 
32987
    A[881] = 0.033333333333333*G3_0 + 0.066666666666667*G3_2;
 
32988
    A[882] = 0.033333333333333*G3_0 + 0.033333333333333*G3_2;
 
32989
    A[883] = 0.066666666666667*G3_0 + 0.033333333333333*G3_2;
 
32990
    A[884] = 0.000000000000000;
 
32991
    A[885] = 0.000000000000000;
 
32992
    A[886] = 0.000000000000000;
 
32993
    A[887] = 0.000000000000000;
 
32994
    A[888] = 0.000000000000000;
 
32995
    A[889] = 0.000000000000000;
 
32996
    A[890] = 0.000000000000000;
 
32997
    A[891] = 0.000000000000000;
 
32998
    A[892] = 0.000000000000000;
 
32999
    A[893] = 0.000000000000000;
 
33000
    A[894] = 0.000000000000000;
 
33001
    A[895] = 0.000000000000000;
 
33002
    A[896] = 0.000000000000000;
 
33003
    A[897] = 0.000000000000000;
 
33004
    A[898] = 0.000000000000000;
 
33005
    A[899] = 0.000000000000000;
 
33006
    A[900] = 0.000000000000000;
 
33007
    A[901] = 0.000000000000000;
 
33008
    A[902] = 0.000000000000000;
 
33009
    A[903] = 0.000000000000000;
 
33010
    A[904] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_0_1 + 0.033333333333333*G6_0_2 + 0.033333333333333*G6_1_0 + 0.033333333333333*G6_1_1 + 0.033333333333333*G6_1_2 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_0_2 + 0.033333333333333*G9_1_0 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_1_2 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_0_2 + 0.033333333333333*G12_1_0 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_1_2;
 
33011
    A[905] = -0.033333333333333*G6_0_0 + 0.100000000000000*G6_1_0 - 0.033333333333333*G9_0_0 + 0.100000000000000*G9_1_0 - 0.033333333333333*G12_0_0 + 0.100000000000000*G12_1_0;
 
33012
    A[906] = 0.100000000000000*G6_0_1 - 0.033333333333333*G6_1_1 + 0.100000000000000*G9_0_1 - 0.033333333333333*G9_1_1 + 0.100000000000000*G12_0_1 - 0.033333333333333*G12_1_1;
 
33013
    A[907] = -0.033333333333333*G6_0_2 - 0.033333333333333*G6_1_2 - 0.033333333333333*G9_0_2 - 0.033333333333333*G9_1_2 - 0.033333333333333*G12_0_2 - 0.033333333333333*G12_1_2;
 
33014
    A[908] = 0.133333333333333*G6_0_1 + 0.266666666666666*G6_0_2 + 0.133333333333333*G6_1_1 + 0.133333333333333*G6_1_2 + 0.133333333333333*G9_0_1 + 0.266666666666666*G9_0_2 + 0.133333333333333*G9_1_1 + 0.133333333333333*G9_1_2 + 0.133333333333333*G12_0_1 + 0.266666666666666*G12_0_2 + 0.133333333333333*G12_1_1 + 0.133333333333333*G12_1_2;
 
33015
    A[909] = 0.133333333333333*G6_0_0 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_1_0 + 0.266666666666666*G6_1_2 + 0.133333333333333*G9_0_0 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_1_0 + 0.266666666666666*G9_1_2 + 0.133333333333333*G12_0_0 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_1_0 + 0.266666666666666*G12_1_2;
 
33016
    A[910] = 0.266666666666666*G6_0_0 + 0.133333333333333*G6_0_1 + 0.133333333333333*G6_1_0 + 0.266666666666666*G6_1_1 + 0.266666666666666*G9_0_0 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_1_0 + 0.266666666666666*G9_1_1 + 0.266666666666666*G12_0_0 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_1_0 + 0.266666666666666*G12_1_1;
 
33017
    A[911] = -0.133333333333333*G6_0_0 - 0.133333333333333*G6_0_1 - 0.133333333333333*G6_1_0 - 0.133333333333333*G6_1_1 - 0.133333333333333*G9_0_0 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_1_0 - 0.133333333333333*G9_1_1 - 0.133333333333333*G12_0_0 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_1_0 - 0.133333333333333*G12_1_1;
 
33018
    A[912] = -0.266666666666666*G6_0_0 - 0.133333333333333*G6_0_1 - 0.266666666666666*G6_0_2 - 0.133333333333333*G6_1_0 - 0.133333333333333*G6_1_2 - 0.266666666666666*G9_0_0 - 0.133333333333333*G9_0_1 - 0.266666666666666*G9_0_2 - 0.133333333333333*G9_1_0 - 0.133333333333333*G9_1_2 - 0.266666666666666*G12_0_0 - 0.133333333333333*G12_0_1 - 0.266666666666666*G12_0_2 - 0.133333333333333*G12_1_0 - 0.133333333333333*G12_1_2;
 
33019
    A[913] = -0.133333333333333*G6_0_1 - 0.133333333333333*G6_0_2 - 0.133333333333333*G6_1_0 - 0.266666666666666*G6_1_1 - 0.266666666666666*G6_1_2 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_0_2 - 0.133333333333333*G9_1_0 - 0.266666666666666*G9_1_1 - 0.266666666666666*G9_1_2 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_0_2 - 0.133333333333333*G12_1_0 - 0.266666666666666*G12_1_1 - 0.266666666666666*G12_1_2;
 
33020
    A[914] = 0.033333333333333*G3_0 + 0.033333333333333*G3_1;
 
33021
    A[915] = 0.033333333333333*G3_0 + 0.066666666666667*G3_1;
 
33022
    A[916] = 0.066666666666666*G3_0 + 0.033333333333333*G3_1;
 
33023
    A[917] = 0.033333333333333*G3_0 + 0.033333333333333*G3_1;
 
33024
    A[918] = 0.000000000000000;
 
33025
    A[919] = 0.000000000000000;
 
33026
    A[920] = 0.000000000000000;
 
33027
    A[921] = 0.000000000000000;
 
33028
    A[922] = 0.000000000000000;
 
33029
    A[923] = 0.000000000000000;
 
33030
    A[924] = 0.000000000000000;
 
33031
    A[925] = 0.000000000000000;
 
33032
    A[926] = 0.000000000000000;
 
33033
    A[927] = 0.000000000000000;
 
33034
    A[928] = 0.000000000000000;
 
33035
    A[929] = 0.000000000000000;
 
33036
    A[930] = 0.000000000000000;
 
33037
    A[931] = 0.000000000000000;
 
33038
    A[932] = 0.000000000000000;
 
33039
    A[933] = 0.000000000000000;
 
33040
    A[934] = 0.000000000000000;
 
33041
    A[935] = 0.000000000000000;
 
33042
    A[936] = 0.000000000000000;
 
33043
    A[937] = 0.000000000000000;
 
33044
    A[938] = -0.033333333333333*G6_0_0 - 0.033333333333333*G6_0_1 - 0.033333333333333*G6_0_2 - 0.033333333333333*G6_1_0 - 0.033333333333333*G6_1_1 - 0.033333333333333*G6_1_2 - 0.133333333333333*G6_2_0 - 0.133333333333333*G6_2_1 - 0.133333333333333*G6_2_2 - 0.033333333333333*G9_0_0 - 0.033333333333333*G9_0_1 - 0.033333333333333*G9_0_2 - 0.033333333333333*G9_1_0 - 0.033333333333333*G9_1_1 - 0.033333333333333*G9_1_2 - 0.133333333333333*G9_2_0 - 0.133333333333333*G9_2_1 - 0.133333333333333*G9_2_2 - 0.033333333333333*G12_0_0 - 0.033333333333333*G12_0_1 - 0.033333333333333*G12_0_2 - 0.033333333333333*G12_1_0 - 0.033333333333333*G12_1_1 - 0.033333333333333*G12_1_2 - 0.133333333333333*G12_2_0 - 0.133333333333333*G12_2_1 - 0.133333333333333*G12_2_2;
 
33045
    A[939] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_1_0 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_1_0 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_1_0;
 
33046
    A[940] = 0.033333333333333*G6_0_1 + 0.033333333333333*G6_1_1 + 0.033333333333333*G9_0_1 + 0.033333333333333*G9_1_1 + 0.033333333333333*G12_0_1 + 0.033333333333333*G12_1_1;
 
33047
    A[941] = -0.100000000000000*G6_0_2 - 0.100000000000000*G6_1_2 - 0.133333333333333*G6_2_2 - 0.100000000000000*G9_0_2 - 0.100000000000000*G9_1_2 - 0.133333333333333*G9_2_2 - 0.100000000000000*G12_0_2 - 0.100000000000000*G12_1_2 - 0.133333333333333*G12_2_2;
 
33048
    A[942] = -0.266666666666666*G6_0_1 - 0.133333333333333*G6_0_2 - 0.266666666666666*G6_1_1 - 0.133333333333333*G6_1_2 - 0.133333333333333*G6_2_1 - 0.266666666666666*G9_0_1 - 0.133333333333333*G9_0_2 - 0.266666666666666*G9_1_1 - 0.133333333333333*G9_1_2 - 0.133333333333333*G9_2_1 - 0.266666666666666*G12_0_1 - 0.133333333333333*G12_0_2 - 0.266666666666666*G12_1_1 - 0.133333333333333*G12_1_2 - 0.133333333333333*G12_2_1;
 
33049
    A[943] = -0.266666666666666*G6_0_0 - 0.133333333333333*G6_0_2 - 0.266666666666666*G6_1_0 - 0.133333333333333*G6_1_2 - 0.133333333333333*G6_2_0 - 0.266666666666666*G9_0_0 - 0.133333333333333*G9_0_2 - 0.266666666666666*G9_1_0 - 0.133333333333333*G9_1_2 - 0.133333333333333*G9_2_0 - 0.266666666666666*G12_0_0 - 0.133333333333333*G12_0_2 - 0.266666666666666*G12_1_0 - 0.133333333333333*G12_1_2 - 0.133333333333333*G12_2_0;
 
33050
    A[944] = -0.133333333333333*G6_0_0 - 0.133333333333333*G6_0_1 - 0.133333333333333*G6_1_0 - 0.133333333333333*G6_1_1 - 0.133333333333333*G9_0_0 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_1_0 - 0.133333333333333*G9_1_1 - 0.133333333333333*G12_0_0 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_1_0 - 0.133333333333333*G12_1_1;
 
33051
    A[945] = 0.266666666666666*G6_0_0 + 0.266666666666666*G6_0_1 + 0.133333333333333*G6_0_2 + 0.266666666666666*G6_1_0 + 0.266666666666666*G6_1_1 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_0 + 0.133333333333333*G6_2_1 + 0.266666666666666*G6_2_2 + 0.266666666666666*G9_0_0 + 0.266666666666666*G9_0_1 + 0.133333333333333*G9_0_2 + 0.266666666666666*G9_1_0 + 0.266666666666666*G9_1_1 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_0 + 0.133333333333333*G9_2_1 + 0.266666666666666*G9_2_2 + 0.266666666666666*G12_0_0 + 0.266666666666666*G12_0_1 + 0.133333333333333*G12_0_2 + 0.266666666666666*G12_1_0 + 0.266666666666666*G12_1_1 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_0 + 0.133333333333333*G12_2_1 + 0.266666666666666*G12_2_2;
 
33052
    A[946] = 0.133333333333333*G6_0_0 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_1_0 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_1 + 0.133333333333333*G9_0_0 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_1_0 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_1 + 0.133333333333333*G12_0_0 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_1_0 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_1;
 
33053
    A[947] = 0.133333333333333*G6_0_1 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_1_1 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_0 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_1_1 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_0 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_1_1 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_0;
 
33054
    A[948] = -0.033333333333333*G3_0 - 0.033333333333333*G3_1 + 0.033333333333333*G3_2;
 
33055
    A[949] = -0.033333333333333*G3_0 - 0.033333333333333*G3_1;
 
33056
    A[950] = -0.033333333333333*G3_0 - 0.033333333333333*G3_1;
 
33057
    A[951] = -0.066666666666667*G3_0 - 0.066666666666666*G3_1 - 0.033333333333333*G3_2;
 
33058
    A[952] = 0.000000000000000;
 
33059
    A[953] = 0.000000000000000;
 
33060
    A[954] = 0.000000000000000;
 
33061
    A[955] = 0.000000000000000;
 
33062
    A[956] = 0.000000000000000;
 
33063
    A[957] = 0.000000000000000;
 
33064
    A[958] = 0.000000000000000;
 
33065
    A[959] = 0.000000000000000;
 
33066
    A[960] = 0.000000000000000;
 
33067
    A[961] = 0.000000000000000;
 
33068
    A[962] = 0.000000000000000;
 
33069
    A[963] = 0.000000000000000;
 
33070
    A[964] = 0.000000000000000;
 
33071
    A[965] = 0.000000000000000;
 
33072
    A[966] = 0.000000000000000;
 
33073
    A[967] = 0.000000000000000;
 
33074
    A[968] = 0.000000000000000;
 
33075
    A[969] = 0.000000000000000;
 
33076
    A[970] = 0.000000000000000;
 
33077
    A[971] = 0.000000000000000;
 
33078
    A[972] = -0.033333333333333*G6_0_0 - 0.033333333333333*G6_0_1 - 0.033333333333333*G6_0_2 - 0.133333333333333*G6_1_0 - 0.133333333333333*G6_1_1 - 0.133333333333333*G6_1_2 - 0.033333333333333*G6_2_0 - 0.033333333333333*G6_2_1 - 0.033333333333333*G6_2_2 - 0.033333333333333*G9_0_0 - 0.033333333333333*G9_0_1 - 0.033333333333333*G9_0_2 - 0.133333333333333*G9_1_0 - 0.133333333333333*G9_1_1 - 0.133333333333333*G9_1_2 - 0.033333333333333*G9_2_0 - 0.033333333333333*G9_2_1 - 0.033333333333333*G9_2_2 - 0.033333333333333*G12_0_0 - 0.033333333333333*G12_0_1 - 0.033333333333333*G12_0_2 - 0.133333333333333*G12_1_0 - 0.133333333333333*G12_1_1 - 0.133333333333333*G12_1_2 - 0.033333333333333*G12_2_0 - 0.033333333333333*G12_2_1 - 0.033333333333333*G12_2_2;
 
33079
    A[973] = 0.033333333333333*G6_0_0 + 0.033333333333333*G6_2_0 + 0.033333333333333*G9_0_0 + 0.033333333333333*G9_2_0 + 0.033333333333333*G12_0_0 + 0.033333333333333*G12_2_0;
 
33080
    A[974] = -0.100000000000000*G6_0_1 - 0.133333333333333*G6_1_1 - 0.100000000000000*G6_2_1 - 0.100000000000000*G9_0_1 - 0.133333333333333*G9_1_1 - 0.100000000000000*G9_2_1 - 0.100000000000000*G12_0_1 - 0.133333333333333*G12_1_1 - 0.100000000000000*G12_2_1;
 
33081
    A[975] = 0.033333333333333*G6_0_2 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_0_2 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_0_2 + 0.033333333333333*G12_2_2;
 
33082
    A[976] = -0.133333333333333*G6_0_1 - 0.266666666666666*G6_0_2 - 0.133333333333333*G6_1_2 - 0.133333333333333*G6_2_1 - 0.266666666666666*G6_2_2 - 0.133333333333333*G9_0_1 - 0.266666666666666*G9_0_2 - 0.133333333333333*G9_1_2 - 0.133333333333333*G9_2_1 - 0.266666666666666*G9_2_2 - 0.133333333333333*G12_0_1 - 0.266666666666666*G12_0_2 - 0.133333333333333*G12_1_2 - 0.133333333333333*G12_2_1 - 0.266666666666666*G12_2_2;
 
33083
    A[977] = -0.133333333333333*G6_0_0 - 0.133333333333333*G6_0_2 - 0.133333333333333*G6_2_0 - 0.133333333333333*G6_2_2 - 0.133333333333333*G9_0_0 - 0.133333333333333*G9_0_2 - 0.133333333333333*G9_2_0 - 0.133333333333333*G9_2_2 - 0.133333333333333*G12_0_0 - 0.133333333333333*G12_0_2 - 0.133333333333333*G12_2_0 - 0.133333333333333*G12_2_2;
 
33084
    A[978] = -0.266666666666666*G6_0_0 - 0.133333333333333*G6_0_1 - 0.133333333333333*G6_1_0 - 0.266666666666666*G6_2_0 - 0.133333333333333*G6_2_1 - 0.266666666666666*G9_0_0 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_1_0 - 0.266666666666666*G9_2_0 - 0.133333333333333*G9_2_1 - 0.266666666666666*G12_0_0 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_1_0 - 0.266666666666666*G12_2_0 - 0.133333333333333*G12_2_1;
 
33085
    A[979] = 0.133333333333333*G6_0_0 + 0.133333333333333*G6_0_1 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_0 + 0.133333333333333*G6_2_1 + 0.133333333333333*G9_0_0 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_0 + 0.133333333333333*G9_2_1 + 0.133333333333333*G12_0_0 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_0 + 0.133333333333333*G12_2_1;
 
33086
    A[980] = 0.266666666666666*G6_0_0 + 0.133333333333333*G6_0_1 + 0.266666666666666*G6_0_2 + 0.133333333333333*G6_1_0 + 0.266666666666666*G6_1_1 + 0.133333333333333*G6_1_2 + 0.266666666666666*G6_2_0 + 0.133333333333333*G6_2_1 + 0.266666666666666*G6_2_2 + 0.266666666666666*G9_0_0 + 0.133333333333333*G9_0_1 + 0.266666666666666*G9_0_2 + 0.133333333333333*G9_1_0 + 0.266666666666666*G9_1_1 + 0.133333333333333*G9_1_2 + 0.266666666666666*G9_2_0 + 0.133333333333333*G9_2_1 + 0.266666666666666*G9_2_2 + 0.266666666666666*G12_0_0 + 0.133333333333333*G12_0_1 + 0.266666666666666*G12_0_2 + 0.133333333333333*G12_1_0 + 0.266666666666666*G12_1_1 + 0.133333333333333*G12_1_2 + 0.266666666666666*G12_2_0 + 0.133333333333333*G12_2_1 + 0.266666666666666*G12_2_2;
 
33087
    A[981] = 0.133333333333333*G6_0_1 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_1_0 + 0.133333333333333*G6_2_1 + 0.133333333333333*G6_2_2 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_1_0 + 0.133333333333333*G9_2_1 + 0.133333333333333*G9_2_2 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_1_0 + 0.133333333333333*G12_2_1 + 0.133333333333333*G12_2_2;
 
33088
    A[982] = -0.033333333333333*G3_0 + 0.033333333333333*G3_1 - 0.033333333333333*G3_2;
 
33089
    A[983] = -0.033333333333333*G3_0 - 0.033333333333333*G3_2;
 
33090
    A[984] = -0.066666666666666*G3_0 - 0.033333333333333*G3_1 - 0.066666666666666*G3_2;
 
33091
    A[985] = -0.033333333333333*G3_0 - 0.033333333333333*G3_2;
 
33092
    A[986] = 0.000000000000000;
 
33093
    A[987] = 0.000000000000000;
 
33094
    A[988] = 0.000000000000000;
 
33095
    A[989] = 0.000000000000000;
 
33096
    A[990] = 0.000000000000000;
 
33097
    A[991] = 0.000000000000000;
 
33098
    A[992] = 0.000000000000000;
 
33099
    A[993] = 0.000000000000000;
 
33100
    A[994] = 0.000000000000000;
 
33101
    A[995] = 0.000000000000000;
 
33102
    A[996] = 0.000000000000000;
 
33103
    A[997] = 0.000000000000000;
 
33104
    A[998] = 0.000000000000000;
 
33105
    A[999] = 0.000000000000000;
 
33106
    A[1000] = 0.000000000000000;
 
33107
    A[1001] = 0.000000000000000;
 
33108
    A[1002] = 0.000000000000000;
 
33109
    A[1003] = 0.000000000000000;
 
33110
    A[1004] = 0.000000000000000;
 
33111
    A[1005] = 0.000000000000000;
 
33112
    A[1006] = -0.133333333333333*G6_0_0 - 0.133333333333333*G6_0_1 - 0.133333333333333*G6_0_2 - 0.033333333333333*G6_1_0 - 0.033333333333333*G6_1_1 - 0.033333333333333*G6_1_2 - 0.033333333333333*G6_2_0 - 0.033333333333333*G6_2_1 - 0.033333333333333*G6_2_2 - 0.133333333333333*G9_0_0 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_0_2 - 0.033333333333333*G9_1_0 - 0.033333333333333*G9_1_1 - 0.033333333333333*G9_1_2 - 0.033333333333333*G9_2_0 - 0.033333333333333*G9_2_1 - 0.033333333333333*G9_2_2 - 0.133333333333333*G12_0_0 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_0_2 - 0.033333333333333*G12_1_0 - 0.033333333333333*G12_1_1 - 0.033333333333333*G12_1_2 - 0.033333333333333*G12_2_0 - 0.033333333333333*G12_2_1 - 0.033333333333333*G12_2_2;
 
33113
    A[1007] = -0.133333333333333*G6_0_0 - 0.100000000000000*G6_1_0 - 0.100000000000000*G6_2_0 - 0.133333333333333*G9_0_0 - 0.100000000000000*G9_1_0 - 0.100000000000000*G9_2_0 - 0.133333333333333*G12_0_0 - 0.100000000000000*G12_1_0 - 0.100000000000000*G12_2_0;
 
33114
    A[1008] = 0.033333333333333*G6_1_1 + 0.033333333333333*G6_2_1 + 0.033333333333333*G9_1_1 + 0.033333333333333*G9_2_1 + 0.033333333333333*G12_1_1 + 0.033333333333333*G12_2_1;
 
33115
    A[1009] = 0.033333333333333*G6_1_2 + 0.033333333333333*G6_2_2 + 0.033333333333333*G9_1_2 + 0.033333333333333*G9_2_2 + 0.033333333333333*G12_1_2 + 0.033333333333333*G12_2_2;
 
33116
    A[1010] = -0.133333333333333*G6_1_1 - 0.133333333333333*G6_1_2 - 0.133333333333333*G6_2_1 - 0.133333333333333*G6_2_2 - 0.133333333333333*G9_1_1 - 0.133333333333333*G9_1_2 - 0.133333333333333*G9_2_1 - 0.133333333333333*G9_2_2 - 0.133333333333333*G12_1_1 - 0.133333333333333*G12_1_2 - 0.133333333333333*G12_2_1 - 0.133333333333333*G12_2_2;
 
33117
    A[1011] = -0.133333333333333*G6_0_2 - 0.133333333333333*G6_1_0 - 0.266666666666666*G6_1_2 - 0.133333333333333*G6_2_0 - 0.266666666666666*G6_2_2 - 0.133333333333333*G9_0_2 - 0.133333333333333*G9_1_0 - 0.266666666666666*G9_1_2 - 0.133333333333333*G9_2_0 - 0.266666666666666*G9_2_2 - 0.133333333333333*G12_0_2 - 0.133333333333333*G12_1_0 - 0.266666666666666*G12_1_2 - 0.133333333333333*G12_2_0 - 0.266666666666666*G12_2_2;
 
33118
    A[1012] = -0.133333333333333*G6_0_1 - 0.133333333333333*G6_1_0 - 0.266666666666666*G6_1_1 - 0.133333333333333*G6_2_0 - 0.266666666666666*G6_2_1 - 0.133333333333333*G9_0_1 - 0.133333333333333*G9_1_0 - 0.266666666666666*G9_1_1 - 0.133333333333333*G9_2_0 - 0.266666666666666*G9_2_1 - 0.133333333333333*G12_0_1 - 0.133333333333333*G12_1_0 - 0.266666666666666*G12_1_1 - 0.133333333333333*G12_2_0 - 0.266666666666666*G12_2_1;
 
33119
    A[1013] = 0.133333333333333*G6_0_2 + 0.133333333333333*G6_1_0 + 0.133333333333333*G6_1_1 + 0.133333333333333*G6_2_0 + 0.133333333333333*G6_2_1 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_1_0 + 0.133333333333333*G9_1_1 + 0.133333333333333*G9_2_0 + 0.133333333333333*G9_2_1 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_1_0 + 0.133333333333333*G12_1_1 + 0.133333333333333*G12_2_0 + 0.133333333333333*G12_2_1;
 
33120
    A[1014] = 0.133333333333333*G6_0_1 + 0.133333333333333*G6_1_0 + 0.133333333333333*G6_1_2 + 0.133333333333333*G6_2_0 + 0.133333333333333*G6_2_2 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_1_0 + 0.133333333333333*G9_1_2 + 0.133333333333333*G9_2_0 + 0.133333333333333*G9_2_2 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_1_0 + 0.133333333333333*G12_1_2 + 0.133333333333333*G12_2_0 + 0.133333333333333*G12_2_2;
 
33121
    A[1015] = 0.266666666666666*G6_0_0 + 0.133333333333333*G6_0_1 + 0.133333333333333*G6_0_2 + 0.133333333333333*G6_1_0 + 0.266666666666666*G6_1_1 + 0.266666666666666*G6_1_2 + 0.133333333333333*G6_2_0 + 0.266666666666666*G6_2_1 + 0.266666666666666*G6_2_2 + 0.266666666666666*G9_0_0 + 0.133333333333333*G9_0_1 + 0.133333333333333*G9_0_2 + 0.133333333333333*G9_1_0 + 0.266666666666666*G9_1_1 + 0.266666666666666*G9_1_2 + 0.133333333333333*G9_2_0 + 0.266666666666666*G9_2_1 + 0.266666666666666*G9_2_2 + 0.266666666666666*G12_0_0 + 0.133333333333333*G12_0_1 + 0.133333333333333*G12_0_2 + 0.133333333333333*G12_1_0 + 0.266666666666666*G12_1_1 + 0.266666666666666*G12_1_2 + 0.133333333333333*G12_2_0 + 0.266666666666666*G12_2_1 + 0.266666666666666*G12_2_2;
 
33122
    A[1016] = 0.033333333333333*G3_0 - 0.033333333333333*G3_1 - 0.033333333333333*G3_2;
 
33123
    A[1017] = -0.033333333333333*G3_0 - 0.066666666666666*G3_1 - 0.066666666666667*G3_2;
 
33124
    A[1018] = -0.033333333333333*G3_1 - 0.033333333333333*G3_2;
 
33125
    A[1019] = -0.033333333333333*G3_1 - 0.033333333333333*G3_2;
 
33126
    A[1020] = -0.025000000000000*G1_0 - 0.025000000000000*G1_1 - 0.025000000000000*G1_2;
 
33127
    A[1021] = -0.008333333333333*G1_0;
 
33128
    A[1022] = -0.008333333333333*G1_1;
 
33129
    A[1023] = -0.008333333333333*G1_2;
 
33130
    A[1024] = 0.033333333333333*G1_1 + 0.033333333333333*G1_2;
 
33131
    A[1025] = 0.033333333333333*G1_0 + 0.033333333333333*G1_2;
 
33132
    A[1026] = 0.033333333333333*G1_0 + 0.033333333333333*G1_1;
 
33133
    A[1027] = -0.033333333333333*G1_0 - 0.033333333333333*G1_1 + 0.033333333333333*G1_2;
 
33134
    A[1028] = -0.033333333333333*G1_0 + 0.033333333333333*G1_1 - 0.033333333333333*G1_2;
 
33135
    A[1029] = 0.033333333333333*G1_0 - 0.033333333333333*G1_1 - 0.033333333333333*G1_2;
 
33136
    A[1030] = -0.025000000000000*G2_0 - 0.025000000000000*G2_1 - 0.025000000000000*G2_2;
 
33137
    A[1031] = -0.008333333333333*G2_0;
 
33138
    A[1032] = -0.008333333333333*G2_1;
 
33139
    A[1033] = -0.008333333333333*G2_2;
 
33140
    A[1034] = 0.033333333333333*G2_1 + 0.033333333333333*G2_2;
 
33141
    A[1035] = 0.033333333333333*G2_0 + 0.033333333333333*G2_2;
 
33142
    A[1036] = 0.033333333333333*G2_0 + 0.033333333333333*G2_1;
 
33143
    A[1037] = -0.033333333333333*G2_0 - 0.033333333333333*G2_1 + 0.033333333333333*G2_2;
 
33144
    A[1038] = -0.033333333333333*G2_0 + 0.033333333333333*G2_1 - 0.033333333333333*G2_2;
 
33145
    A[1039] = 0.033333333333333*G2_0 - 0.033333333333333*G2_1 - 0.033333333333333*G2_2;
 
33146
    A[1040] = -0.025000000000000*G0_0 - 0.025000000000000*G0_1 - 0.025000000000000*G0_2;
 
33147
    A[1041] = -0.008333333333333*G0_0;
 
33148
    A[1042] = -0.008333333333333*G0_1;
 
33149
    A[1043] = -0.008333333333333*G0_2;
 
33150
    A[1044] = 0.033333333333333*G0_1 + 0.033333333333333*G0_2;
 
33151
    A[1045] = 0.033333333333333*G0_0 + 0.033333333333333*G0_2;
 
33152
    A[1046] = 0.033333333333333*G0_0 + 0.033333333333333*G0_1;
 
33153
    A[1047] = -0.033333333333333*G0_0 - 0.033333333333333*G0_1 + 0.033333333333333*G0_2;
 
33154
    A[1048] = -0.033333333333333*G0_0 + 0.033333333333333*G0_1 - 0.033333333333333*G0_2;
 
33155
    A[1049] = 0.033333333333333*G0_0 - 0.033333333333333*G0_1 - 0.033333333333333*G0_2;
 
33156
    A[1050] = 0.000000000000000;
 
33157
    A[1051] = 0.000000000000000;
 
33158
    A[1052] = 0.000000000000000;
 
33159
    A[1053] = 0.000000000000000;
 
33160
    A[1054] = 0.008333333333333*G1_0 + 0.008333333333333*G1_1 + 0.008333333333333*G1_2;
 
33161
    A[1055] = 0.025000000000000*G1_0;
 
33162
    A[1056] = -0.008333333333333*G1_1;
 
33163
    A[1057] = -0.008333333333333*G1_2;
 
33164
    A[1058] = 0.033333333333333*G1_1 + 0.033333333333333*G1_2;
 
33165
    A[1059] = 0.033333333333333*G1_0 + 0.066666666666667*G1_2;
 
33166
    A[1060] = 0.033333333333333*G1_0 + 0.066666666666667*G1_1;
 
33167
    A[1061] = -0.033333333333333*G1_0 - 0.033333333333333*G1_1;
 
33168
    A[1062] = -0.033333333333333*G1_0 - 0.033333333333333*G1_2;
 
33169
    A[1063] = -0.033333333333333*G1_0 - 0.066666666666666*G1_1 - 0.066666666666667*G1_2;
 
33170
    A[1064] = 0.008333333333333*G2_0 + 0.008333333333333*G2_1 + 0.008333333333333*G2_2;
 
33171
    A[1065] = 0.025000000000000*G2_0;
 
33172
    A[1066] = -0.008333333333333*G2_1;
 
33173
    A[1067] = -0.008333333333333*G2_2;
 
33174
    A[1068] = 0.033333333333333*G2_1 + 0.033333333333333*G2_2;
 
33175
    A[1069] = 0.033333333333333*G2_0 + 0.066666666666667*G2_2;
 
33176
    A[1070] = 0.033333333333333*G2_0 + 0.066666666666667*G2_1;
 
33177
    A[1071] = -0.033333333333333*G2_0 - 0.033333333333333*G2_1;
 
33178
    A[1072] = -0.033333333333333*G2_0 - 0.033333333333333*G2_2;
 
33179
    A[1073] = -0.033333333333333*G2_0 - 0.066666666666666*G2_1 - 0.066666666666667*G2_2;
 
33180
    A[1074] = 0.008333333333333*G0_0 + 0.008333333333333*G0_1 + 0.008333333333333*G0_2;
 
33181
    A[1075] = 0.025000000000000*G0_0;
 
33182
    A[1076] = -0.008333333333333*G0_1;
 
33183
    A[1077] = -0.008333333333333*G0_2;
 
33184
    A[1078] = 0.033333333333333*G0_1 + 0.033333333333333*G0_2;
 
33185
    A[1079] = 0.033333333333333*G0_0 + 0.066666666666667*G0_2;
 
33186
    A[1080] = 0.033333333333333*G0_0 + 0.066666666666667*G0_1;
 
33187
    A[1081] = -0.033333333333333*G0_0 - 0.033333333333333*G0_1;
 
33188
    A[1082] = -0.033333333333333*G0_0 - 0.033333333333333*G0_2;
 
33189
    A[1083] = -0.033333333333333*G0_0 - 0.066666666666666*G0_1 - 0.066666666666667*G0_2;
 
33190
    A[1084] = 0.000000000000000;
 
33191
    A[1085] = 0.000000000000000;
 
33192
    A[1086] = 0.000000000000000;
 
33193
    A[1087] = 0.000000000000000;
 
33194
    A[1088] = 0.008333333333333*G1_0 + 0.008333333333333*G1_1 + 0.008333333333333*G1_2;
 
33195
    A[1089] = -0.008333333333333*G1_0;
 
33196
    A[1090] = 0.025000000000000*G1_1;
 
33197
    A[1091] = -0.008333333333333*G1_2;
 
33198
    A[1092] = 0.033333333333333*G1_1 + 0.066666666666666*G1_2;
 
33199
    A[1093] = 0.033333333333333*G1_0 + 0.033333333333333*G1_2;
 
33200
    A[1094] = 0.066666666666666*G1_0 + 0.033333333333333*G1_1;
 
33201
    A[1095] = -0.033333333333333*G1_0 - 0.033333333333333*G1_1;
 
33202
    A[1096] = -0.066666666666666*G1_0 - 0.033333333333333*G1_1 - 0.066666666666666*G1_2;
 
33203
    A[1097] = -0.033333333333333*G1_1 - 0.033333333333333*G1_2;
 
33204
    A[1098] = 0.008333333333333*G2_0 + 0.008333333333333*G2_1 + 0.008333333333333*G2_2;
 
33205
    A[1099] = -0.008333333333333*G2_0;
 
33206
    A[1100] = 0.025000000000000*G2_1;
 
33207
    A[1101] = -0.008333333333333*G2_2;
 
33208
    A[1102] = 0.033333333333333*G2_1 + 0.066666666666666*G2_2;
 
33209
    A[1103] = 0.033333333333333*G2_0 + 0.033333333333333*G2_2;
 
33210
    A[1104] = 0.066666666666666*G2_0 + 0.033333333333333*G2_1;
 
33211
    A[1105] = -0.033333333333333*G2_0 - 0.033333333333333*G2_1;
 
33212
    A[1106] = -0.066666666666666*G2_0 - 0.033333333333333*G2_1 - 0.066666666666666*G2_2;
 
33213
    A[1107] = -0.033333333333333*G2_1 - 0.033333333333333*G2_2;
 
33214
    A[1108] = 0.008333333333333*G0_0 + 0.008333333333333*G0_1 + 0.008333333333333*G0_2;
 
33215
    A[1109] = -0.008333333333333*G0_0;
 
33216
    A[1110] = 0.025000000000000*G0_1;
 
33217
    A[1111] = -0.008333333333333*G0_2;
 
33218
    A[1112] = 0.033333333333333*G0_1 + 0.066666666666666*G0_2;
 
33219
    A[1113] = 0.033333333333333*G0_0 + 0.033333333333333*G0_2;
 
33220
    A[1114] = 0.066666666666666*G0_0 + 0.033333333333333*G0_1;
 
33221
    A[1115] = -0.033333333333333*G0_0 - 0.033333333333333*G0_1;
 
33222
    A[1116] = -0.066666666666666*G0_0 - 0.033333333333333*G0_1 - 0.066666666666666*G0_2;
 
33223
    A[1117] = -0.033333333333333*G0_1 - 0.033333333333333*G0_2;
 
33224
    A[1118] = 0.000000000000000;
 
33225
    A[1119] = 0.000000000000000;
 
33226
    A[1120] = 0.000000000000000;
 
33227
    A[1121] = 0.000000000000000;
 
33228
    A[1122] = 0.008333333333333*G1_0 + 0.008333333333333*G1_1 + 0.008333333333333*G1_2;
 
33229
    A[1123] = -0.008333333333333*G1_0;
 
33230
    A[1124] = -0.008333333333333*G1_1;
 
33231
    A[1125] = 0.025000000000000*G1_2;
 
33232
    A[1126] = 0.066666666666666*G1_1 + 0.033333333333333*G1_2;
 
33233
    A[1127] = 0.066666666666667*G1_0 + 0.033333333333333*G1_2;
 
33234
    A[1128] = 0.033333333333333*G1_0 + 0.033333333333333*G1_1;
 
33235
    A[1129] = -0.066666666666667*G1_0 - 0.066666666666666*G1_1 - 0.033333333333333*G1_2;
 
33236
    A[1130] = -0.033333333333333*G1_0 - 0.033333333333333*G1_2;
 
33237
    A[1131] = -0.033333333333333*G1_1 - 0.033333333333333*G1_2;
 
33238
    A[1132] = 0.008333333333333*G2_0 + 0.008333333333333*G2_1 + 0.008333333333333*G2_2;
 
33239
    A[1133] = -0.008333333333333*G2_0;
 
33240
    A[1134] = -0.008333333333333*G2_1;
 
33241
    A[1135] = 0.025000000000000*G2_2;
 
33242
    A[1136] = 0.066666666666666*G2_1 + 0.033333333333333*G2_2;
 
33243
    A[1137] = 0.066666666666667*G2_0 + 0.033333333333333*G2_2;
 
33244
    A[1138] = 0.033333333333333*G2_0 + 0.033333333333333*G2_1;
 
33245
    A[1139] = -0.066666666666667*G2_0 - 0.066666666666666*G2_1 - 0.033333333333333*G2_2;
 
33246
    A[1140] = -0.033333333333333*G2_0 - 0.033333333333333*G2_2;
 
33247
    A[1141] = -0.033333333333333*G2_1 - 0.033333333333333*G2_2;
 
33248
    A[1142] = 0.008333333333333*G0_0 + 0.008333333333333*G0_1 + 0.008333333333333*G0_2;
 
33249
    A[1143] = -0.008333333333333*G0_0;
 
33250
    A[1144] = -0.008333333333333*G0_1;
 
33251
    A[1145] = 0.025000000000000*G0_2;
 
33252
    A[1146] = 0.066666666666666*G0_1 + 0.033333333333333*G0_2;
 
33253
    A[1147] = 0.066666666666667*G0_0 + 0.033333333333333*G0_2;
 
33254
    A[1148] = 0.033333333333333*G0_0 + 0.033333333333333*G0_1;
 
33255
    A[1149] = -0.066666666666667*G0_0 - 0.066666666666666*G0_1 - 0.033333333333333*G0_2;
 
33256
    A[1150] = -0.033333333333333*G0_0 - 0.033333333333333*G0_2;
 
33257
    A[1151] = -0.033333333333333*G0_1 - 0.033333333333333*G0_2;
 
33258
    A[1152] = 0.000000000000000;
 
33259
    A[1153] = 0.000000000000000;
 
33260
    A[1154] = 0.000000000000000;
 
33261
    A[1155] = 0.000000000000000;
 
33262
  }
 
33263
 
 
33264
  /// Tabulate the tensor for the contribution from a local cell
 
33265
  /// using the specified reference cell quadrature points/weights
 
33266
  virtual void tabulate_tensor(double* A,
 
33267
                               const double * const * w,
 
33268
                               const ufc::cell& c,
 
33269
                               unsigned int num_quadrature_points,
 
33270
                               const double * const * quadrature_points,
 
33271
                               const double* quadrature_weights) const
 
33272
  {
 
33273
    throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation.");
 
33274
  }
 
33275
 
 
33276
};
 
33277
 
 
33278
/// This class defines the interface for the tabulation of the cell
 
33279
/// tensor corresponding to the local contribution to a form from
 
33280
/// the integral over a cell.
 
33281
 
 
33282
class stokes_cell_integral_1_0: public ufc::cell_integral
 
33283
{
 
33284
public:
 
33285
 
 
33286
  /// Constructor
 
33287
  stokes_cell_integral_1_0() : ufc::cell_integral()
 
33288
  {
 
33289
    // Do nothing
 
33290
  }
 
33291
 
 
33292
  /// Destructor
 
33293
  virtual ~stokes_cell_integral_1_0()
 
33294
  {
 
33295
    // Do nothing
 
33296
  }
 
33297
 
 
33298
  /// Tabulate the tensor for the contribution from a local cell
 
33299
  virtual void tabulate_tensor(double* A,
 
33300
                               const double * const * w,
 
33301
                               const ufc::cell& c) const
 
33302
  {
 
33303
    // Number of operations (multiply-add pairs) for Jacobian data:      18
 
33304
    // Number of operations (multiply-add pairs) for geometry tensor:    30
 
33305
    // Number of operations (multiply-add pairs) for tensor contraction: 285
 
33306
    // Total number of operations (multiply-add pairs):                  333
 
33307
    
 
33308
    // Extract vertex coordinates
 
33309
    const double * const * x = c.coordinates;
 
33310
    
 
33311
    // Compute Jacobian of affine map from reference cell
 
33312
    const double J_00 = x[1][0] - x[0][0];
 
33313
    const double J_01 = x[2][0] - x[0][0];
 
33314
    const double J_02 = x[3][0] - x[0][0];
 
33315
    const double J_10 = x[1][1] - x[0][1];
 
33316
    const double J_11 = x[2][1] - x[0][1];
 
33317
    const double J_12 = x[3][1] - x[0][1];
 
33318
    const double J_20 = x[1][2] - x[0][2];
 
33319
    const double J_21 = x[2][2] - x[0][2];
 
33320
    const double J_22 = x[3][2] - x[0][2];
 
33321
    
 
33322
    // Compute sub determinants
 
33323
    const double d_00 = J_11*J_22 - J_12*J_21;
 
33324
    const double d_10 = J_02*J_21 - J_01*J_22;
 
33325
    const double d_20 = J_01*J_12 - J_02*J_11;
 
33326
    
 
33327
    // Compute determinant of Jacobian
 
33328
    double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
 
33329
    
 
33330
    // Compute inverse of Jacobian
 
33331
    
 
33332
    // Set scale factor
 
33333
    const double det = std::abs(detJ);
 
33334
    
 
33335
    // Compute geometry tensor
 
33336
    const double G0_20 = det*w[0][20]*(1.0);
 
33337
    const double G0_21 = det*w[0][21]*(1.0);
 
33338
    const double G0_22 = det*w[0][22]*(1.0);
 
33339
    const double G0_23 = det*w[0][23]*(1.0);
 
33340
    const double G0_24 = det*w[0][24]*(1.0);
 
33341
    const double G0_25 = det*w[0][25]*(1.0);
 
33342
    const double G0_26 = det*w[0][26]*(1.0);
 
33343
    const double G0_27 = det*w[0][27]*(1.0);
 
33344
    const double G0_28 = det*w[0][28]*(1.0);
 
33345
    const double G0_29 = det*w[0][29]*(1.0);
 
33346
    const double G1_0 = det*w[0][0]*(1.0);
 
33347
    const double G1_1 = det*w[0][1]*(1.0);
 
33348
    const double G1_2 = det*w[0][2]*(1.0);
 
33349
    const double G1_3 = det*w[0][3]*(1.0);
 
33350
    const double G1_4 = det*w[0][4]*(1.0);
 
33351
    const double G1_5 = det*w[0][5]*(1.0);
 
33352
    const double G1_6 = det*w[0][6]*(1.0);
 
33353
    const double G1_7 = det*w[0][7]*(1.0);
 
33354
    const double G1_8 = det*w[0][8]*(1.0);
 
33355
    const double G1_9 = det*w[0][9]*(1.0);
 
33356
    const double G2_10 = det*w[0][10]*(1.0);
 
33357
    const double G2_11 = det*w[0][11]*(1.0);
 
33358
    const double G2_12 = det*w[0][12]*(1.0);
 
33359
    const double G2_13 = det*w[0][13]*(1.0);
 
33360
    const double G2_14 = det*w[0][14]*(1.0);
 
33361
    const double G2_15 = det*w[0][15]*(1.0);
 
33362
    const double G2_16 = det*w[0][16]*(1.0);
 
33363
    const double G2_17 = det*w[0][17]*(1.0);
 
33364
    const double G2_18 = det*w[0][18]*(1.0);
 
33365
    const double G2_19 = det*w[0][19]*(1.0);
 
33366
    
 
33367
    // Compute element tensor
 
33368
    A[0] = 0.002380952380952*G1_0 + 0.000396825396825*G1_1 + 0.000396825396825*G1_2 + 0.000396825396825*G1_3 - 0.002380952380952*G1_4 - 0.002380952380952*G1_5 - 0.002380952380952*G1_6 - 0.001587301587302*G1_7 - 0.001587301587302*G1_8 - 0.001587301587302*G1_9;
 
33369
    A[1] = 0.000396825396825*G1_0 + 0.002380952380952*G1_1 + 0.000396825396825*G1_2 + 0.000396825396825*G1_3 - 0.002380952380952*G1_4 - 0.001587301587302*G1_5 - 0.001587301587302*G1_6 - 0.002380952380952*G1_7 - 0.002380952380952*G1_8 - 0.001587301587302*G1_9;
 
33370
    A[2] = 0.000396825396825*G1_0 + 0.000396825396825*G1_1 + 0.002380952380952*G1_2 + 0.000396825396825*G1_3 - 0.001587301587302*G1_4 - 0.002380952380952*G1_5 - 0.001587301587302*G1_6 - 0.002380952380952*G1_7 - 0.001587301587302*G1_8 - 0.002380952380952*G1_9;
 
33371
    A[3] = 0.000396825396825*G1_0 + 0.000396825396825*G1_1 + 0.000396825396825*G1_2 + 0.002380952380952*G1_3 - 0.001587301587302*G1_4 - 0.001587301587302*G1_5 - 0.002380952380952*G1_6 - 0.001587301587302*G1_7 - 0.002380952380952*G1_8 - 0.002380952380952*G1_9;
 
33372
    A[4] = -0.002380952380952*G1_0 - 0.002380952380952*G1_1 - 0.001587301587302*G1_2 - 0.001587301587302*G1_3 + 0.012698412698413*G1_4 + 0.006349206349206*G1_5 + 0.006349206349206*G1_6 + 0.006349206349206*G1_7 + 0.006349206349206*G1_8 + 0.003174603174603*G1_9;
 
33373
    A[5] = -0.002380952380952*G1_0 - 0.001587301587302*G1_1 - 0.002380952380952*G1_2 - 0.001587301587302*G1_3 + 0.006349206349206*G1_4 + 0.012698412698413*G1_5 + 0.006349206349206*G1_6 + 0.006349206349206*G1_7 + 0.003174603174603*G1_8 + 0.006349206349206*G1_9;
 
33374
    A[6] = -0.002380952380952*G1_0 - 0.001587301587302*G1_1 - 0.001587301587302*G1_2 - 0.002380952380952*G1_3 + 0.006349206349206*G1_4 + 0.006349206349206*G1_5 + 0.012698412698413*G1_6 + 0.003174603174603*G1_7 + 0.006349206349206*G1_8 + 0.006349206349206*G1_9;
 
33375
    A[7] = -0.001587301587302*G1_0 - 0.002380952380952*G1_1 - 0.002380952380952*G1_2 - 0.001587301587302*G1_3 + 0.006349206349206*G1_4 + 0.006349206349206*G1_5 + 0.003174603174603*G1_6 + 0.012698412698413*G1_7 + 0.006349206349206*G1_8 + 0.006349206349206*G1_9;
 
33376
    A[8] = -0.001587301587302*G1_0 - 0.002380952380952*G1_1 - 0.001587301587302*G1_2 - 0.002380952380952*G1_3 + 0.006349206349206*G1_4 + 0.003174603174603*G1_5 + 0.006349206349206*G1_6 + 0.006349206349206*G1_7 + 0.012698412698413*G1_8 + 0.006349206349206*G1_9;
 
33377
    A[9] = -0.001587301587302*G1_0 - 0.001587301587302*G1_1 - 0.002380952380952*G1_2 - 0.002380952380952*G1_3 + 0.003174603174603*G1_4 + 0.006349206349206*G1_5 + 0.006349206349206*G1_6 + 0.006349206349206*G1_7 + 0.006349206349206*G1_8 + 0.012698412698413*G1_9;
 
33378
    A[10] = 0.002380952380952*G2_10 + 0.000396825396825*G2_11 + 0.000396825396825*G2_12 + 0.000396825396825*G2_13 - 0.002380952380952*G2_14 - 0.002380952380952*G2_15 - 0.002380952380952*G2_16 - 0.001587301587302*G2_17 - 0.001587301587302*G2_18 - 0.001587301587302*G2_19;
 
33379
    A[11] = 0.000396825396825*G2_10 + 0.002380952380952*G2_11 + 0.000396825396825*G2_12 + 0.000396825396825*G2_13 - 0.002380952380952*G2_14 - 0.001587301587302*G2_15 - 0.001587301587302*G2_16 - 0.002380952380952*G2_17 - 0.002380952380952*G2_18 - 0.001587301587302*G2_19;
 
33380
    A[12] = 0.000396825396825*G2_10 + 0.000396825396825*G2_11 + 0.002380952380952*G2_12 + 0.000396825396825*G2_13 - 0.001587301587302*G2_14 - 0.002380952380952*G2_15 - 0.001587301587302*G2_16 - 0.002380952380952*G2_17 - 0.001587301587302*G2_18 - 0.002380952380952*G2_19;
 
33381
    A[13] = 0.000396825396825*G2_10 + 0.000396825396825*G2_11 + 0.000396825396825*G2_12 + 0.002380952380952*G2_13 - 0.001587301587302*G2_14 - 0.001587301587302*G2_15 - 0.002380952380952*G2_16 - 0.001587301587302*G2_17 - 0.002380952380952*G2_18 - 0.002380952380952*G2_19;
 
33382
    A[14] = -0.002380952380952*G2_10 - 0.002380952380952*G2_11 - 0.001587301587302*G2_12 - 0.001587301587302*G2_13 + 0.012698412698413*G2_14 + 0.006349206349206*G2_15 + 0.006349206349206*G2_16 + 0.006349206349206*G2_17 + 0.006349206349206*G2_18 + 0.003174603174603*G2_19;
 
33383
    A[15] = -0.002380952380952*G2_10 - 0.001587301587302*G2_11 - 0.002380952380952*G2_12 - 0.001587301587302*G2_13 + 0.006349206349206*G2_14 + 0.012698412698413*G2_15 + 0.006349206349206*G2_16 + 0.006349206349206*G2_17 + 0.003174603174603*G2_18 + 0.006349206349206*G2_19;
 
33384
    A[16] = -0.002380952380952*G2_10 - 0.001587301587302*G2_11 - 0.001587301587302*G2_12 - 0.002380952380952*G2_13 + 0.006349206349206*G2_14 + 0.006349206349206*G2_15 + 0.012698412698413*G2_16 + 0.003174603174603*G2_17 + 0.006349206349206*G2_18 + 0.006349206349206*G2_19;
 
33385
    A[17] = -0.001587301587302*G2_10 - 0.002380952380952*G2_11 - 0.002380952380952*G2_12 - 0.001587301587302*G2_13 + 0.006349206349206*G2_14 + 0.006349206349206*G2_15 + 0.003174603174603*G2_16 + 0.012698412698413*G2_17 + 0.006349206349206*G2_18 + 0.006349206349206*G2_19;
 
33386
    A[18] = -0.001587301587302*G2_10 - 0.002380952380952*G2_11 - 0.001587301587302*G2_12 - 0.002380952380952*G2_13 + 0.006349206349206*G2_14 + 0.003174603174603*G2_15 + 0.006349206349206*G2_16 + 0.006349206349206*G2_17 + 0.012698412698413*G2_18 + 0.006349206349206*G2_19;
 
33387
    A[19] = -0.001587301587302*G2_10 - 0.001587301587302*G2_11 - 0.002380952380952*G2_12 - 0.002380952380952*G2_13 + 0.003174603174603*G2_14 + 0.006349206349206*G2_15 + 0.006349206349206*G2_16 + 0.006349206349206*G2_17 + 0.006349206349206*G2_18 + 0.012698412698413*G2_19;
 
33388
    A[20] = 0.002380952380952*G0_20 + 0.000396825396825*G0_21 + 0.000396825396825*G0_22 + 0.000396825396825*G0_23 - 0.002380952380952*G0_24 - 0.002380952380952*G0_25 - 0.002380952380952*G0_26 - 0.001587301587302*G0_27 - 0.001587301587302*G0_28 - 0.001587301587302*G0_29;
 
33389
    A[21] = 0.000396825396825*G0_20 + 0.002380952380952*G0_21 + 0.000396825396825*G0_22 + 0.000396825396825*G0_23 - 0.002380952380952*G0_24 - 0.001587301587302*G0_25 - 0.001587301587302*G0_26 - 0.002380952380952*G0_27 - 0.002380952380952*G0_28 - 0.001587301587302*G0_29;
 
33390
    A[22] = 0.000396825396825*G0_20 + 0.000396825396825*G0_21 + 0.002380952380952*G0_22 + 0.000396825396825*G0_23 - 0.001587301587302*G0_24 - 0.002380952380952*G0_25 - 0.001587301587302*G0_26 - 0.002380952380952*G0_27 - 0.001587301587302*G0_28 - 0.002380952380952*G0_29;
 
33391
    A[23] = 0.000396825396825*G0_20 + 0.000396825396825*G0_21 + 0.000396825396825*G0_22 + 0.002380952380952*G0_23 - 0.001587301587302*G0_24 - 0.001587301587302*G0_25 - 0.002380952380952*G0_26 - 0.001587301587302*G0_27 - 0.002380952380952*G0_28 - 0.002380952380952*G0_29;
 
33392
    A[24] = -0.002380952380952*G0_20 - 0.002380952380952*G0_21 - 0.001587301587302*G0_22 - 0.001587301587302*G0_23 + 0.012698412698413*G0_24 + 0.006349206349206*G0_25 + 0.006349206349206*G0_26 + 0.006349206349206*G0_27 + 0.006349206349206*G0_28 + 0.003174603174603*G0_29;
 
33393
    A[25] = -0.002380952380952*G0_20 - 0.001587301587302*G0_21 - 0.002380952380952*G0_22 - 0.001587301587302*G0_23 + 0.006349206349206*G0_24 + 0.012698412698413*G0_25 + 0.006349206349206*G0_26 + 0.006349206349206*G0_27 + 0.003174603174603*G0_28 + 0.006349206349206*G0_29;
 
33394
    A[26] = -0.002380952380952*G0_20 - 0.001587301587302*G0_21 - 0.001587301587302*G0_22 - 0.002380952380952*G0_23 + 0.006349206349206*G0_24 + 0.006349206349206*G0_25 + 0.012698412698413*G0_26 + 0.003174603174603*G0_27 + 0.006349206349206*G0_28 + 0.006349206349206*G0_29;
 
33395
    A[27] = -0.001587301587302*G0_20 - 0.002380952380952*G0_21 - 0.002380952380952*G0_22 - 0.001587301587302*G0_23 + 0.006349206349206*G0_24 + 0.006349206349206*G0_25 + 0.003174603174603*G0_26 + 0.012698412698413*G0_27 + 0.006349206349206*G0_28 + 0.006349206349206*G0_29;
 
33396
    A[28] = -0.001587301587302*G0_20 - 0.002380952380952*G0_21 - 0.001587301587302*G0_22 - 0.002380952380952*G0_23 + 0.006349206349206*G0_24 + 0.003174603174603*G0_25 + 0.006349206349206*G0_26 + 0.006349206349206*G0_27 + 0.012698412698413*G0_28 + 0.006349206349206*G0_29;
 
33397
    A[29] = -0.001587301587302*G0_20 - 0.001587301587302*G0_21 - 0.002380952380952*G0_22 - 0.002380952380952*G0_23 + 0.003174603174603*G0_24 + 0.006349206349206*G0_25 + 0.006349206349206*G0_26 + 0.006349206349206*G0_27 + 0.006349206349206*G0_28 + 0.012698412698413*G0_29;
 
33398
    A[30] = 0.000000000000000;
 
33399
    A[31] = 0.000000000000000;
 
33400
    A[32] = 0.000000000000000;
 
33401
    A[33] = 0.000000000000000;
 
33402
  }
 
33403
 
 
33404
  /// Tabulate the tensor for the contribution from a local cell
 
33405
  /// using the specified reference cell quadrature points/weights
 
33406
  virtual void tabulate_tensor(double* A,
 
33407
                               const double * const * w,
 
33408
                               const ufc::cell& c,
 
33409
                               unsigned int num_quadrature_points,
 
33410
                               const double * const * quadrature_points,
 
33411
                               const double* quadrature_weights) const
 
33412
  {
 
33413
    throw std::runtime_error("Quadrature version of tabulate_tensor not available when using the FFC tensor representation.");
 
33414
  }
 
33415
 
 
33416
};
 
33417
 
 
33418
/// This class defines the interface for the assembly of the global
 
33419
/// tensor corresponding to a form with r + n arguments, that is, a
 
33420
/// mapping
 
33421
///
 
33422
///     a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R
 
33423
///
 
33424
/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r
 
33425
/// global tensor A is defined by
 
33426
///
 
33427
///     A = a(V1, V2, ..., Vr, w1, w2, ..., wn),
 
33428
///
 
33429
/// where each argument Vj represents the application to the
 
33430
/// sequence of basis functions of Vj and w1, w2, ..., wn are given
 
33431
/// fixed functions (coefficients).
 
33432
 
 
33433
class stokes_form_0: public ufc::form
 
33434
{
 
33435
public:
 
33436
 
 
33437
  /// Constructor
 
33438
  stokes_form_0() : ufc::form()
 
33439
  {
 
33440
    // Do nothing
 
33441
  }
 
33442
 
 
33443
  /// Destructor
 
33444
  virtual ~stokes_form_0()
 
33445
  {
 
33446
    // Do nothing
 
33447
  }
 
33448
 
 
33449
  /// Return a string identifying the form
 
33450
  virtual const char* signature() const
 
33451
  {
 
33452
    return "Form([Integral(Sum(Product(IndexSum(Indexed(ListTensor(Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((Index(0),), {Index(0): 3})), MultiIndex((FixedIndex(0),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((Index(0),), {Index(0): 3})), MultiIndex((FixedIndex(1),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((Index(0),), {Index(0): 3})), MultiIndex((FixedIndex(2),), {}))), MultiIndex((Index(0),), {Index(0): 3})), MultiIndex((Index(0),), {Index(0): 3})), Indexed(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((FixedIndex(3),), {FixedIndex(3): 4}))), Sum(IndexSum(IndexSum(Product(Indexed(ComponentTensor(Indexed(ListTensor(Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((Index(1),), {Index(1): 3})), MultiIndex((FixedIndex(0),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((Index(1),), {Index(1): 3})), MultiIndex((FixedIndex(1),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((Index(1),), {Index(1): 3})), MultiIndex((FixedIndex(2),), {}))), MultiIndex((Index(2),), {Index(2): 3})), MultiIndex((Index(2), Index(1)), {Index(2): 3, Index(1): 3})), MultiIndex((Index(3), Index(4)), {Index(4): 3, Index(3): 3})), Indexed(ComponentTensor(Indexed(ListTensor(Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((Index(5),), {Index(5): 3})), MultiIndex((FixedIndex(0),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((Index(5),), {Index(5): 3})), MultiIndex((FixedIndex(1),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((Index(5),), {Index(5): 3})), MultiIndex((FixedIndex(2),), {}))), MultiIndex((Index(6),), {Index(6): 3})), MultiIndex((Index(6), Index(5)), {Index(5): 3, Index(6): 3})), MultiIndex((Index(3), Index(4)), {Index(4): 3, Index(3): 3}))), MultiIndex((Index(3),), {Index(3): 3})), MultiIndex((Index(4),), {Index(4): 3})), Product(IndexSum(Indexed(ListTensor(Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((Index(7),), {Index(7): 3})), MultiIndex((FixedIndex(0),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((Index(7),), {Index(7): 3})), MultiIndex((FixedIndex(1),), {})), Indexed(SpatialDerivative(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((Index(7),), {Index(7): 3})), MultiIndex((FixedIndex(2),), {}))), MultiIndex((Index(7),), {Index(7): 3})), MultiIndex((Index(7),), {Index(7): 3})), Indexed(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 1), MultiIndex((FixedIndex(3),), {FixedIndex(3): 4}))))), Measure('cell', 0, None))])";
 
33453
  }
 
33454
 
 
33455
  /// Return the rank of the global tensor (r)
 
33456
  virtual unsigned int rank() const
 
33457
  {
 
33458
    return 2;
 
33459
  }
 
33460
 
 
33461
  /// Return the number of coefficients (n)
 
33462
  virtual unsigned int num_coefficients() const
 
33463
  {
 
33464
    return 0;
 
33465
  }
 
33466
 
 
33467
  /// Return the number of cell domains
 
33468
  virtual unsigned int num_cell_domains() const
 
33469
  {
 
33470
    return 1;
 
33471
  }
 
33472
 
 
33473
  /// Return the number of exterior facet domains
 
33474
  virtual unsigned int num_exterior_facet_domains() const
 
33475
  {
 
33476
    return 0;
 
33477
  }
 
33478
 
 
33479
  /// Return the number of interior facet domains
 
33480
  virtual unsigned int num_interior_facet_domains() const
 
33481
  {
 
33482
    return 0;
 
33483
  }
 
33484
 
 
33485
  /// Create a new finite element for argument function i
 
33486
  virtual ufc::finite_element* create_finite_element(unsigned int i) const
 
33487
  {
 
33488
    switch (i)
 
33489
    {
 
33490
    case 0:
 
33491
      {
 
33492
        return new stokes_finite_element_3();
 
33493
        break;
 
33494
      }
 
33495
    case 1:
 
33496
      {
 
33497
        return new stokes_finite_element_3();
 
33498
        break;
 
33499
      }
 
33500
    }
 
33501
    
 
33502
    return 0;
 
33503
  }
 
33504
 
 
33505
  /// Create a new dofmap for argument function i
 
33506
  virtual ufc::dofmap* create_dofmap(unsigned int i) const
 
33507
  {
 
33508
    switch (i)
 
33509
    {
 
33510
    case 0:
 
33511
      {
 
33512
        return new stokes_dofmap_3();
 
33513
        break;
 
33514
      }
 
33515
    case 1:
 
33516
      {
 
33517
        return new stokes_dofmap_3();
 
33518
        break;
 
33519
      }
 
33520
    }
 
33521
    
 
33522
    return 0;
 
33523
  }
 
33524
 
 
33525
  /// Create a new cell integral on sub domain i
 
33526
  virtual ufc::cell_integral* create_cell_integral(unsigned int i) const
 
33527
  {
 
33528
    switch (i)
 
33529
    {
 
33530
    case 0:
 
33531
      {
 
33532
        return new stokes_cell_integral_0_0();
 
33533
        break;
 
33534
      }
 
33535
    }
 
33536
    
 
33537
    return 0;
 
33538
  }
 
33539
 
 
33540
  /// Create a new exterior facet integral on sub domain i
 
33541
  virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const
 
33542
  {
 
33543
    return 0;
 
33544
  }
 
33545
 
 
33546
  /// Create a new interior facet integral on sub domain i
 
33547
  virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const
 
33548
  {
 
33549
    return 0;
 
33550
  }
 
33551
 
 
33552
};
 
33553
 
 
33554
/// This class defines the interface for the assembly of the global
 
33555
/// tensor corresponding to a form with r + n arguments, that is, a
 
33556
/// mapping
 
33557
///
 
33558
///     a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R
 
33559
///
 
33560
/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r
 
33561
/// global tensor A is defined by
 
33562
///
 
33563
///     A = a(V1, V2, ..., Vr, w1, w2, ..., wn),
 
33564
///
 
33565
/// where each argument Vj represents the application to the
 
33566
/// sequence of basis functions of Vj and w1, w2, ..., wn are given
 
33567
/// fixed functions (coefficients).
 
33568
 
 
33569
class stokes_form_1: public ufc::form
 
33570
{
 
33571
public:
 
33572
 
 
33573
  /// Constructor
 
33574
  stokes_form_1() : ufc::form()
 
33575
  {
 
33576
    // Do nothing
 
33577
  }
 
33578
 
 
33579
  /// Destructor
 
33580
  virtual ~stokes_form_1()
 
33581
  {
 
33582
    // Do nothing
 
33583
  }
 
33584
 
 
33585
  /// Return a string identifying the form
 
33586
  virtual const char* signature() const
 
33587
  {
 
33588
    return "Form([Integral(IndexSum(Product(Indexed(Coefficient(VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), 0), MultiIndex((Index(0),), {Index(0): 3})), Indexed(ListTensor(Indexed(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((FixedIndex(0),), {FixedIndex(0): 4})), Indexed(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((FixedIndex(1),), {FixedIndex(1): 4})), Indexed(Argument(MixedElement(*[VectorElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 2, 3), FiniteElement('Lagrange', Cell('tetrahedron', 1, Space(3)), 1)], **{'value_shape': (4,) }), 0), MultiIndex((FixedIndex(2),), {FixedIndex(2): 4}))), MultiIndex((Index(0),), {Index(0): 3}))), MultiIndex((Index(0),), {Index(0): 3})), Measure('cell', 0, None))])";
 
33589
  }
 
33590
 
 
33591
  /// Return the rank of the global tensor (r)
 
33592
  virtual unsigned int rank() const
 
33593
  {
 
33594
    return 1;
 
33595
  }
 
33596
 
 
33597
  /// Return the number of coefficients (n)
 
33598
  virtual unsigned int num_coefficients() const
 
33599
  {
 
33600
    return 1;
 
33601
  }
 
33602
 
 
33603
  /// Return the number of cell domains
 
33604
  virtual unsigned int num_cell_domains() const
 
33605
  {
 
33606
    return 1;
 
33607
  }
 
33608
 
 
33609
  /// Return the number of exterior facet domains
 
33610
  virtual unsigned int num_exterior_facet_domains() const
 
33611
  {
 
33612
    return 0;
 
33613
  }
 
33614
 
 
33615
  /// Return the number of interior facet domains
 
33616
  virtual unsigned int num_interior_facet_domains() const
 
33617
  {
 
33618
    return 0;
 
33619
  }
 
33620
 
 
33621
  /// Create a new finite element for argument function i
 
33622
  virtual ufc::finite_element* create_finite_element(unsigned int i) const
 
33623
  {
 
33624
    switch (i)
 
33625
    {
 
33626
    case 0:
 
33627
      {
 
33628
        return new stokes_finite_element_3();
 
33629
        break;
 
33630
      }
 
33631
    case 1:
 
33632
      {
 
33633
        return new stokes_finite_element_1();
 
33634
        break;
 
33635
      }
 
33636
    }
 
33637
    
 
33638
    return 0;
 
33639
  }
 
33640
 
 
33641
  /// Create a new dofmap for argument function i
 
33642
  virtual ufc::dofmap* create_dofmap(unsigned int i) const
 
33643
  {
 
33644
    switch (i)
 
33645
    {
 
33646
    case 0:
 
33647
      {
 
33648
        return new stokes_dofmap_3();
 
33649
        break;
 
33650
      }
 
33651
    case 1:
 
33652
      {
 
33653
        return new stokes_dofmap_1();
 
33654
        break;
 
33655
      }
 
33656
    }
 
33657
    
 
33658
    return 0;
 
33659
  }
 
33660
 
 
33661
  /// Create a new cell integral on sub domain i
 
33662
  virtual ufc::cell_integral* create_cell_integral(unsigned int i) const
 
33663
  {
 
33664
    switch (i)
 
33665
    {
 
33666
    case 0:
 
33667
      {
 
33668
        return new stokes_cell_integral_1_0();
 
33669
        break;
 
33670
      }
 
33671
    }
 
33672
    
 
33673
    return 0;
 
33674
  }
 
33675
 
 
33676
  /// Create a new exterior facet integral on sub domain i
 
33677
  virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const
 
33678
  {
 
33679
    return 0;
 
33680
  }
 
33681
 
 
33682
  /// Create a new interior facet integral on sub domain i
 
33683
  virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const
 
33684
  {
 
33685
    return 0;
 
33686
  }
 
33687
 
 
33688
};
 
33689
 
 
33690
// DOLFIN wrappers
 
33691
 
 
33692
// Standard library includes
 
33693
#include <string>
 
33694
 
 
33695
// DOLFIN includes
 
33696
#include <dolfin/common/NoDeleter.h>
 
33697
#include <dolfin/fem/FiniteElement.h>
 
33698
#include <dolfin/fem/DofMap.h>
 
33699
#include <dolfin/fem/Form.h>
 
33700
#include <dolfin/function/FunctionSpace.h>
 
33701
#include <dolfin/function/GenericFunction.h>
 
33702
#include <dolfin/function/CoefficientAssigner.h>
 
33703
#include <dolfin/adaptivity/ErrorControl.h>
 
33704
#include <dolfin/adaptivity/GoalFunctional.h>
 
33705
 
 
33706
namespace Stokes
 
33707
{
 
33708
 
 
33709
class CoefficientSpace_f: public dolfin::FunctionSpace
 
33710
{
 
33711
public:
 
33712
 
 
33713
  CoefficientSpace_f(const dolfin::Mesh& mesh):
 
33714
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33715
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_1()))),
 
33716
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_1()), mesh)))
 
33717
  {
 
33718
    // Do nothing
 
33719
  }
 
33720
 
 
33721
  CoefficientSpace_f(dolfin::Mesh& mesh):
 
33722
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33723
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_1()))),
 
33724
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_1()), mesh)))
 
33725
  {
 
33726
    // Do nothing
 
33727
  }
 
33728
 
 
33729
  CoefficientSpace_f(boost::shared_ptr<dolfin::Mesh> mesh):
 
33730
    dolfin::FunctionSpace(mesh,
 
33731
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_1()))),
 
33732
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_1()), *mesh)))
 
33733
  {
 
33734
      // Do nothing
 
33735
  }
 
33736
 
 
33737
  CoefficientSpace_f(boost::shared_ptr<const dolfin::Mesh> mesh):
 
33738
    dolfin::FunctionSpace(mesh,
 
33739
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_1()))),
 
33740
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_1()), *mesh)))
 
33741
  {
 
33742
      // Do nothing
 
33743
  }
 
33744
 
 
33745
  ~CoefficientSpace_f()
 
33746
  {
 
33747
  }
 
33748
 
 
33749
};
 
33750
 
 
33751
class Form_0_FunctionSpace_0: public dolfin::FunctionSpace
 
33752
{
 
33753
public:
 
33754
 
 
33755
  Form_0_FunctionSpace_0(const dolfin::Mesh& mesh):
 
33756
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33757
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33758
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), mesh)))
 
33759
  {
 
33760
    // Do nothing
 
33761
  }
 
33762
 
 
33763
  Form_0_FunctionSpace_0(dolfin::Mesh& mesh):
 
33764
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33765
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33766
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), mesh)))
 
33767
  {
 
33768
    // Do nothing
 
33769
  }
 
33770
 
 
33771
  Form_0_FunctionSpace_0(boost::shared_ptr<dolfin::Mesh> mesh):
 
33772
    dolfin::FunctionSpace(mesh,
 
33773
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33774
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), *mesh)))
 
33775
  {
 
33776
      // Do nothing
 
33777
  }
 
33778
 
 
33779
  Form_0_FunctionSpace_0(boost::shared_ptr<const dolfin::Mesh> mesh):
 
33780
    dolfin::FunctionSpace(mesh,
 
33781
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33782
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), *mesh)))
 
33783
  {
 
33784
      // Do nothing
 
33785
  }
 
33786
 
 
33787
  ~Form_0_FunctionSpace_0()
 
33788
  {
 
33789
  }
 
33790
 
 
33791
};
 
33792
 
 
33793
class Form_0_FunctionSpace_1: public dolfin::FunctionSpace
 
33794
{
 
33795
public:
 
33796
 
 
33797
  Form_0_FunctionSpace_1(const dolfin::Mesh& mesh):
 
33798
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33799
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33800
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), mesh)))
 
33801
  {
 
33802
    // Do nothing
 
33803
  }
 
33804
 
 
33805
  Form_0_FunctionSpace_1(dolfin::Mesh& mesh):
 
33806
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33807
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33808
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), mesh)))
 
33809
  {
 
33810
    // Do nothing
 
33811
  }
 
33812
 
 
33813
  Form_0_FunctionSpace_1(boost::shared_ptr<dolfin::Mesh> mesh):
 
33814
    dolfin::FunctionSpace(mesh,
 
33815
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33816
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), *mesh)))
 
33817
  {
 
33818
      // Do nothing
 
33819
  }
 
33820
 
 
33821
  Form_0_FunctionSpace_1(boost::shared_ptr<const dolfin::Mesh> mesh):
 
33822
    dolfin::FunctionSpace(mesh,
 
33823
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33824
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), *mesh)))
 
33825
  {
 
33826
      // Do nothing
 
33827
  }
 
33828
 
 
33829
  ~Form_0_FunctionSpace_1()
 
33830
  {
 
33831
  }
 
33832
 
 
33833
};
 
33834
 
 
33835
class Form_0: public dolfin::Form
 
33836
{
 
33837
public:
 
33838
 
 
33839
  // Constructor
 
33840
  Form_0(const dolfin::FunctionSpace& V0, const dolfin::FunctionSpace& V1):
 
33841
    dolfin::Form(2, 0)
 
33842
  {
 
33843
    _function_spaces[0] = reference_to_no_delete_pointer(V0);
 
33844
    _function_spaces[1] = reference_to_no_delete_pointer(V1);
 
33845
 
 
33846
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_0());
 
33847
  }
 
33848
 
 
33849
  // Constructor
 
33850
  Form_0(boost::shared_ptr<const dolfin::FunctionSpace> V0, boost::shared_ptr<const dolfin::FunctionSpace> V1):
 
33851
    dolfin::Form(2, 0)
 
33852
  {
 
33853
    _function_spaces[0] = V0;
 
33854
    _function_spaces[1] = V1;
 
33855
 
 
33856
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_0());
 
33857
  }
 
33858
 
 
33859
  // Destructor
 
33860
  ~Form_0()
 
33861
  {}
 
33862
 
 
33863
  /// Return the number of the coefficient with this name
 
33864
  virtual dolfin::uint coefficient_number(const std::string& name) const
 
33865
  {
 
33866
 
 
33867
    dolfin::error("No coefficients.");
 
33868
    return 0;
 
33869
  }
 
33870
 
 
33871
  /// Return the name of the coefficient with this number
 
33872
  virtual std::string coefficient_name(dolfin::uint i) const
 
33873
  {
 
33874
 
 
33875
    dolfin::error("No coefficients.");
 
33876
    return "unnamed";
 
33877
  }
 
33878
 
 
33879
  // Typedefs
 
33880
  typedef Form_0_FunctionSpace_0 TestSpace;
 
33881
  typedef Form_0_FunctionSpace_1 TrialSpace;
 
33882
 
 
33883
  // Coefficients
 
33884
};
 
33885
 
 
33886
class Form_1_FunctionSpace_0: public dolfin::FunctionSpace
 
33887
{
 
33888
public:
 
33889
 
 
33890
  Form_1_FunctionSpace_0(const dolfin::Mesh& mesh):
 
33891
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33892
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33893
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), mesh)))
 
33894
  {
 
33895
    // Do nothing
 
33896
  }
 
33897
 
 
33898
  Form_1_FunctionSpace_0(dolfin::Mesh& mesh):
 
33899
    dolfin::FunctionSpace(dolfin::reference_to_no_delete_pointer(mesh),
 
33900
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33901
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), mesh)))
 
33902
  {
 
33903
    // Do nothing
 
33904
  }
 
33905
 
 
33906
  Form_1_FunctionSpace_0(boost::shared_ptr<dolfin::Mesh> mesh):
 
33907
    dolfin::FunctionSpace(mesh,
 
33908
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33909
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), *mesh)))
 
33910
  {
 
33911
      // Do nothing
 
33912
  }
 
33913
 
 
33914
  Form_1_FunctionSpace_0(boost::shared_ptr<const dolfin::Mesh> mesh):
 
33915
    dolfin::FunctionSpace(mesh,
 
33916
                          boost::shared_ptr<const dolfin::FiniteElement>(new dolfin::FiniteElement(boost::shared_ptr<ufc::finite_element>(new stokes_finite_element_3()))),
 
33917
                          boost::shared_ptr<const dolfin::DofMap>(new dolfin::DofMap(boost::shared_ptr<ufc::dofmap>(new stokes_dofmap_3()), *mesh)))
 
33918
  {
 
33919
      // Do nothing
 
33920
  }
 
33921
 
 
33922
  ~Form_1_FunctionSpace_0()
 
33923
  {
 
33924
  }
 
33925
 
 
33926
};
 
33927
 
 
33928
typedef CoefficientSpace_f Form_1_FunctionSpace_1;
 
33929
 
 
33930
class Form_1: public dolfin::Form
 
33931
{
 
33932
public:
 
33933
 
 
33934
  // Constructor
 
33935
  Form_1(const dolfin::FunctionSpace& V0):
 
33936
    dolfin::Form(1, 1), f(*this, 0)
 
33937
  {
 
33938
    _function_spaces[0] = reference_to_no_delete_pointer(V0);
 
33939
 
 
33940
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_1());
 
33941
  }
 
33942
 
 
33943
  // Constructor
 
33944
  Form_1(const dolfin::FunctionSpace& V0, const dolfin::GenericFunction& f):
 
33945
    dolfin::Form(1, 1), f(*this, 0)
 
33946
  {
 
33947
    _function_spaces[0] = reference_to_no_delete_pointer(V0);
 
33948
 
 
33949
    this->f = f;
 
33950
 
 
33951
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_1());
 
33952
  }
 
33953
 
 
33954
  // Constructor
 
33955
  Form_1(const dolfin::FunctionSpace& V0, boost::shared_ptr<const dolfin::GenericFunction> f):
 
33956
    dolfin::Form(1, 1), f(*this, 0)
 
33957
  {
 
33958
    _function_spaces[0] = reference_to_no_delete_pointer(V0);
 
33959
 
 
33960
    this->f = *f;
 
33961
 
 
33962
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_1());
 
33963
  }
 
33964
 
 
33965
  // Constructor
 
33966
  Form_1(boost::shared_ptr<const dolfin::FunctionSpace> V0):
 
33967
    dolfin::Form(1, 1), f(*this, 0)
 
33968
  {
 
33969
    _function_spaces[0] = V0;
 
33970
 
 
33971
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_1());
 
33972
  }
 
33973
 
 
33974
  // Constructor
 
33975
  Form_1(boost::shared_ptr<const dolfin::FunctionSpace> V0, const dolfin::GenericFunction& f):
 
33976
    dolfin::Form(1, 1), f(*this, 0)
 
33977
  {
 
33978
    _function_spaces[0] = V0;
 
33979
 
 
33980
    this->f = f;
 
33981
 
 
33982
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_1());
 
33983
  }
 
33984
 
 
33985
  // Constructor
 
33986
  Form_1(boost::shared_ptr<const dolfin::FunctionSpace> V0, boost::shared_ptr<const dolfin::GenericFunction> f):
 
33987
    dolfin::Form(1, 1), f(*this, 0)
 
33988
  {
 
33989
    _function_spaces[0] = V0;
 
33990
 
 
33991
    this->f = *f;
 
33992
 
 
33993
    _ufc_form = boost::shared_ptr<const ufc::form>(new stokes_form_1());
 
33994
  }
 
33995
 
 
33996
  // Destructor
 
33997
  ~Form_1()
 
33998
  {}
 
33999
 
 
34000
  /// Return the number of the coefficient with this name
 
34001
  virtual dolfin::uint coefficient_number(const std::string& name) const
 
34002
  {
 
34003
    if (name == "f")
 
34004
      return 0;
 
34005
 
 
34006
    dolfin::error("Invalid coefficient.");
 
34007
    return 0;
 
34008
  }
 
34009
 
 
34010
  /// Return the name of the coefficient with this number
 
34011
  virtual std::string coefficient_name(dolfin::uint i) const
 
34012
  {
 
34013
    switch (i)
 
34014
    {
 
34015
    case 0:
 
34016
      return "f";
 
34017
    }
 
34018
 
 
34019
    dolfin::error("Invalid coefficient.");
 
34020
    return "unnamed";
 
34021
  }
 
34022
 
 
34023
  // Typedefs
 
34024
  typedef Form_1_FunctionSpace_0 TestSpace;
 
34025
  typedef Form_1_FunctionSpace_1 CoefficientSpace_f;
 
34026
 
 
34027
  // Coefficients
 
34028
  dolfin::CoefficientAssigner f;
 
34029
};
 
34030
 
 
34031
// Class typedefs
 
34032
typedef Form_0 BilinearForm;
 
34033
typedef Form_1 LinearForm;
 
34034
typedef Form_0::TestSpace FunctionSpace;
 
34035
 
 
34036
}
 
34037
 
 
34038
#endif