1
// This code conforms with the UFC specification version 2.0.3
2
// and was automatically generated by FFC version 1.0-beta2+.
4
// This code was generated with the following parameters:
7
// convert_exceptions_to_warnings: True
9
// cpp_optimize_flags: '-O2'
11
// error_control: False
19
// quadrature_degree: 'auto'
20
// quadrature_rule: 'auto'
21
// representation: 'quadrature'
23
// swig_binary: 'swig'
26
#ifndef __NAVIERSTOKES_H
27
#define __NAVIERSTOKES_H
34
/// This class defines the interface for a finite element.
36
class navierstokes_finite_element_0: public ufc::finite_element
41
navierstokes_finite_element_0() : ufc::finite_element()
47
virtual ~navierstokes_finite_element_0()
52
/// Return a string identifying the finite element
53
virtual const char* signature() const
55
return "FiniteElement('Lagrange', Cell('tetrahedron', Space(3)), 1, None)";
58
/// Return the cell shape
59
virtual ufc::shape cell_shape() const
61
return ufc::tetrahedron;
64
/// Return the topological dimension of the cell shape
65
virtual unsigned int topological_dimension() const
70
/// Return the geometric dimension of the cell shape
71
virtual unsigned int geometric_dimension() const
76
/// Return the dimension of the finite element function space
77
virtual unsigned int space_dimension() const
82
/// Return the rank of the value space
83
virtual unsigned int value_rank() const
88
/// Return the dimension of the value space for axis i
89
virtual unsigned int value_dimension(unsigned int i) const
94
/// Evaluate basis function i at given point in cell
95
virtual void evaluate_basis(unsigned int i,
97
const double* coordinates,
98
const ufc::cell& c) const
100
// Extract vertex coordinates
101
const double * const * x = c.coordinates;
103
// Compute Jacobian of affine map from reference cell
104
const double J_00 = x[1][0] - x[0][0];
105
const double J_01 = x[2][0] - x[0][0];
106
const double J_02 = x[3][0] - x[0][0];
107
const double J_10 = x[1][1] - x[0][1];
108
const double J_11 = x[2][1] - x[0][1];
109
const double J_12 = x[3][1] - x[0][1];
110
const double J_20 = x[1][2] - x[0][2];
111
const double J_21 = x[2][2] - x[0][2];
112
const double J_22 = x[3][2] - x[0][2];
114
// Compute sub determinants
115
const double d_00 = J_11*J_22 - J_12*J_21;
116
const double d_01 = J_12*J_20 - J_10*J_22;
117
const double d_02 = J_10*J_21 - J_11*J_20;
118
const double d_10 = J_02*J_21 - J_01*J_22;
119
const double d_11 = J_00*J_22 - J_02*J_20;
120
const double d_12 = J_01*J_20 - J_00*J_21;
121
const double d_20 = J_01*J_12 - J_02*J_11;
122
const double d_21 = J_02*J_10 - J_00*J_12;
123
const double d_22 = J_00*J_11 - J_01*J_10;
125
// Compute determinant of Jacobian
126
double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
128
// Compute inverse of Jacobian
131
const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
132
const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
133
const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
135
// Get coordinates and map to the reference (FIAT) element
136
double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
137
double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
138
double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
148
// Array of basisvalues.
149
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
151
// Declare helper variables.
152
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
154
// Compute basisvalues.
155
basisvalues[0] = 1.0;
156
basisvalues[1] = tmp0;
157
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
158
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
159
basisvalues[0] *= std::sqrt(0.75);
160
basisvalues[3] *= std::sqrt(1.25);
161
basisvalues[2] *= std::sqrt(2.5);
162
basisvalues[1] *= std::sqrt(7.5);
164
// Table(s) of coefficients.
165
static const double coefficients0[4] = \
166
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
169
for (unsigned int r = 0; r < 4; r++)
171
*values += coefficients0[r]*basisvalues[r];
172
}// end loop over 'r'
178
// Array of basisvalues.
179
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
181
// Declare helper variables.
182
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
184
// Compute basisvalues.
185
basisvalues[0] = 1.0;
186
basisvalues[1] = tmp0;
187
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
188
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
189
basisvalues[0] *= std::sqrt(0.75);
190
basisvalues[3] *= std::sqrt(1.25);
191
basisvalues[2] *= std::sqrt(2.5);
192
basisvalues[1] *= std::sqrt(7.5);
194
// Table(s) of coefficients.
195
static const double coefficients0[4] = \
196
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
199
for (unsigned int r = 0; r < 4; r++)
201
*values += coefficients0[r]*basisvalues[r];
202
}// end loop over 'r'
208
// Array of basisvalues.
209
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
211
// Declare helper variables.
212
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
214
// Compute basisvalues.
215
basisvalues[0] = 1.0;
216
basisvalues[1] = tmp0;
217
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
218
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
219
basisvalues[0] *= std::sqrt(0.75);
220
basisvalues[3] *= std::sqrt(1.25);
221
basisvalues[2] *= std::sqrt(2.5);
222
basisvalues[1] *= std::sqrt(7.5);
224
// Table(s) of coefficients.
225
static const double coefficients0[4] = \
226
{0.28867513, 0.0, 0.21081851, -0.074535599};
229
for (unsigned int r = 0; r < 4; r++)
231
*values += coefficients0[r]*basisvalues[r];
232
}// end loop over 'r'
238
// Array of basisvalues.
239
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
241
// Declare helper variables.
242
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
244
// Compute basisvalues.
245
basisvalues[0] = 1.0;
246
basisvalues[1] = tmp0;
247
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
248
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
249
basisvalues[0] *= std::sqrt(0.75);
250
basisvalues[3] *= std::sqrt(1.25);
251
basisvalues[2] *= std::sqrt(2.5);
252
basisvalues[1] *= std::sqrt(7.5);
254
// Table(s) of coefficients.
255
static const double coefficients0[4] = \
256
{0.28867513, 0.0, 0.0, 0.2236068};
259
for (unsigned int r = 0; r < 4; r++)
261
*values += coefficients0[r]*basisvalues[r];
262
}// end loop over 'r'
269
/// Evaluate all basis functions at given point in cell
270
virtual void evaluate_basis_all(double* values,
271
const double* coordinates,
272
const ufc::cell& c) const
274
// Helper variable to hold values of a single dof.
275
double dof_values = 0.0;
277
// Loop dofs and call evaluate_basis.
278
for (unsigned int r = 0; r < 4; r++)
280
evaluate_basis(r, &dof_values, coordinates, c);
281
values[r] = dof_values;
282
}// end loop over 'r'
285
/// Evaluate order n derivatives of basis function i at given point in cell
286
virtual void evaluate_basis_derivatives(unsigned int i,
289
const double* coordinates,
290
const ufc::cell& c) const
292
// Extract vertex coordinates
293
const double * const * x = c.coordinates;
295
// Compute Jacobian of affine map from reference cell
296
const double J_00 = x[1][0] - x[0][0];
297
const double J_01 = x[2][0] - x[0][0];
298
const double J_02 = x[3][0] - x[0][0];
299
const double J_10 = x[1][1] - x[0][1];
300
const double J_11 = x[2][1] - x[0][1];
301
const double J_12 = x[3][1] - x[0][1];
302
const double J_20 = x[1][2] - x[0][2];
303
const double J_21 = x[2][2] - x[0][2];
304
const double J_22 = x[3][2] - x[0][2];
306
// Compute sub determinants
307
const double d_00 = J_11*J_22 - J_12*J_21;
308
const double d_01 = J_12*J_20 - J_10*J_22;
309
const double d_02 = J_10*J_21 - J_11*J_20;
310
const double d_10 = J_02*J_21 - J_01*J_22;
311
const double d_11 = J_00*J_22 - J_02*J_20;
312
const double d_12 = J_01*J_20 - J_00*J_21;
313
const double d_20 = J_01*J_12 - J_02*J_11;
314
const double d_21 = J_02*J_10 - J_00*J_12;
315
const double d_22 = J_00*J_11 - J_01*J_10;
317
// Compute determinant of Jacobian
318
double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
320
// Compute inverse of Jacobian
321
const double K_00 = d_00 / detJ;
322
const double K_01 = d_10 / detJ;
323
const double K_02 = d_20 / detJ;
324
const double K_10 = d_01 / detJ;
325
const double K_11 = d_11 / detJ;
326
const double K_12 = d_21 / detJ;
327
const double K_20 = d_02 / detJ;
328
const double K_21 = d_12 / detJ;
329
const double K_22 = d_22 / detJ;
332
const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
333
const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
334
const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
336
// Get coordinates and map to the reference (FIAT) element
337
double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
338
double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
339
double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
342
// Compute number of derivatives.
343
unsigned int num_derivatives = 1;
344
for (unsigned int r = 0; r < n; r++)
346
num_derivatives *= 3;
347
}// end loop over 'r'
349
// Declare pointer to two dimensional array that holds combinations of derivatives and initialise
350
unsigned int **combinations = new unsigned int *[num_derivatives];
351
for (unsigned int row = 0; row < num_derivatives; row++)
353
combinations[row] = new unsigned int [n];
354
for (unsigned int col = 0; col < n; col++)
355
combinations[row][col] = 0;
358
// Generate combinations of derivatives
359
for (unsigned int row = 1; row < num_derivatives; row++)
361
for (unsigned int num = 0; num < row; num++)
363
for (unsigned int col = n-1; col+1 > 0; col--)
365
if (combinations[row][col] + 1 > 2)
366
combinations[row][col] = 0;
369
combinations[row][col] += 1;
376
// Compute inverse of Jacobian
377
const double Jinv[3][3] = {{K_00, K_01, K_02}, {K_10, K_11, K_12}, {K_20, K_21, K_22}};
379
// Declare transformation matrix
380
// Declare pointer to two dimensional array and initialise
381
double **transform = new double *[num_derivatives];
383
for (unsigned int j = 0; j < num_derivatives; j++)
385
transform[j] = new double [num_derivatives];
386
for (unsigned int k = 0; k < num_derivatives; k++)
390
// Construct transformation matrix
391
for (unsigned int row = 0; row < num_derivatives; row++)
393
for (unsigned int col = 0; col < num_derivatives; col++)
395
for (unsigned int k = 0; k < n; k++)
396
transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
400
// Reset values. Assuming that values is always an array.
401
for (unsigned int r = 0; r < num_derivatives; r++)
404
}// end loop over 'r'
411
// Array of basisvalues.
412
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
414
// Declare helper variables.
415
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
417
// Compute basisvalues.
418
basisvalues[0] = 1.0;
419
basisvalues[1] = tmp0;
420
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
421
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
422
basisvalues[0] *= std::sqrt(0.75);
423
basisvalues[3] *= std::sqrt(1.25);
424
basisvalues[2] *= std::sqrt(2.5);
425
basisvalues[1] *= std::sqrt(7.5);
427
// Table(s) of coefficients.
428
static const double coefficients0[4] = \
429
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
431
// Tables of derivatives of the polynomial base (transpose).
432
static const double dmats0[4][4] = \
433
{{0.0, 0.0, 0.0, 0.0},
434
{6.3245553, 0.0, 0.0, 0.0},
435
{0.0, 0.0, 0.0, 0.0},
436
{0.0, 0.0, 0.0, 0.0}};
438
static const double dmats1[4][4] = \
439
{{0.0, 0.0, 0.0, 0.0},
440
{3.1622777, 0.0, 0.0, 0.0},
441
{5.4772256, 0.0, 0.0, 0.0},
442
{0.0, 0.0, 0.0, 0.0}};
444
static const double dmats2[4][4] = \
445
{{0.0, 0.0, 0.0, 0.0},
446
{3.1622777, 0.0, 0.0, 0.0},
447
{1.8257419, 0.0, 0.0, 0.0},
448
{5.1639778, 0.0, 0.0, 0.0}};
450
// Compute reference derivatives.
451
// Declare pointer to array of derivatives on FIAT element.
452
double *derivatives = new double[num_derivatives];
453
for (unsigned int r = 0; r < num_derivatives; r++)
455
derivatives[r] = 0.0;
456
}// end loop over 'r'
458
// Declare derivative matrix (of polynomial basis).
459
double dmats[4][4] = \
460
{{1.0, 0.0, 0.0, 0.0},
461
{0.0, 1.0, 0.0, 0.0},
462
{0.0, 0.0, 1.0, 0.0},
463
{0.0, 0.0, 0.0, 1.0}};
465
// Declare (auxiliary) derivative matrix (of polynomial basis).
466
double dmats_old[4][4] = \
467
{{1.0, 0.0, 0.0, 0.0},
468
{0.0, 1.0, 0.0, 0.0},
469
{0.0, 0.0, 1.0, 0.0},
470
{0.0, 0.0, 0.0, 1.0}};
472
// Loop possible derivatives.
473
for (unsigned int r = 0; r < num_derivatives; r++)
475
// Resetting dmats values to compute next derivative.
476
for (unsigned int t = 0; t < 4; t++)
478
for (unsigned int u = 0; u < 4; u++)
486
}// end loop over 'u'
487
}// end loop over 't'
489
// Looping derivative order to generate dmats.
490
for (unsigned int s = 0; s < n; s++)
492
// Updating dmats_old with new values and resetting dmats.
493
for (unsigned int t = 0; t < 4; t++)
495
for (unsigned int u = 0; u < 4; u++)
497
dmats_old[t][u] = dmats[t][u];
499
}// end loop over 'u'
500
}// end loop over 't'
502
// Update dmats using an inner product.
503
if (combinations[r][s] == 0)
505
for (unsigned int t = 0; t < 4; t++)
507
for (unsigned int u = 0; u < 4; u++)
509
for (unsigned int tu = 0; tu < 4; tu++)
511
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
512
}// end loop over 'tu'
513
}// end loop over 'u'
514
}// end loop over 't'
517
if (combinations[r][s] == 1)
519
for (unsigned int t = 0; t < 4; t++)
521
for (unsigned int u = 0; u < 4; u++)
523
for (unsigned int tu = 0; tu < 4; tu++)
525
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
526
}// end loop over 'tu'
527
}// end loop over 'u'
528
}// end loop over 't'
531
if (combinations[r][s] == 2)
533
for (unsigned int t = 0; t < 4; t++)
535
for (unsigned int u = 0; u < 4; u++)
537
for (unsigned int tu = 0; tu < 4; tu++)
539
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
540
}// end loop over 'tu'
541
}// end loop over 'u'
542
}// end loop over 't'
545
}// end loop over 's'
546
for (unsigned int s = 0; s < 4; s++)
548
for (unsigned int t = 0; t < 4; t++)
550
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
551
}// end loop over 't'
552
}// end loop over 's'
553
}// end loop over 'r'
555
// Transform derivatives back to physical element
556
for (unsigned int r = 0; r < num_derivatives; r++)
558
for (unsigned int s = 0; s < num_derivatives; s++)
560
values[r] += transform[r][s]*derivatives[s];
561
}// end loop over 's'
562
}// end loop over 'r'
564
// Delete pointer to array of derivatives on FIAT element
565
delete [] derivatives;
567
// Delete pointer to array of combinations of derivatives and transform
568
for (unsigned int r = 0; r < num_derivatives; r++)
570
delete [] combinations[r];
571
}// end loop over 'r'
572
delete [] combinations;
573
for (unsigned int r = 0; r < num_derivatives; r++)
575
delete [] transform[r];
576
}// end loop over 'r'
583
// Array of basisvalues.
584
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
586
// Declare helper variables.
587
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
589
// Compute basisvalues.
590
basisvalues[0] = 1.0;
591
basisvalues[1] = tmp0;
592
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
593
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
594
basisvalues[0] *= std::sqrt(0.75);
595
basisvalues[3] *= std::sqrt(1.25);
596
basisvalues[2] *= std::sqrt(2.5);
597
basisvalues[1] *= std::sqrt(7.5);
599
// Table(s) of coefficients.
600
static const double coefficients0[4] = \
601
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
603
// Tables of derivatives of the polynomial base (transpose).
604
static const double dmats0[4][4] = \
605
{{0.0, 0.0, 0.0, 0.0},
606
{6.3245553, 0.0, 0.0, 0.0},
607
{0.0, 0.0, 0.0, 0.0},
608
{0.0, 0.0, 0.0, 0.0}};
610
static const double dmats1[4][4] = \
611
{{0.0, 0.0, 0.0, 0.0},
612
{3.1622777, 0.0, 0.0, 0.0},
613
{5.4772256, 0.0, 0.0, 0.0},
614
{0.0, 0.0, 0.0, 0.0}};
616
static const double dmats2[4][4] = \
617
{{0.0, 0.0, 0.0, 0.0},
618
{3.1622777, 0.0, 0.0, 0.0},
619
{1.8257419, 0.0, 0.0, 0.0},
620
{5.1639778, 0.0, 0.0, 0.0}};
622
// Compute reference derivatives.
623
// Declare pointer to array of derivatives on FIAT element.
624
double *derivatives = new double[num_derivatives];
625
for (unsigned int r = 0; r < num_derivatives; r++)
627
derivatives[r] = 0.0;
628
}// end loop over 'r'
630
// Declare derivative matrix (of polynomial basis).
631
double dmats[4][4] = \
632
{{1.0, 0.0, 0.0, 0.0},
633
{0.0, 1.0, 0.0, 0.0},
634
{0.0, 0.0, 1.0, 0.0},
635
{0.0, 0.0, 0.0, 1.0}};
637
// Declare (auxiliary) derivative matrix (of polynomial basis).
638
double dmats_old[4][4] = \
639
{{1.0, 0.0, 0.0, 0.0},
640
{0.0, 1.0, 0.0, 0.0},
641
{0.0, 0.0, 1.0, 0.0},
642
{0.0, 0.0, 0.0, 1.0}};
644
// Loop possible derivatives.
645
for (unsigned int r = 0; r < num_derivatives; r++)
647
// Resetting dmats values to compute next derivative.
648
for (unsigned int t = 0; t < 4; t++)
650
for (unsigned int u = 0; u < 4; u++)
658
}// end loop over 'u'
659
}// end loop over 't'
661
// Looping derivative order to generate dmats.
662
for (unsigned int s = 0; s < n; s++)
664
// Updating dmats_old with new values and resetting dmats.
665
for (unsigned int t = 0; t < 4; t++)
667
for (unsigned int u = 0; u < 4; u++)
669
dmats_old[t][u] = dmats[t][u];
671
}// end loop over 'u'
672
}// end loop over 't'
674
// Update dmats using an inner product.
675
if (combinations[r][s] == 0)
677
for (unsigned int t = 0; t < 4; t++)
679
for (unsigned int u = 0; u < 4; u++)
681
for (unsigned int tu = 0; tu < 4; tu++)
683
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
684
}// end loop over 'tu'
685
}// end loop over 'u'
686
}// end loop over 't'
689
if (combinations[r][s] == 1)
691
for (unsigned int t = 0; t < 4; t++)
693
for (unsigned int u = 0; u < 4; u++)
695
for (unsigned int tu = 0; tu < 4; tu++)
697
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
698
}// end loop over 'tu'
699
}// end loop over 'u'
700
}// end loop over 't'
703
if (combinations[r][s] == 2)
705
for (unsigned int t = 0; t < 4; t++)
707
for (unsigned int u = 0; u < 4; u++)
709
for (unsigned int tu = 0; tu < 4; tu++)
711
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
712
}// end loop over 'tu'
713
}// end loop over 'u'
714
}// end loop over 't'
717
}// end loop over 's'
718
for (unsigned int s = 0; s < 4; s++)
720
for (unsigned int t = 0; t < 4; t++)
722
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
723
}// end loop over 't'
724
}// end loop over 's'
725
}// end loop over 'r'
727
// Transform derivatives back to physical element
728
for (unsigned int r = 0; r < num_derivatives; r++)
730
for (unsigned int s = 0; s < num_derivatives; s++)
732
values[r] += transform[r][s]*derivatives[s];
733
}// end loop over 's'
734
}// end loop over 'r'
736
// Delete pointer to array of derivatives on FIAT element
737
delete [] derivatives;
739
// Delete pointer to array of combinations of derivatives and transform
740
for (unsigned int r = 0; r < num_derivatives; r++)
742
delete [] combinations[r];
743
}// end loop over 'r'
744
delete [] combinations;
745
for (unsigned int r = 0; r < num_derivatives; r++)
747
delete [] transform[r];
748
}// end loop over 'r'
755
// Array of basisvalues.
756
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
758
// Declare helper variables.
759
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
761
// Compute basisvalues.
762
basisvalues[0] = 1.0;
763
basisvalues[1] = tmp0;
764
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
765
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
766
basisvalues[0] *= std::sqrt(0.75);
767
basisvalues[3] *= std::sqrt(1.25);
768
basisvalues[2] *= std::sqrt(2.5);
769
basisvalues[1] *= std::sqrt(7.5);
771
// Table(s) of coefficients.
772
static const double coefficients0[4] = \
773
{0.28867513, 0.0, 0.21081851, -0.074535599};
775
// Tables of derivatives of the polynomial base (transpose).
776
static const double dmats0[4][4] = \
777
{{0.0, 0.0, 0.0, 0.0},
778
{6.3245553, 0.0, 0.0, 0.0},
779
{0.0, 0.0, 0.0, 0.0},
780
{0.0, 0.0, 0.0, 0.0}};
782
static const double dmats1[4][4] = \
783
{{0.0, 0.0, 0.0, 0.0},
784
{3.1622777, 0.0, 0.0, 0.0},
785
{5.4772256, 0.0, 0.0, 0.0},
786
{0.0, 0.0, 0.0, 0.0}};
788
static const double dmats2[4][4] = \
789
{{0.0, 0.0, 0.0, 0.0},
790
{3.1622777, 0.0, 0.0, 0.0},
791
{1.8257419, 0.0, 0.0, 0.0},
792
{5.1639778, 0.0, 0.0, 0.0}};
794
// Compute reference derivatives.
795
// Declare pointer to array of derivatives on FIAT element.
796
double *derivatives = new double[num_derivatives];
797
for (unsigned int r = 0; r < num_derivatives; r++)
799
derivatives[r] = 0.0;
800
}// end loop over 'r'
802
// Declare derivative matrix (of polynomial basis).
803
double dmats[4][4] = \
804
{{1.0, 0.0, 0.0, 0.0},
805
{0.0, 1.0, 0.0, 0.0},
806
{0.0, 0.0, 1.0, 0.0},
807
{0.0, 0.0, 0.0, 1.0}};
809
// Declare (auxiliary) derivative matrix (of polynomial basis).
810
double dmats_old[4][4] = \
811
{{1.0, 0.0, 0.0, 0.0},
812
{0.0, 1.0, 0.0, 0.0},
813
{0.0, 0.0, 1.0, 0.0},
814
{0.0, 0.0, 0.0, 1.0}};
816
// Loop possible derivatives.
817
for (unsigned int r = 0; r < num_derivatives; r++)
819
// Resetting dmats values to compute next derivative.
820
for (unsigned int t = 0; t < 4; t++)
822
for (unsigned int u = 0; u < 4; u++)
830
}// end loop over 'u'
831
}// end loop over 't'
833
// Looping derivative order to generate dmats.
834
for (unsigned int s = 0; s < n; s++)
836
// Updating dmats_old with new values and resetting dmats.
837
for (unsigned int t = 0; t < 4; t++)
839
for (unsigned int u = 0; u < 4; u++)
841
dmats_old[t][u] = dmats[t][u];
843
}// end loop over 'u'
844
}// end loop over 't'
846
// Update dmats using an inner product.
847
if (combinations[r][s] == 0)
849
for (unsigned int t = 0; t < 4; t++)
851
for (unsigned int u = 0; u < 4; u++)
853
for (unsigned int tu = 0; tu < 4; tu++)
855
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
856
}// end loop over 'tu'
857
}// end loop over 'u'
858
}// end loop over 't'
861
if (combinations[r][s] == 1)
863
for (unsigned int t = 0; t < 4; t++)
865
for (unsigned int u = 0; u < 4; u++)
867
for (unsigned int tu = 0; tu < 4; tu++)
869
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
870
}// end loop over 'tu'
871
}// end loop over 'u'
872
}// end loop over 't'
875
if (combinations[r][s] == 2)
877
for (unsigned int t = 0; t < 4; t++)
879
for (unsigned int u = 0; u < 4; u++)
881
for (unsigned int tu = 0; tu < 4; tu++)
883
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
884
}// end loop over 'tu'
885
}// end loop over 'u'
886
}// end loop over 't'
889
}// end loop over 's'
890
for (unsigned int s = 0; s < 4; s++)
892
for (unsigned int t = 0; t < 4; t++)
894
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
895
}// end loop over 't'
896
}// end loop over 's'
897
}// end loop over 'r'
899
// Transform derivatives back to physical element
900
for (unsigned int r = 0; r < num_derivatives; r++)
902
for (unsigned int s = 0; s < num_derivatives; s++)
904
values[r] += transform[r][s]*derivatives[s];
905
}// end loop over 's'
906
}// end loop over 'r'
908
// Delete pointer to array of derivatives on FIAT element
909
delete [] derivatives;
911
// Delete pointer to array of combinations of derivatives and transform
912
for (unsigned int r = 0; r < num_derivatives; r++)
914
delete [] combinations[r];
915
}// end loop over 'r'
916
delete [] combinations;
917
for (unsigned int r = 0; r < num_derivatives; r++)
919
delete [] transform[r];
920
}// end loop over 'r'
927
// Array of basisvalues.
928
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
930
// Declare helper variables.
931
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
933
// Compute basisvalues.
934
basisvalues[0] = 1.0;
935
basisvalues[1] = tmp0;
936
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
937
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
938
basisvalues[0] *= std::sqrt(0.75);
939
basisvalues[3] *= std::sqrt(1.25);
940
basisvalues[2] *= std::sqrt(2.5);
941
basisvalues[1] *= std::sqrt(7.5);
943
// Table(s) of coefficients.
944
static const double coefficients0[4] = \
945
{0.28867513, 0.0, 0.0, 0.2236068};
947
// Tables of derivatives of the polynomial base (transpose).
948
static const double dmats0[4][4] = \
949
{{0.0, 0.0, 0.0, 0.0},
950
{6.3245553, 0.0, 0.0, 0.0},
951
{0.0, 0.0, 0.0, 0.0},
952
{0.0, 0.0, 0.0, 0.0}};
954
static const double dmats1[4][4] = \
955
{{0.0, 0.0, 0.0, 0.0},
956
{3.1622777, 0.0, 0.0, 0.0},
957
{5.4772256, 0.0, 0.0, 0.0},
958
{0.0, 0.0, 0.0, 0.0}};
960
static const double dmats2[4][4] = \
961
{{0.0, 0.0, 0.0, 0.0},
962
{3.1622777, 0.0, 0.0, 0.0},
963
{1.8257419, 0.0, 0.0, 0.0},
964
{5.1639778, 0.0, 0.0, 0.0}};
966
// Compute reference derivatives.
967
// Declare pointer to array of derivatives on FIAT element.
968
double *derivatives = new double[num_derivatives];
969
for (unsigned int r = 0; r < num_derivatives; r++)
971
derivatives[r] = 0.0;
972
}// end loop over 'r'
974
// Declare derivative matrix (of polynomial basis).
975
double dmats[4][4] = \
976
{{1.0, 0.0, 0.0, 0.0},
977
{0.0, 1.0, 0.0, 0.0},
978
{0.0, 0.0, 1.0, 0.0},
979
{0.0, 0.0, 0.0, 1.0}};
981
// Declare (auxiliary) derivative matrix (of polynomial basis).
982
double dmats_old[4][4] = \
983
{{1.0, 0.0, 0.0, 0.0},
984
{0.0, 1.0, 0.0, 0.0},
985
{0.0, 0.0, 1.0, 0.0},
986
{0.0, 0.0, 0.0, 1.0}};
988
// Loop possible derivatives.
989
for (unsigned int r = 0; r < num_derivatives; r++)
991
// Resetting dmats values to compute next derivative.
992
for (unsigned int t = 0; t < 4; t++)
994
for (unsigned int u = 0; u < 4; u++)
1002
}// end loop over 'u'
1003
}// end loop over 't'
1005
// Looping derivative order to generate dmats.
1006
for (unsigned int s = 0; s < n; s++)
1008
// Updating dmats_old with new values and resetting dmats.
1009
for (unsigned int t = 0; t < 4; t++)
1011
for (unsigned int u = 0; u < 4; u++)
1013
dmats_old[t][u] = dmats[t][u];
1015
}// end loop over 'u'
1016
}// end loop over 't'
1018
// Update dmats using an inner product.
1019
if (combinations[r][s] == 0)
1021
for (unsigned int t = 0; t < 4; t++)
1023
for (unsigned int u = 0; u < 4; u++)
1025
for (unsigned int tu = 0; tu < 4; tu++)
1027
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1028
}// end loop over 'tu'
1029
}// end loop over 'u'
1030
}// end loop over 't'
1033
if (combinations[r][s] == 1)
1035
for (unsigned int t = 0; t < 4; t++)
1037
for (unsigned int u = 0; u < 4; u++)
1039
for (unsigned int tu = 0; tu < 4; tu++)
1041
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1042
}// end loop over 'tu'
1043
}// end loop over 'u'
1044
}// end loop over 't'
1047
if (combinations[r][s] == 2)
1049
for (unsigned int t = 0; t < 4; t++)
1051
for (unsigned int u = 0; u < 4; u++)
1053
for (unsigned int tu = 0; tu < 4; tu++)
1055
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1056
}// end loop over 'tu'
1057
}// end loop over 'u'
1058
}// end loop over 't'
1061
}// end loop over 's'
1062
for (unsigned int s = 0; s < 4; s++)
1064
for (unsigned int t = 0; t < 4; t++)
1066
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1067
}// end loop over 't'
1068
}// end loop over 's'
1069
}// end loop over 'r'
1071
// Transform derivatives back to physical element
1072
for (unsigned int r = 0; r < num_derivatives; r++)
1074
for (unsigned int s = 0; s < num_derivatives; s++)
1076
values[r] += transform[r][s]*derivatives[s];
1077
}// end loop over 's'
1078
}// end loop over 'r'
1080
// Delete pointer to array of derivatives on FIAT element
1081
delete [] derivatives;
1083
// Delete pointer to array of combinations of derivatives and transform
1084
for (unsigned int r = 0; r < num_derivatives; r++)
1086
delete [] combinations[r];
1087
}// end loop over 'r'
1088
delete [] combinations;
1089
for (unsigned int r = 0; r < num_derivatives; r++)
1091
delete [] transform[r];
1092
}// end loop over 'r'
1093
delete [] transform;
1100
/// Evaluate order n derivatives of all basis functions at given point in cell
1101
virtual void evaluate_basis_derivatives_all(unsigned int n,
1103
const double* coordinates,
1104
const ufc::cell& c) const
1106
// Compute number of derivatives.
1107
unsigned int num_derivatives = 1;
1108
for (unsigned int r = 0; r < n; r++)
1110
num_derivatives *= 3;
1111
}// end loop over 'r'
1113
// Helper variable to hold values of a single dof.
1114
double *dof_values = new double[num_derivatives];
1115
for (unsigned int r = 0; r < num_derivatives; r++)
1117
dof_values[r] = 0.0;
1118
}// end loop over 'r'
1120
// Loop dofs and call evaluate_basis_derivatives.
1121
for (unsigned int r = 0; r < 4; r++)
1123
evaluate_basis_derivatives(r, n, dof_values, coordinates, c);
1124
for (unsigned int s = 0; s < num_derivatives; s++)
1126
values[r*num_derivatives + s] = dof_values[s];
1127
}// end loop over 's'
1128
}// end loop over 'r'
1131
delete [] dof_values;
1134
/// Evaluate linear functional for dof i on the function f
1135
virtual double evaluate_dof(unsigned int i,
1136
const ufc::function& f,
1137
const ufc::cell& c) const
1139
// Declare variables for result of evaluation.
1142
// Declare variable for physical coordinates.
1144
const double * const * x = c.coordinates;
1152
f.evaluate(vals, y, c);
1161
f.evaluate(vals, y, c);
1170
f.evaluate(vals, y, c);
1179
f.evaluate(vals, y, c);
1188
/// Evaluate linear functionals for all dofs on the function f
1189
virtual void evaluate_dofs(double* values,
1190
const ufc::function& f,
1191
const ufc::cell& c) const
1193
// Declare variables for result of evaluation.
1196
// Declare variable for physical coordinates.
1198
const double * const * x = c.coordinates;
1202
f.evaluate(vals, y, c);
1203
values[0] = vals[0];
1207
f.evaluate(vals, y, c);
1208
values[1] = vals[0];
1212
f.evaluate(vals, y, c);
1213
values[2] = vals[0];
1217
f.evaluate(vals, y, c);
1218
values[3] = vals[0];
1221
/// Interpolate vertex values from dof values
1222
virtual void interpolate_vertex_values(double* vertex_values,
1223
const double* dof_values,
1224
const ufc::cell& c) const
1226
// Evaluate function and change variables
1227
vertex_values[0] = dof_values[0];
1228
vertex_values[1] = dof_values[1];
1229
vertex_values[2] = dof_values[2];
1230
vertex_values[3] = dof_values[3];
1233
/// Map coordinate xhat from reference cell to coordinate x in cell
1234
virtual void map_from_reference_cell(double* x,
1236
const ufc::cell& c) const
1238
std::cerr << "*** FFC warning: " << "map_from_reference_cell not yet implemented (introduced in UFC 2.0)." << std::endl;
1241
/// Map from coordinate x in cell to coordinate xhat in reference cell
1242
virtual void map_to_reference_cell(double* xhat,
1244
const ufc::cell& c) const
1246
std::cerr << "*** FFC warning: " << "map_to_reference_cell not yet implemented (introduced in UFC 2.0)." << std::endl;
1249
/// Return the number of sub elements (for a mixed element)
1250
virtual unsigned int num_sub_elements() const
1255
/// Create a new finite element for sub element i (for a mixed element)
1256
virtual ufc::finite_element* create_sub_element(unsigned int i) const
1261
/// Create a new class instance
1262
virtual ufc::finite_element* create() const
1264
return new navierstokes_finite_element_0();
1269
/// This class defines the interface for a finite element.
1271
class navierstokes_finite_element_1: public ufc::finite_element
1276
navierstokes_finite_element_1() : ufc::finite_element()
1282
virtual ~navierstokes_finite_element_1()
1287
/// Return a string identifying the finite element
1288
virtual const char* signature() const
1290
return "VectorElement('Lagrange', Cell('tetrahedron', Space(3)), 1, 3, None)";
1293
/// Return the cell shape
1294
virtual ufc::shape cell_shape() const
1296
return ufc::tetrahedron;
1299
/// Return the topological dimension of the cell shape
1300
virtual unsigned int topological_dimension() const
1305
/// Return the geometric dimension of the cell shape
1306
virtual unsigned int geometric_dimension() const
1311
/// Return the dimension of the finite element function space
1312
virtual unsigned int space_dimension() const
1317
/// Return the rank of the value space
1318
virtual unsigned int value_rank() const
1323
/// Return the dimension of the value space for axis i
1324
virtual unsigned int value_dimension(unsigned int i) const
1338
/// Evaluate basis function i at given point in cell
1339
virtual void evaluate_basis(unsigned int i,
1341
const double* coordinates,
1342
const ufc::cell& c) const
1344
// Extract vertex coordinates
1345
const double * const * x = c.coordinates;
1347
// Compute Jacobian of affine map from reference cell
1348
const double J_00 = x[1][0] - x[0][0];
1349
const double J_01 = x[2][0] - x[0][0];
1350
const double J_02 = x[3][0] - x[0][0];
1351
const double J_10 = x[1][1] - x[0][1];
1352
const double J_11 = x[2][1] - x[0][1];
1353
const double J_12 = x[3][1] - x[0][1];
1354
const double J_20 = x[1][2] - x[0][2];
1355
const double J_21 = x[2][2] - x[0][2];
1356
const double J_22 = x[3][2] - x[0][2];
1358
// Compute sub determinants
1359
const double d_00 = J_11*J_22 - J_12*J_21;
1360
const double d_01 = J_12*J_20 - J_10*J_22;
1361
const double d_02 = J_10*J_21 - J_11*J_20;
1362
const double d_10 = J_02*J_21 - J_01*J_22;
1363
const double d_11 = J_00*J_22 - J_02*J_20;
1364
const double d_12 = J_01*J_20 - J_00*J_21;
1365
const double d_20 = J_01*J_12 - J_02*J_11;
1366
const double d_21 = J_02*J_10 - J_00*J_12;
1367
const double d_22 = J_00*J_11 - J_01*J_10;
1369
// Compute determinant of Jacobian
1370
double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
1372
// Compute inverse of Jacobian
1374
// Compute constants
1375
const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
1376
const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
1377
const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
1379
// Get coordinates and map to the reference (FIAT) element
1380
double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
1381
double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
1382
double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
1394
// Array of basisvalues.
1395
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1397
// Declare helper variables.
1398
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1400
// Compute basisvalues.
1401
basisvalues[0] = 1.0;
1402
basisvalues[1] = tmp0;
1403
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1404
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1405
basisvalues[0] *= std::sqrt(0.75);
1406
basisvalues[3] *= std::sqrt(1.25);
1407
basisvalues[2] *= std::sqrt(2.5);
1408
basisvalues[1] *= std::sqrt(7.5);
1410
// Table(s) of coefficients.
1411
static const double coefficients0[4] = \
1412
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
1414
// Compute value(s).
1415
for (unsigned int r = 0; r < 4; r++)
1417
values[0] += coefficients0[r]*basisvalues[r];
1418
}// end loop over 'r'
1424
// Array of basisvalues.
1425
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1427
// Declare helper variables.
1428
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1430
// Compute basisvalues.
1431
basisvalues[0] = 1.0;
1432
basisvalues[1] = tmp0;
1433
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1434
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1435
basisvalues[0] *= std::sqrt(0.75);
1436
basisvalues[3] *= std::sqrt(1.25);
1437
basisvalues[2] *= std::sqrt(2.5);
1438
basisvalues[1] *= std::sqrt(7.5);
1440
// Table(s) of coefficients.
1441
static const double coefficients0[4] = \
1442
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
1444
// Compute value(s).
1445
for (unsigned int r = 0; r < 4; r++)
1447
values[0] += coefficients0[r]*basisvalues[r];
1448
}// end loop over 'r'
1454
// Array of basisvalues.
1455
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1457
// Declare helper variables.
1458
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1460
// Compute basisvalues.
1461
basisvalues[0] = 1.0;
1462
basisvalues[1] = tmp0;
1463
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1464
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1465
basisvalues[0] *= std::sqrt(0.75);
1466
basisvalues[3] *= std::sqrt(1.25);
1467
basisvalues[2] *= std::sqrt(2.5);
1468
basisvalues[1] *= std::sqrt(7.5);
1470
// Table(s) of coefficients.
1471
static const double coefficients0[4] = \
1472
{0.28867513, 0.0, 0.21081851, -0.074535599};
1474
// Compute value(s).
1475
for (unsigned int r = 0; r < 4; r++)
1477
values[0] += coefficients0[r]*basisvalues[r];
1478
}// end loop over 'r'
1484
// Array of basisvalues.
1485
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1487
// Declare helper variables.
1488
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1490
// Compute basisvalues.
1491
basisvalues[0] = 1.0;
1492
basisvalues[1] = tmp0;
1493
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1494
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1495
basisvalues[0] *= std::sqrt(0.75);
1496
basisvalues[3] *= std::sqrt(1.25);
1497
basisvalues[2] *= std::sqrt(2.5);
1498
basisvalues[1] *= std::sqrt(7.5);
1500
// Table(s) of coefficients.
1501
static const double coefficients0[4] = \
1502
{0.28867513, 0.0, 0.0, 0.2236068};
1504
// Compute value(s).
1505
for (unsigned int r = 0; r < 4; r++)
1507
values[0] += coefficients0[r]*basisvalues[r];
1508
}// end loop over 'r'
1514
// Array of basisvalues.
1515
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1517
// Declare helper variables.
1518
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1520
// Compute basisvalues.
1521
basisvalues[0] = 1.0;
1522
basisvalues[1] = tmp0;
1523
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1524
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1525
basisvalues[0] *= std::sqrt(0.75);
1526
basisvalues[3] *= std::sqrt(1.25);
1527
basisvalues[2] *= std::sqrt(2.5);
1528
basisvalues[1] *= std::sqrt(7.5);
1530
// Table(s) of coefficients.
1531
static const double coefficients0[4] = \
1532
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
1534
// Compute value(s).
1535
for (unsigned int r = 0; r < 4; r++)
1537
values[1] += coefficients0[r]*basisvalues[r];
1538
}// end loop over 'r'
1544
// Array of basisvalues.
1545
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1547
// Declare helper variables.
1548
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1550
// Compute basisvalues.
1551
basisvalues[0] = 1.0;
1552
basisvalues[1] = tmp0;
1553
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1554
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1555
basisvalues[0] *= std::sqrt(0.75);
1556
basisvalues[3] *= std::sqrt(1.25);
1557
basisvalues[2] *= std::sqrt(2.5);
1558
basisvalues[1] *= std::sqrt(7.5);
1560
// Table(s) of coefficients.
1561
static const double coefficients0[4] = \
1562
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
1564
// Compute value(s).
1565
for (unsigned int r = 0; r < 4; r++)
1567
values[1] += coefficients0[r]*basisvalues[r];
1568
}// end loop over 'r'
1574
// Array of basisvalues.
1575
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1577
// Declare helper variables.
1578
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1580
// Compute basisvalues.
1581
basisvalues[0] = 1.0;
1582
basisvalues[1] = tmp0;
1583
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1584
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1585
basisvalues[0] *= std::sqrt(0.75);
1586
basisvalues[3] *= std::sqrt(1.25);
1587
basisvalues[2] *= std::sqrt(2.5);
1588
basisvalues[1] *= std::sqrt(7.5);
1590
// Table(s) of coefficients.
1591
static const double coefficients0[4] = \
1592
{0.28867513, 0.0, 0.21081851, -0.074535599};
1594
// Compute value(s).
1595
for (unsigned int r = 0; r < 4; r++)
1597
values[1] += coefficients0[r]*basisvalues[r];
1598
}// end loop over 'r'
1604
// Array of basisvalues.
1605
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1607
// Declare helper variables.
1608
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1610
// Compute basisvalues.
1611
basisvalues[0] = 1.0;
1612
basisvalues[1] = tmp0;
1613
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1614
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1615
basisvalues[0] *= std::sqrt(0.75);
1616
basisvalues[3] *= std::sqrt(1.25);
1617
basisvalues[2] *= std::sqrt(2.5);
1618
basisvalues[1] *= std::sqrt(7.5);
1620
// Table(s) of coefficients.
1621
static const double coefficients0[4] = \
1622
{0.28867513, 0.0, 0.0, 0.2236068};
1624
// Compute value(s).
1625
for (unsigned int r = 0; r < 4; r++)
1627
values[1] += coefficients0[r]*basisvalues[r];
1628
}// end loop over 'r'
1634
// Array of basisvalues.
1635
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1637
// Declare helper variables.
1638
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1640
// Compute basisvalues.
1641
basisvalues[0] = 1.0;
1642
basisvalues[1] = tmp0;
1643
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1644
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1645
basisvalues[0] *= std::sqrt(0.75);
1646
basisvalues[3] *= std::sqrt(1.25);
1647
basisvalues[2] *= std::sqrt(2.5);
1648
basisvalues[1] *= std::sqrt(7.5);
1650
// Table(s) of coefficients.
1651
static const double coefficients0[4] = \
1652
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
1654
// Compute value(s).
1655
for (unsigned int r = 0; r < 4; r++)
1657
values[2] += coefficients0[r]*basisvalues[r];
1658
}// end loop over 'r'
1664
// Array of basisvalues.
1665
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1667
// Declare helper variables.
1668
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1670
// Compute basisvalues.
1671
basisvalues[0] = 1.0;
1672
basisvalues[1] = tmp0;
1673
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1674
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1675
basisvalues[0] *= std::sqrt(0.75);
1676
basisvalues[3] *= std::sqrt(1.25);
1677
basisvalues[2] *= std::sqrt(2.5);
1678
basisvalues[1] *= std::sqrt(7.5);
1680
// Table(s) of coefficients.
1681
static const double coefficients0[4] = \
1682
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
1684
// Compute value(s).
1685
for (unsigned int r = 0; r < 4; r++)
1687
values[2] += coefficients0[r]*basisvalues[r];
1688
}// end loop over 'r'
1694
// Array of basisvalues.
1695
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1697
// Declare helper variables.
1698
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1700
// Compute basisvalues.
1701
basisvalues[0] = 1.0;
1702
basisvalues[1] = tmp0;
1703
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1704
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1705
basisvalues[0] *= std::sqrt(0.75);
1706
basisvalues[3] *= std::sqrt(1.25);
1707
basisvalues[2] *= std::sqrt(2.5);
1708
basisvalues[1] *= std::sqrt(7.5);
1710
// Table(s) of coefficients.
1711
static const double coefficients0[4] = \
1712
{0.28867513, 0.0, 0.21081851, -0.074535599};
1714
// Compute value(s).
1715
for (unsigned int r = 0; r < 4; r++)
1717
values[2] += coefficients0[r]*basisvalues[r];
1718
}// end loop over 'r'
1724
// Array of basisvalues.
1725
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1727
// Declare helper variables.
1728
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1730
// Compute basisvalues.
1731
basisvalues[0] = 1.0;
1732
basisvalues[1] = tmp0;
1733
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1734
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1735
basisvalues[0] *= std::sqrt(0.75);
1736
basisvalues[3] *= std::sqrt(1.25);
1737
basisvalues[2] *= std::sqrt(2.5);
1738
basisvalues[1] *= std::sqrt(7.5);
1740
// Table(s) of coefficients.
1741
static const double coefficients0[4] = \
1742
{0.28867513, 0.0, 0.0, 0.2236068};
1744
// Compute value(s).
1745
for (unsigned int r = 0; r < 4; r++)
1747
values[2] += coefficients0[r]*basisvalues[r];
1748
}// end loop over 'r'
1755
/// Evaluate all basis functions at given point in cell
1756
virtual void evaluate_basis_all(double* values,
1757
const double* coordinates,
1758
const ufc::cell& c) const
1760
// Helper variable to hold values of a single dof.
1761
double dof_values[3] = {0.0, 0.0, 0.0};
1763
// Loop dofs and call evaluate_basis.
1764
for (unsigned int r = 0; r < 12; r++)
1766
evaluate_basis(r, dof_values, coordinates, c);
1767
for (unsigned int s = 0; s < 3; s++)
1769
values[r*3 + s] = dof_values[s];
1770
}// end loop over 's'
1771
}// end loop over 'r'
1774
/// Evaluate order n derivatives of basis function i at given point in cell
1775
virtual void evaluate_basis_derivatives(unsigned int i,
1778
const double* coordinates,
1779
const ufc::cell& c) const
1781
// Extract vertex coordinates
1782
const double * const * x = c.coordinates;
1784
// Compute Jacobian of affine map from reference cell
1785
const double J_00 = x[1][0] - x[0][0];
1786
const double J_01 = x[2][0] - x[0][0];
1787
const double J_02 = x[3][0] - x[0][0];
1788
const double J_10 = x[1][1] - x[0][1];
1789
const double J_11 = x[2][1] - x[0][1];
1790
const double J_12 = x[3][1] - x[0][1];
1791
const double J_20 = x[1][2] - x[0][2];
1792
const double J_21 = x[2][2] - x[0][2];
1793
const double J_22 = x[3][2] - x[0][2];
1795
// Compute sub determinants
1796
const double d_00 = J_11*J_22 - J_12*J_21;
1797
const double d_01 = J_12*J_20 - J_10*J_22;
1798
const double d_02 = J_10*J_21 - J_11*J_20;
1799
const double d_10 = J_02*J_21 - J_01*J_22;
1800
const double d_11 = J_00*J_22 - J_02*J_20;
1801
const double d_12 = J_01*J_20 - J_00*J_21;
1802
const double d_20 = J_01*J_12 - J_02*J_11;
1803
const double d_21 = J_02*J_10 - J_00*J_12;
1804
const double d_22 = J_00*J_11 - J_01*J_10;
1806
// Compute determinant of Jacobian
1807
double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
1809
// Compute inverse of Jacobian
1810
const double K_00 = d_00 / detJ;
1811
const double K_01 = d_10 / detJ;
1812
const double K_02 = d_20 / detJ;
1813
const double K_10 = d_01 / detJ;
1814
const double K_11 = d_11 / detJ;
1815
const double K_12 = d_21 / detJ;
1816
const double K_20 = d_02 / detJ;
1817
const double K_21 = d_12 / detJ;
1818
const double K_22 = d_22 / detJ;
1820
// Compute constants
1821
const double C0 = x[3][0] + x[2][0] + x[1][0] - x[0][0];
1822
const double C1 = x[3][1] + x[2][1] + x[1][1] - x[0][1];
1823
const double C2 = x[3][2] + x[2][2] + x[1][2] - x[0][2];
1825
// Get coordinates and map to the reference (FIAT) element
1826
double X = (d_00*(2.0*coordinates[0] - C0) + d_10*(2.0*coordinates[1] - C1) + d_20*(2.0*coordinates[2] - C2)) / detJ;
1827
double Y = (d_01*(2.0*coordinates[0] - C0) + d_11*(2.0*coordinates[1] - C1) + d_21*(2.0*coordinates[2] - C2)) / detJ;
1828
double Z = (d_02*(2.0*coordinates[0] - C0) + d_12*(2.0*coordinates[1] - C1) + d_22*(2.0*coordinates[2] - C2)) / detJ;
1831
// Compute number of derivatives.
1832
unsigned int num_derivatives = 1;
1833
for (unsigned int r = 0; r < n; r++)
1835
num_derivatives *= 3;
1836
}// end loop over 'r'
1838
// Declare pointer to two dimensional array that holds combinations of derivatives and initialise
1839
unsigned int **combinations = new unsigned int *[num_derivatives];
1840
for (unsigned int row = 0; row < num_derivatives; row++)
1842
combinations[row] = new unsigned int [n];
1843
for (unsigned int col = 0; col < n; col++)
1844
combinations[row][col] = 0;
1847
// Generate combinations of derivatives
1848
for (unsigned int row = 1; row < num_derivatives; row++)
1850
for (unsigned int num = 0; num < row; num++)
1852
for (unsigned int col = n-1; col+1 > 0; col--)
1854
if (combinations[row][col] + 1 > 2)
1855
combinations[row][col] = 0;
1858
combinations[row][col] += 1;
1865
// Compute inverse of Jacobian
1866
const double Jinv[3][3] = {{K_00, K_01, K_02}, {K_10, K_11, K_12}, {K_20, K_21, K_22}};
1868
// Declare transformation matrix
1869
// Declare pointer to two dimensional array and initialise
1870
double **transform = new double *[num_derivatives];
1872
for (unsigned int j = 0; j < num_derivatives; j++)
1874
transform[j] = new double [num_derivatives];
1875
for (unsigned int k = 0; k < num_derivatives; k++)
1876
transform[j][k] = 1;
1879
// Construct transformation matrix
1880
for (unsigned int row = 0; row < num_derivatives; row++)
1882
for (unsigned int col = 0; col < num_derivatives; col++)
1884
for (unsigned int k = 0; k < n; k++)
1885
transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
1889
// Reset values. Assuming that values is always an array.
1890
for (unsigned int r = 0; r < 3*num_derivatives; r++)
1893
}// end loop over 'r'
1900
// Array of basisvalues.
1901
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
1903
// Declare helper variables.
1904
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
1906
// Compute basisvalues.
1907
basisvalues[0] = 1.0;
1908
basisvalues[1] = tmp0;
1909
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
1910
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
1911
basisvalues[0] *= std::sqrt(0.75);
1912
basisvalues[3] *= std::sqrt(1.25);
1913
basisvalues[2] *= std::sqrt(2.5);
1914
basisvalues[1] *= std::sqrt(7.5);
1916
// Table(s) of coefficients.
1917
static const double coefficients0[4] = \
1918
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
1920
// Tables of derivatives of the polynomial base (transpose).
1921
static const double dmats0[4][4] = \
1922
{{0.0, 0.0, 0.0, 0.0},
1923
{6.3245553, 0.0, 0.0, 0.0},
1924
{0.0, 0.0, 0.0, 0.0},
1925
{0.0, 0.0, 0.0, 0.0}};
1927
static const double dmats1[4][4] = \
1928
{{0.0, 0.0, 0.0, 0.0},
1929
{3.1622777, 0.0, 0.0, 0.0},
1930
{5.4772256, 0.0, 0.0, 0.0},
1931
{0.0, 0.0, 0.0, 0.0}};
1933
static const double dmats2[4][4] = \
1934
{{0.0, 0.0, 0.0, 0.0},
1935
{3.1622777, 0.0, 0.0, 0.0},
1936
{1.8257419, 0.0, 0.0, 0.0},
1937
{5.1639778, 0.0, 0.0, 0.0}};
1939
// Compute reference derivatives.
1940
// Declare pointer to array of derivatives on FIAT element.
1941
double *derivatives = new double[num_derivatives];
1942
for (unsigned int r = 0; r < num_derivatives; r++)
1944
derivatives[r] = 0.0;
1945
}// end loop over 'r'
1947
// Declare derivative matrix (of polynomial basis).
1948
double dmats[4][4] = \
1949
{{1.0, 0.0, 0.0, 0.0},
1950
{0.0, 1.0, 0.0, 0.0},
1951
{0.0, 0.0, 1.0, 0.0},
1952
{0.0, 0.0, 0.0, 1.0}};
1954
// Declare (auxiliary) derivative matrix (of polynomial basis).
1955
double dmats_old[4][4] = \
1956
{{1.0, 0.0, 0.0, 0.0},
1957
{0.0, 1.0, 0.0, 0.0},
1958
{0.0, 0.0, 1.0, 0.0},
1959
{0.0, 0.0, 0.0, 1.0}};
1961
// Loop possible derivatives.
1962
for (unsigned int r = 0; r < num_derivatives; r++)
1964
// Resetting dmats values to compute next derivative.
1965
for (unsigned int t = 0; t < 4; t++)
1967
for (unsigned int u = 0; u < 4; u++)
1975
}// end loop over 'u'
1976
}// end loop over 't'
1978
// Looping derivative order to generate dmats.
1979
for (unsigned int s = 0; s < n; s++)
1981
// Updating dmats_old with new values and resetting dmats.
1982
for (unsigned int t = 0; t < 4; t++)
1984
for (unsigned int u = 0; u < 4; u++)
1986
dmats_old[t][u] = dmats[t][u];
1988
}// end loop over 'u'
1989
}// end loop over 't'
1991
// Update dmats using an inner product.
1992
if (combinations[r][s] == 0)
1994
for (unsigned int t = 0; t < 4; t++)
1996
for (unsigned int u = 0; u < 4; u++)
1998
for (unsigned int tu = 0; tu < 4; tu++)
2000
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2001
}// end loop over 'tu'
2002
}// end loop over 'u'
2003
}// end loop over 't'
2006
if (combinations[r][s] == 1)
2008
for (unsigned int t = 0; t < 4; t++)
2010
for (unsigned int u = 0; u < 4; u++)
2012
for (unsigned int tu = 0; tu < 4; tu++)
2014
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2015
}// end loop over 'tu'
2016
}// end loop over 'u'
2017
}// end loop over 't'
2020
if (combinations[r][s] == 2)
2022
for (unsigned int t = 0; t < 4; t++)
2024
for (unsigned int u = 0; u < 4; u++)
2026
for (unsigned int tu = 0; tu < 4; tu++)
2028
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2029
}// end loop over 'tu'
2030
}// end loop over 'u'
2031
}// end loop over 't'
2034
}// end loop over 's'
2035
for (unsigned int s = 0; s < 4; s++)
2037
for (unsigned int t = 0; t < 4; t++)
2039
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2040
}// end loop over 't'
2041
}// end loop over 's'
2042
}// end loop over 'r'
2044
// Transform derivatives back to physical element
2045
for (unsigned int r = 0; r < num_derivatives; r++)
2047
for (unsigned int s = 0; s < num_derivatives; s++)
2049
values[r] += transform[r][s]*derivatives[s];
2050
}// end loop over 's'
2051
}// end loop over 'r'
2053
// Delete pointer to array of derivatives on FIAT element
2054
delete [] derivatives;
2056
// Delete pointer to array of combinations of derivatives and transform
2057
for (unsigned int r = 0; r < num_derivatives; r++)
2059
delete [] combinations[r];
2060
}// end loop over 'r'
2061
delete [] combinations;
2062
for (unsigned int r = 0; r < num_derivatives; r++)
2064
delete [] transform[r];
2065
}// end loop over 'r'
2066
delete [] transform;
2072
// Array of basisvalues.
2073
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
2075
// Declare helper variables.
2076
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
2078
// Compute basisvalues.
2079
basisvalues[0] = 1.0;
2080
basisvalues[1] = tmp0;
2081
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
2082
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
2083
basisvalues[0] *= std::sqrt(0.75);
2084
basisvalues[3] *= std::sqrt(1.25);
2085
basisvalues[2] *= std::sqrt(2.5);
2086
basisvalues[1] *= std::sqrt(7.5);
2088
// Table(s) of coefficients.
2089
static const double coefficients0[4] = \
2090
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
2092
// Tables of derivatives of the polynomial base (transpose).
2093
static const double dmats0[4][4] = \
2094
{{0.0, 0.0, 0.0, 0.0},
2095
{6.3245553, 0.0, 0.0, 0.0},
2096
{0.0, 0.0, 0.0, 0.0},
2097
{0.0, 0.0, 0.0, 0.0}};
2099
static const double dmats1[4][4] = \
2100
{{0.0, 0.0, 0.0, 0.0},
2101
{3.1622777, 0.0, 0.0, 0.0},
2102
{5.4772256, 0.0, 0.0, 0.0},
2103
{0.0, 0.0, 0.0, 0.0}};
2105
static const double dmats2[4][4] = \
2106
{{0.0, 0.0, 0.0, 0.0},
2107
{3.1622777, 0.0, 0.0, 0.0},
2108
{1.8257419, 0.0, 0.0, 0.0},
2109
{5.1639778, 0.0, 0.0, 0.0}};
2111
// Compute reference derivatives.
2112
// Declare pointer to array of derivatives on FIAT element.
2113
double *derivatives = new double[num_derivatives];
2114
for (unsigned int r = 0; r < num_derivatives; r++)
2116
derivatives[r] = 0.0;
2117
}// end loop over 'r'
2119
// Declare derivative matrix (of polynomial basis).
2120
double dmats[4][4] = \
2121
{{1.0, 0.0, 0.0, 0.0},
2122
{0.0, 1.0, 0.0, 0.0},
2123
{0.0, 0.0, 1.0, 0.0},
2124
{0.0, 0.0, 0.0, 1.0}};
2126
// Declare (auxiliary) derivative matrix (of polynomial basis).
2127
double dmats_old[4][4] = \
2128
{{1.0, 0.0, 0.0, 0.0},
2129
{0.0, 1.0, 0.0, 0.0},
2130
{0.0, 0.0, 1.0, 0.0},
2131
{0.0, 0.0, 0.0, 1.0}};
2133
// Loop possible derivatives.
2134
for (unsigned int r = 0; r < num_derivatives; r++)
2136
// Resetting dmats values to compute next derivative.
2137
for (unsigned int t = 0; t < 4; t++)
2139
for (unsigned int u = 0; u < 4; u++)
2147
}// end loop over 'u'
2148
}// end loop over 't'
2150
// Looping derivative order to generate dmats.
2151
for (unsigned int s = 0; s < n; s++)
2153
// Updating dmats_old with new values and resetting dmats.
2154
for (unsigned int t = 0; t < 4; t++)
2156
for (unsigned int u = 0; u < 4; u++)
2158
dmats_old[t][u] = dmats[t][u];
2160
}// end loop over 'u'
2161
}// end loop over 't'
2163
// Update dmats using an inner product.
2164
if (combinations[r][s] == 0)
2166
for (unsigned int t = 0; t < 4; t++)
2168
for (unsigned int u = 0; u < 4; u++)
2170
for (unsigned int tu = 0; tu < 4; tu++)
2172
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2173
}// end loop over 'tu'
2174
}// end loop over 'u'
2175
}// end loop over 't'
2178
if (combinations[r][s] == 1)
2180
for (unsigned int t = 0; t < 4; t++)
2182
for (unsigned int u = 0; u < 4; u++)
2184
for (unsigned int tu = 0; tu < 4; tu++)
2186
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2187
}// end loop over 'tu'
2188
}// end loop over 'u'
2189
}// end loop over 't'
2192
if (combinations[r][s] == 2)
2194
for (unsigned int t = 0; t < 4; t++)
2196
for (unsigned int u = 0; u < 4; u++)
2198
for (unsigned int tu = 0; tu < 4; tu++)
2200
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2201
}// end loop over 'tu'
2202
}// end loop over 'u'
2203
}// end loop over 't'
2206
}// end loop over 's'
2207
for (unsigned int s = 0; s < 4; s++)
2209
for (unsigned int t = 0; t < 4; t++)
2211
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2212
}// end loop over 't'
2213
}// end loop over 's'
2214
}// end loop over 'r'
2216
// Transform derivatives back to physical element
2217
for (unsigned int r = 0; r < num_derivatives; r++)
2219
for (unsigned int s = 0; s < num_derivatives; s++)
2221
values[r] += transform[r][s]*derivatives[s];
2222
}// end loop over 's'
2223
}// end loop over 'r'
2225
// Delete pointer to array of derivatives on FIAT element
2226
delete [] derivatives;
2228
// Delete pointer to array of combinations of derivatives and transform
2229
for (unsigned int r = 0; r < num_derivatives; r++)
2231
delete [] combinations[r];
2232
}// end loop over 'r'
2233
delete [] combinations;
2234
for (unsigned int r = 0; r < num_derivatives; r++)
2236
delete [] transform[r];
2237
}// end loop over 'r'
2238
delete [] transform;
2244
// Array of basisvalues.
2245
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
2247
// Declare helper variables.
2248
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
2250
// Compute basisvalues.
2251
basisvalues[0] = 1.0;
2252
basisvalues[1] = tmp0;
2253
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
2254
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
2255
basisvalues[0] *= std::sqrt(0.75);
2256
basisvalues[3] *= std::sqrt(1.25);
2257
basisvalues[2] *= std::sqrt(2.5);
2258
basisvalues[1] *= std::sqrt(7.5);
2260
// Table(s) of coefficients.
2261
static const double coefficients0[4] = \
2262
{0.28867513, 0.0, 0.21081851, -0.074535599};
2264
// Tables of derivatives of the polynomial base (transpose).
2265
static const double dmats0[4][4] = \
2266
{{0.0, 0.0, 0.0, 0.0},
2267
{6.3245553, 0.0, 0.0, 0.0},
2268
{0.0, 0.0, 0.0, 0.0},
2269
{0.0, 0.0, 0.0, 0.0}};
2271
static const double dmats1[4][4] = \
2272
{{0.0, 0.0, 0.0, 0.0},
2273
{3.1622777, 0.0, 0.0, 0.0},
2274
{5.4772256, 0.0, 0.0, 0.0},
2275
{0.0, 0.0, 0.0, 0.0}};
2277
static const double dmats2[4][4] = \
2278
{{0.0, 0.0, 0.0, 0.0},
2279
{3.1622777, 0.0, 0.0, 0.0},
2280
{1.8257419, 0.0, 0.0, 0.0},
2281
{5.1639778, 0.0, 0.0, 0.0}};
2283
// Compute reference derivatives.
2284
// Declare pointer to array of derivatives on FIAT element.
2285
double *derivatives = new double[num_derivatives];
2286
for (unsigned int r = 0; r < num_derivatives; r++)
2288
derivatives[r] = 0.0;
2289
}// end loop over 'r'
2291
// Declare derivative matrix (of polynomial basis).
2292
double dmats[4][4] = \
2293
{{1.0, 0.0, 0.0, 0.0},
2294
{0.0, 1.0, 0.0, 0.0},
2295
{0.0, 0.0, 1.0, 0.0},
2296
{0.0, 0.0, 0.0, 1.0}};
2298
// Declare (auxiliary) derivative matrix (of polynomial basis).
2299
double dmats_old[4][4] = \
2300
{{1.0, 0.0, 0.0, 0.0},
2301
{0.0, 1.0, 0.0, 0.0},
2302
{0.0, 0.0, 1.0, 0.0},
2303
{0.0, 0.0, 0.0, 1.0}};
2305
// Loop possible derivatives.
2306
for (unsigned int r = 0; r < num_derivatives; r++)
2308
// Resetting dmats values to compute next derivative.
2309
for (unsigned int t = 0; t < 4; t++)
2311
for (unsigned int u = 0; u < 4; u++)
2319
}// end loop over 'u'
2320
}// end loop over 't'
2322
// Looping derivative order to generate dmats.
2323
for (unsigned int s = 0; s < n; s++)
2325
// Updating dmats_old with new values and resetting dmats.
2326
for (unsigned int t = 0; t < 4; t++)
2328
for (unsigned int u = 0; u < 4; u++)
2330
dmats_old[t][u] = dmats[t][u];
2332
}// end loop over 'u'
2333
}// end loop over 't'
2335
// Update dmats using an inner product.
2336
if (combinations[r][s] == 0)
2338
for (unsigned int t = 0; t < 4; t++)
2340
for (unsigned int u = 0; u < 4; u++)
2342
for (unsigned int tu = 0; tu < 4; tu++)
2344
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2345
}// end loop over 'tu'
2346
}// end loop over 'u'
2347
}// end loop over 't'
2350
if (combinations[r][s] == 1)
2352
for (unsigned int t = 0; t < 4; t++)
2354
for (unsigned int u = 0; u < 4; u++)
2356
for (unsigned int tu = 0; tu < 4; tu++)
2358
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2359
}// end loop over 'tu'
2360
}// end loop over 'u'
2361
}// end loop over 't'
2364
if (combinations[r][s] == 2)
2366
for (unsigned int t = 0; t < 4; t++)
2368
for (unsigned int u = 0; u < 4; u++)
2370
for (unsigned int tu = 0; tu < 4; tu++)
2372
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2373
}// end loop over 'tu'
2374
}// end loop over 'u'
2375
}// end loop over 't'
2378
}// end loop over 's'
2379
for (unsigned int s = 0; s < 4; s++)
2381
for (unsigned int t = 0; t < 4; t++)
2383
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2384
}// end loop over 't'
2385
}// end loop over 's'
2386
}// end loop over 'r'
2388
// Transform derivatives back to physical element
2389
for (unsigned int r = 0; r < num_derivatives; r++)
2391
for (unsigned int s = 0; s < num_derivatives; s++)
2393
values[r] += transform[r][s]*derivatives[s];
2394
}// end loop over 's'
2395
}// end loop over 'r'
2397
// Delete pointer to array of derivatives on FIAT element
2398
delete [] derivatives;
2400
// Delete pointer to array of combinations of derivatives and transform
2401
for (unsigned int r = 0; r < num_derivatives; r++)
2403
delete [] combinations[r];
2404
}// end loop over 'r'
2405
delete [] combinations;
2406
for (unsigned int r = 0; r < num_derivatives; r++)
2408
delete [] transform[r];
2409
}// end loop over 'r'
2410
delete [] transform;
2416
// Array of basisvalues.
2417
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
2419
// Declare helper variables.
2420
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
2422
// Compute basisvalues.
2423
basisvalues[0] = 1.0;
2424
basisvalues[1] = tmp0;
2425
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
2426
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
2427
basisvalues[0] *= std::sqrt(0.75);
2428
basisvalues[3] *= std::sqrt(1.25);
2429
basisvalues[2] *= std::sqrt(2.5);
2430
basisvalues[1] *= std::sqrt(7.5);
2432
// Table(s) of coefficients.
2433
static const double coefficients0[4] = \
2434
{0.28867513, 0.0, 0.0, 0.2236068};
2436
// Tables of derivatives of the polynomial base (transpose).
2437
static const double dmats0[4][4] = \
2438
{{0.0, 0.0, 0.0, 0.0},
2439
{6.3245553, 0.0, 0.0, 0.0},
2440
{0.0, 0.0, 0.0, 0.0},
2441
{0.0, 0.0, 0.0, 0.0}};
2443
static const double dmats1[4][4] = \
2444
{{0.0, 0.0, 0.0, 0.0},
2445
{3.1622777, 0.0, 0.0, 0.0},
2446
{5.4772256, 0.0, 0.0, 0.0},
2447
{0.0, 0.0, 0.0, 0.0}};
2449
static const double dmats2[4][4] = \
2450
{{0.0, 0.0, 0.0, 0.0},
2451
{3.1622777, 0.0, 0.0, 0.0},
2452
{1.8257419, 0.0, 0.0, 0.0},
2453
{5.1639778, 0.0, 0.0, 0.0}};
2455
// Compute reference derivatives.
2456
// Declare pointer to array of derivatives on FIAT element.
2457
double *derivatives = new double[num_derivatives];
2458
for (unsigned int r = 0; r < num_derivatives; r++)
2460
derivatives[r] = 0.0;
2461
}// end loop over 'r'
2463
// Declare derivative matrix (of polynomial basis).
2464
double dmats[4][4] = \
2465
{{1.0, 0.0, 0.0, 0.0},
2466
{0.0, 1.0, 0.0, 0.0},
2467
{0.0, 0.0, 1.0, 0.0},
2468
{0.0, 0.0, 0.0, 1.0}};
2470
// Declare (auxiliary) derivative matrix (of polynomial basis).
2471
double dmats_old[4][4] = \
2472
{{1.0, 0.0, 0.0, 0.0},
2473
{0.0, 1.0, 0.0, 0.0},
2474
{0.0, 0.0, 1.0, 0.0},
2475
{0.0, 0.0, 0.0, 1.0}};
2477
// Loop possible derivatives.
2478
for (unsigned int r = 0; r < num_derivatives; r++)
2480
// Resetting dmats values to compute next derivative.
2481
for (unsigned int t = 0; t < 4; t++)
2483
for (unsigned int u = 0; u < 4; u++)
2491
}// end loop over 'u'
2492
}// end loop over 't'
2494
// Looping derivative order to generate dmats.
2495
for (unsigned int s = 0; s < n; s++)
2497
// Updating dmats_old with new values and resetting dmats.
2498
for (unsigned int t = 0; t < 4; t++)
2500
for (unsigned int u = 0; u < 4; u++)
2502
dmats_old[t][u] = dmats[t][u];
2504
}// end loop over 'u'
2505
}// end loop over 't'
2507
// Update dmats using an inner product.
2508
if (combinations[r][s] == 0)
2510
for (unsigned int t = 0; t < 4; t++)
2512
for (unsigned int u = 0; u < 4; u++)
2514
for (unsigned int tu = 0; tu < 4; tu++)
2516
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2517
}// end loop over 'tu'
2518
}// end loop over 'u'
2519
}// end loop over 't'
2522
if (combinations[r][s] == 1)
2524
for (unsigned int t = 0; t < 4; t++)
2526
for (unsigned int u = 0; u < 4; u++)
2528
for (unsigned int tu = 0; tu < 4; tu++)
2530
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2531
}// end loop over 'tu'
2532
}// end loop over 'u'
2533
}// end loop over 't'
2536
if (combinations[r][s] == 2)
2538
for (unsigned int t = 0; t < 4; t++)
2540
for (unsigned int u = 0; u < 4; u++)
2542
for (unsigned int tu = 0; tu < 4; tu++)
2544
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2545
}// end loop over 'tu'
2546
}// end loop over 'u'
2547
}// end loop over 't'
2550
}// end loop over 's'
2551
for (unsigned int s = 0; s < 4; s++)
2553
for (unsigned int t = 0; t < 4; t++)
2555
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2556
}// end loop over 't'
2557
}// end loop over 's'
2558
}// end loop over 'r'
2560
// Transform derivatives back to physical element
2561
for (unsigned int r = 0; r < num_derivatives; r++)
2563
for (unsigned int s = 0; s < num_derivatives; s++)
2565
values[r] += transform[r][s]*derivatives[s];
2566
}// end loop over 's'
2567
}// end loop over 'r'
2569
// Delete pointer to array of derivatives on FIAT element
2570
delete [] derivatives;
2572
// Delete pointer to array of combinations of derivatives and transform
2573
for (unsigned int r = 0; r < num_derivatives; r++)
2575
delete [] combinations[r];
2576
}// end loop over 'r'
2577
delete [] combinations;
2578
for (unsigned int r = 0; r < num_derivatives; r++)
2580
delete [] transform[r];
2581
}// end loop over 'r'
2582
delete [] transform;
2588
// Array of basisvalues.
2589
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
2591
// Declare helper variables.
2592
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
2594
// Compute basisvalues.
2595
basisvalues[0] = 1.0;
2596
basisvalues[1] = tmp0;
2597
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
2598
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
2599
basisvalues[0] *= std::sqrt(0.75);
2600
basisvalues[3] *= std::sqrt(1.25);
2601
basisvalues[2] *= std::sqrt(2.5);
2602
basisvalues[1] *= std::sqrt(7.5);
2604
// Table(s) of coefficients.
2605
static const double coefficients0[4] = \
2606
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
2608
// Tables of derivatives of the polynomial base (transpose).
2609
static const double dmats0[4][4] = \
2610
{{0.0, 0.0, 0.0, 0.0},
2611
{6.3245553, 0.0, 0.0, 0.0},
2612
{0.0, 0.0, 0.0, 0.0},
2613
{0.0, 0.0, 0.0, 0.0}};
2615
static const double dmats1[4][4] = \
2616
{{0.0, 0.0, 0.0, 0.0},
2617
{3.1622777, 0.0, 0.0, 0.0},
2618
{5.4772256, 0.0, 0.0, 0.0},
2619
{0.0, 0.0, 0.0, 0.0}};
2621
static const double dmats2[4][4] = \
2622
{{0.0, 0.0, 0.0, 0.0},
2623
{3.1622777, 0.0, 0.0, 0.0},
2624
{1.8257419, 0.0, 0.0, 0.0},
2625
{5.1639778, 0.0, 0.0, 0.0}};
2627
// Compute reference derivatives.
2628
// Declare pointer to array of derivatives on FIAT element.
2629
double *derivatives = new double[num_derivatives];
2630
for (unsigned int r = 0; r < num_derivatives; r++)
2632
derivatives[r] = 0.0;
2633
}// end loop over 'r'
2635
// Declare derivative matrix (of polynomial basis).
2636
double dmats[4][4] = \
2637
{{1.0, 0.0, 0.0, 0.0},
2638
{0.0, 1.0, 0.0, 0.0},
2639
{0.0, 0.0, 1.0, 0.0},
2640
{0.0, 0.0, 0.0, 1.0}};
2642
// Declare (auxiliary) derivative matrix (of polynomial basis).
2643
double dmats_old[4][4] = \
2644
{{1.0, 0.0, 0.0, 0.0},
2645
{0.0, 1.0, 0.0, 0.0},
2646
{0.0, 0.0, 1.0, 0.0},
2647
{0.0, 0.0, 0.0, 1.0}};
2649
// Loop possible derivatives.
2650
for (unsigned int r = 0; r < num_derivatives; r++)
2652
// Resetting dmats values to compute next derivative.
2653
for (unsigned int t = 0; t < 4; t++)
2655
for (unsigned int u = 0; u < 4; u++)
2663
}// end loop over 'u'
2664
}// end loop over 't'
2666
// Looping derivative order to generate dmats.
2667
for (unsigned int s = 0; s < n; s++)
2669
// Updating dmats_old with new values and resetting dmats.
2670
for (unsigned int t = 0; t < 4; t++)
2672
for (unsigned int u = 0; u < 4; u++)
2674
dmats_old[t][u] = dmats[t][u];
2676
}// end loop over 'u'
2677
}// end loop over 't'
2679
// Update dmats using an inner product.
2680
if (combinations[r][s] == 0)
2682
for (unsigned int t = 0; t < 4; t++)
2684
for (unsigned int u = 0; u < 4; u++)
2686
for (unsigned int tu = 0; tu < 4; tu++)
2688
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2689
}// end loop over 'tu'
2690
}// end loop over 'u'
2691
}// end loop over 't'
2694
if (combinations[r][s] == 1)
2696
for (unsigned int t = 0; t < 4; t++)
2698
for (unsigned int u = 0; u < 4; u++)
2700
for (unsigned int tu = 0; tu < 4; tu++)
2702
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2703
}// end loop over 'tu'
2704
}// end loop over 'u'
2705
}// end loop over 't'
2708
if (combinations[r][s] == 2)
2710
for (unsigned int t = 0; t < 4; t++)
2712
for (unsigned int u = 0; u < 4; u++)
2714
for (unsigned int tu = 0; tu < 4; tu++)
2716
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2717
}// end loop over 'tu'
2718
}// end loop over 'u'
2719
}// end loop over 't'
2722
}// end loop over 's'
2723
for (unsigned int s = 0; s < 4; s++)
2725
for (unsigned int t = 0; t < 4; t++)
2727
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2728
}// end loop over 't'
2729
}// end loop over 's'
2730
}// end loop over 'r'
2732
// Transform derivatives back to physical element
2733
for (unsigned int r = 0; r < num_derivatives; r++)
2735
for (unsigned int s = 0; s < num_derivatives; s++)
2737
values[num_derivatives + r] += transform[r][s]*derivatives[s];
2738
}// end loop over 's'
2739
}// end loop over 'r'
2741
// Delete pointer to array of derivatives on FIAT element
2742
delete [] derivatives;
2744
// Delete pointer to array of combinations of derivatives and transform
2745
for (unsigned int r = 0; r < num_derivatives; r++)
2747
delete [] combinations[r];
2748
}// end loop over 'r'
2749
delete [] combinations;
2750
for (unsigned int r = 0; r < num_derivatives; r++)
2752
delete [] transform[r];
2753
}// end loop over 'r'
2754
delete [] transform;
2760
// Array of basisvalues.
2761
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
2763
// Declare helper variables.
2764
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
2766
// Compute basisvalues.
2767
basisvalues[0] = 1.0;
2768
basisvalues[1] = tmp0;
2769
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
2770
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
2771
basisvalues[0] *= std::sqrt(0.75);
2772
basisvalues[3] *= std::sqrt(1.25);
2773
basisvalues[2] *= std::sqrt(2.5);
2774
basisvalues[1] *= std::sqrt(7.5);
2776
// Table(s) of coefficients.
2777
static const double coefficients0[4] = \
2778
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
2780
// Tables of derivatives of the polynomial base (transpose).
2781
static const double dmats0[4][4] = \
2782
{{0.0, 0.0, 0.0, 0.0},
2783
{6.3245553, 0.0, 0.0, 0.0},
2784
{0.0, 0.0, 0.0, 0.0},
2785
{0.0, 0.0, 0.0, 0.0}};
2787
static const double dmats1[4][4] = \
2788
{{0.0, 0.0, 0.0, 0.0},
2789
{3.1622777, 0.0, 0.0, 0.0},
2790
{5.4772256, 0.0, 0.0, 0.0},
2791
{0.0, 0.0, 0.0, 0.0}};
2793
static const double dmats2[4][4] = \
2794
{{0.0, 0.0, 0.0, 0.0},
2795
{3.1622777, 0.0, 0.0, 0.0},
2796
{1.8257419, 0.0, 0.0, 0.0},
2797
{5.1639778, 0.0, 0.0, 0.0}};
2799
// Compute reference derivatives.
2800
// Declare pointer to array of derivatives on FIAT element.
2801
double *derivatives = new double[num_derivatives];
2802
for (unsigned int r = 0; r < num_derivatives; r++)
2804
derivatives[r] = 0.0;
2805
}// end loop over 'r'
2807
// Declare derivative matrix (of polynomial basis).
2808
double dmats[4][4] = \
2809
{{1.0, 0.0, 0.0, 0.0},
2810
{0.0, 1.0, 0.0, 0.0},
2811
{0.0, 0.0, 1.0, 0.0},
2812
{0.0, 0.0, 0.0, 1.0}};
2814
// Declare (auxiliary) derivative matrix (of polynomial basis).
2815
double dmats_old[4][4] = \
2816
{{1.0, 0.0, 0.0, 0.0},
2817
{0.0, 1.0, 0.0, 0.0},
2818
{0.0, 0.0, 1.0, 0.0},
2819
{0.0, 0.0, 0.0, 1.0}};
2821
// Loop possible derivatives.
2822
for (unsigned int r = 0; r < num_derivatives; r++)
2824
// Resetting dmats values to compute next derivative.
2825
for (unsigned int t = 0; t < 4; t++)
2827
for (unsigned int u = 0; u < 4; u++)
2835
}// end loop over 'u'
2836
}// end loop over 't'
2838
// Looping derivative order to generate dmats.
2839
for (unsigned int s = 0; s < n; s++)
2841
// Updating dmats_old with new values and resetting dmats.
2842
for (unsigned int t = 0; t < 4; t++)
2844
for (unsigned int u = 0; u < 4; u++)
2846
dmats_old[t][u] = dmats[t][u];
2848
}// end loop over 'u'
2849
}// end loop over 't'
2851
// Update dmats using an inner product.
2852
if (combinations[r][s] == 0)
2854
for (unsigned int t = 0; t < 4; t++)
2856
for (unsigned int u = 0; u < 4; u++)
2858
for (unsigned int tu = 0; tu < 4; tu++)
2860
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2861
}// end loop over 'tu'
2862
}// end loop over 'u'
2863
}// end loop over 't'
2866
if (combinations[r][s] == 1)
2868
for (unsigned int t = 0; t < 4; t++)
2870
for (unsigned int u = 0; u < 4; u++)
2872
for (unsigned int tu = 0; tu < 4; tu++)
2874
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2875
}// end loop over 'tu'
2876
}// end loop over 'u'
2877
}// end loop over 't'
2880
if (combinations[r][s] == 2)
2882
for (unsigned int t = 0; t < 4; t++)
2884
for (unsigned int u = 0; u < 4; u++)
2886
for (unsigned int tu = 0; tu < 4; tu++)
2888
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2889
}// end loop over 'tu'
2890
}// end loop over 'u'
2891
}// end loop over 't'
2894
}// end loop over 's'
2895
for (unsigned int s = 0; s < 4; s++)
2897
for (unsigned int t = 0; t < 4; t++)
2899
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2900
}// end loop over 't'
2901
}// end loop over 's'
2902
}// end loop over 'r'
2904
// Transform derivatives back to physical element
2905
for (unsigned int r = 0; r < num_derivatives; r++)
2907
for (unsigned int s = 0; s < num_derivatives; s++)
2909
values[num_derivatives + r] += transform[r][s]*derivatives[s];
2910
}// end loop over 's'
2911
}// end loop over 'r'
2913
// Delete pointer to array of derivatives on FIAT element
2914
delete [] derivatives;
2916
// Delete pointer to array of combinations of derivatives and transform
2917
for (unsigned int r = 0; r < num_derivatives; r++)
2919
delete [] combinations[r];
2920
}// end loop over 'r'
2921
delete [] combinations;
2922
for (unsigned int r = 0; r < num_derivatives; r++)
2924
delete [] transform[r];
2925
}// end loop over 'r'
2926
delete [] transform;
2932
// Array of basisvalues.
2933
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
2935
// Declare helper variables.
2936
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
2938
// Compute basisvalues.
2939
basisvalues[0] = 1.0;
2940
basisvalues[1] = tmp0;
2941
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
2942
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
2943
basisvalues[0] *= std::sqrt(0.75);
2944
basisvalues[3] *= std::sqrt(1.25);
2945
basisvalues[2] *= std::sqrt(2.5);
2946
basisvalues[1] *= std::sqrt(7.5);
2948
// Table(s) of coefficients.
2949
static const double coefficients0[4] = \
2950
{0.28867513, 0.0, 0.21081851, -0.074535599};
2952
// Tables of derivatives of the polynomial base (transpose).
2953
static const double dmats0[4][4] = \
2954
{{0.0, 0.0, 0.0, 0.0},
2955
{6.3245553, 0.0, 0.0, 0.0},
2956
{0.0, 0.0, 0.0, 0.0},
2957
{0.0, 0.0, 0.0, 0.0}};
2959
static const double dmats1[4][4] = \
2960
{{0.0, 0.0, 0.0, 0.0},
2961
{3.1622777, 0.0, 0.0, 0.0},
2962
{5.4772256, 0.0, 0.0, 0.0},
2963
{0.0, 0.0, 0.0, 0.0}};
2965
static const double dmats2[4][4] = \
2966
{{0.0, 0.0, 0.0, 0.0},
2967
{3.1622777, 0.0, 0.0, 0.0},
2968
{1.8257419, 0.0, 0.0, 0.0},
2969
{5.1639778, 0.0, 0.0, 0.0}};
2971
// Compute reference derivatives.
2972
// Declare pointer to array of derivatives on FIAT element.
2973
double *derivatives = new double[num_derivatives];
2974
for (unsigned int r = 0; r < num_derivatives; r++)
2976
derivatives[r] = 0.0;
2977
}// end loop over 'r'
2979
// Declare derivative matrix (of polynomial basis).
2980
double dmats[4][4] = \
2981
{{1.0, 0.0, 0.0, 0.0},
2982
{0.0, 1.0, 0.0, 0.0},
2983
{0.0, 0.0, 1.0, 0.0},
2984
{0.0, 0.0, 0.0, 1.0}};
2986
// Declare (auxiliary) derivative matrix (of polynomial basis).
2987
double dmats_old[4][4] = \
2988
{{1.0, 0.0, 0.0, 0.0},
2989
{0.0, 1.0, 0.0, 0.0},
2990
{0.0, 0.0, 1.0, 0.0},
2991
{0.0, 0.0, 0.0, 1.0}};
2993
// Loop possible derivatives.
2994
for (unsigned int r = 0; r < num_derivatives; r++)
2996
// Resetting dmats values to compute next derivative.
2997
for (unsigned int t = 0; t < 4; t++)
2999
for (unsigned int u = 0; u < 4; u++)
3007
}// end loop over 'u'
3008
}// end loop over 't'
3010
// Looping derivative order to generate dmats.
3011
for (unsigned int s = 0; s < n; s++)
3013
// Updating dmats_old with new values and resetting dmats.
3014
for (unsigned int t = 0; t < 4; t++)
3016
for (unsigned int u = 0; u < 4; u++)
3018
dmats_old[t][u] = dmats[t][u];
3020
}// end loop over 'u'
3021
}// end loop over 't'
3023
// Update dmats using an inner product.
3024
if (combinations[r][s] == 0)
3026
for (unsigned int t = 0; t < 4; t++)
3028
for (unsigned int u = 0; u < 4; u++)
3030
for (unsigned int tu = 0; tu < 4; tu++)
3032
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3033
}// end loop over 'tu'
3034
}// end loop over 'u'
3035
}// end loop over 't'
3038
if (combinations[r][s] == 1)
3040
for (unsigned int t = 0; t < 4; t++)
3042
for (unsigned int u = 0; u < 4; u++)
3044
for (unsigned int tu = 0; tu < 4; tu++)
3046
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3047
}// end loop over 'tu'
3048
}// end loop over 'u'
3049
}// end loop over 't'
3052
if (combinations[r][s] == 2)
3054
for (unsigned int t = 0; t < 4; t++)
3056
for (unsigned int u = 0; u < 4; u++)
3058
for (unsigned int tu = 0; tu < 4; tu++)
3060
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3061
}// end loop over 'tu'
3062
}// end loop over 'u'
3063
}// end loop over 't'
3066
}// end loop over 's'
3067
for (unsigned int s = 0; s < 4; s++)
3069
for (unsigned int t = 0; t < 4; t++)
3071
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3072
}// end loop over 't'
3073
}// end loop over 's'
3074
}// end loop over 'r'
3076
// Transform derivatives back to physical element
3077
for (unsigned int r = 0; r < num_derivatives; r++)
3079
for (unsigned int s = 0; s < num_derivatives; s++)
3081
values[num_derivatives + r] += transform[r][s]*derivatives[s];
3082
}// end loop over 's'
3083
}// end loop over 'r'
3085
// Delete pointer to array of derivatives on FIAT element
3086
delete [] derivatives;
3088
// Delete pointer to array of combinations of derivatives and transform
3089
for (unsigned int r = 0; r < num_derivatives; r++)
3091
delete [] combinations[r];
3092
}// end loop over 'r'
3093
delete [] combinations;
3094
for (unsigned int r = 0; r < num_derivatives; r++)
3096
delete [] transform[r];
3097
}// end loop over 'r'
3098
delete [] transform;
3104
// Array of basisvalues.
3105
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
3107
// Declare helper variables.
3108
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
3110
// Compute basisvalues.
3111
basisvalues[0] = 1.0;
3112
basisvalues[1] = tmp0;
3113
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
3114
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
3115
basisvalues[0] *= std::sqrt(0.75);
3116
basisvalues[3] *= std::sqrt(1.25);
3117
basisvalues[2] *= std::sqrt(2.5);
3118
basisvalues[1] *= std::sqrt(7.5);
3120
// Table(s) of coefficients.
3121
static const double coefficients0[4] = \
3122
{0.28867513, 0.0, 0.0, 0.2236068};
3124
// Tables of derivatives of the polynomial base (transpose).
3125
static const double dmats0[4][4] = \
3126
{{0.0, 0.0, 0.0, 0.0},
3127
{6.3245553, 0.0, 0.0, 0.0},
3128
{0.0, 0.0, 0.0, 0.0},
3129
{0.0, 0.0, 0.0, 0.0}};
3131
static const double dmats1[4][4] = \
3132
{{0.0, 0.0, 0.0, 0.0},
3133
{3.1622777, 0.0, 0.0, 0.0},
3134
{5.4772256, 0.0, 0.0, 0.0},
3135
{0.0, 0.0, 0.0, 0.0}};
3137
static const double dmats2[4][4] = \
3138
{{0.0, 0.0, 0.0, 0.0},
3139
{3.1622777, 0.0, 0.0, 0.0},
3140
{1.8257419, 0.0, 0.0, 0.0},
3141
{5.1639778, 0.0, 0.0, 0.0}};
3143
// Compute reference derivatives.
3144
// Declare pointer to array of derivatives on FIAT element.
3145
double *derivatives = new double[num_derivatives];
3146
for (unsigned int r = 0; r < num_derivatives; r++)
3148
derivatives[r] = 0.0;
3149
}// end loop over 'r'
3151
// Declare derivative matrix (of polynomial basis).
3152
double dmats[4][4] = \
3153
{{1.0, 0.0, 0.0, 0.0},
3154
{0.0, 1.0, 0.0, 0.0},
3155
{0.0, 0.0, 1.0, 0.0},
3156
{0.0, 0.0, 0.0, 1.0}};
3158
// Declare (auxiliary) derivative matrix (of polynomial basis).
3159
double dmats_old[4][4] = \
3160
{{1.0, 0.0, 0.0, 0.0},
3161
{0.0, 1.0, 0.0, 0.0},
3162
{0.0, 0.0, 1.0, 0.0},
3163
{0.0, 0.0, 0.0, 1.0}};
3165
// Loop possible derivatives.
3166
for (unsigned int r = 0; r < num_derivatives; r++)
3168
// Resetting dmats values to compute next derivative.
3169
for (unsigned int t = 0; t < 4; t++)
3171
for (unsigned int u = 0; u < 4; u++)
3179
}// end loop over 'u'
3180
}// end loop over 't'
3182
// Looping derivative order to generate dmats.
3183
for (unsigned int s = 0; s < n; s++)
3185
// Updating dmats_old with new values and resetting dmats.
3186
for (unsigned int t = 0; t < 4; t++)
3188
for (unsigned int u = 0; u < 4; u++)
3190
dmats_old[t][u] = dmats[t][u];
3192
}// end loop over 'u'
3193
}// end loop over 't'
3195
// Update dmats using an inner product.
3196
if (combinations[r][s] == 0)
3198
for (unsigned int t = 0; t < 4; t++)
3200
for (unsigned int u = 0; u < 4; u++)
3202
for (unsigned int tu = 0; tu < 4; tu++)
3204
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3205
}// end loop over 'tu'
3206
}// end loop over 'u'
3207
}// end loop over 't'
3210
if (combinations[r][s] == 1)
3212
for (unsigned int t = 0; t < 4; t++)
3214
for (unsigned int u = 0; u < 4; u++)
3216
for (unsigned int tu = 0; tu < 4; tu++)
3218
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3219
}// end loop over 'tu'
3220
}// end loop over 'u'
3221
}// end loop over 't'
3224
if (combinations[r][s] == 2)
3226
for (unsigned int t = 0; t < 4; t++)
3228
for (unsigned int u = 0; u < 4; u++)
3230
for (unsigned int tu = 0; tu < 4; tu++)
3232
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3233
}// end loop over 'tu'
3234
}// end loop over 'u'
3235
}// end loop over 't'
3238
}// end loop over 's'
3239
for (unsigned int s = 0; s < 4; s++)
3241
for (unsigned int t = 0; t < 4; t++)
3243
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3244
}// end loop over 't'
3245
}// end loop over 's'
3246
}// end loop over 'r'
3248
// Transform derivatives back to physical element
3249
for (unsigned int r = 0; r < num_derivatives; r++)
3251
for (unsigned int s = 0; s < num_derivatives; s++)
3253
values[num_derivatives + r] += transform[r][s]*derivatives[s];
3254
}// end loop over 's'
3255
}// end loop over 'r'
3257
// Delete pointer to array of derivatives on FIAT element
3258
delete [] derivatives;
3260
// Delete pointer to array of combinations of derivatives and transform
3261
for (unsigned int r = 0; r < num_derivatives; r++)
3263
delete [] combinations[r];
3264
}// end loop over 'r'
3265
delete [] combinations;
3266
for (unsigned int r = 0; r < num_derivatives; r++)
3268
delete [] transform[r];
3269
}// end loop over 'r'
3270
delete [] transform;
3276
// Array of basisvalues.
3277
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
3279
// Declare helper variables.
3280
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
3282
// Compute basisvalues.
3283
basisvalues[0] = 1.0;
3284
basisvalues[1] = tmp0;
3285
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
3286
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
3287
basisvalues[0] *= std::sqrt(0.75);
3288
basisvalues[3] *= std::sqrt(1.25);
3289
basisvalues[2] *= std::sqrt(2.5);
3290
basisvalues[1] *= std::sqrt(7.5);
3292
// Table(s) of coefficients.
3293
static const double coefficients0[4] = \
3294
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
3296
// Tables of derivatives of the polynomial base (transpose).
3297
static const double dmats0[4][4] = \
3298
{{0.0, 0.0, 0.0, 0.0},
3299
{6.3245553, 0.0, 0.0, 0.0},
3300
{0.0, 0.0, 0.0, 0.0},
3301
{0.0, 0.0, 0.0, 0.0}};
3303
static const double dmats1[4][4] = \
3304
{{0.0, 0.0, 0.0, 0.0},
3305
{3.1622777, 0.0, 0.0, 0.0},
3306
{5.4772256, 0.0, 0.0, 0.0},
3307
{0.0, 0.0, 0.0, 0.0}};
3309
static const double dmats2[4][4] = \
3310
{{0.0, 0.0, 0.0, 0.0},
3311
{3.1622777, 0.0, 0.0, 0.0},
3312
{1.8257419, 0.0, 0.0, 0.0},
3313
{5.1639778, 0.0, 0.0, 0.0}};
3315
// Compute reference derivatives.
3316
// Declare pointer to array of derivatives on FIAT element.
3317
double *derivatives = new double[num_derivatives];
3318
for (unsigned int r = 0; r < num_derivatives; r++)
3320
derivatives[r] = 0.0;
3321
}// end loop over 'r'
3323
// Declare derivative matrix (of polynomial basis).
3324
double dmats[4][4] = \
3325
{{1.0, 0.0, 0.0, 0.0},
3326
{0.0, 1.0, 0.0, 0.0},
3327
{0.0, 0.0, 1.0, 0.0},
3328
{0.0, 0.0, 0.0, 1.0}};
3330
// Declare (auxiliary) derivative matrix (of polynomial basis).
3331
double dmats_old[4][4] = \
3332
{{1.0, 0.0, 0.0, 0.0},
3333
{0.0, 1.0, 0.0, 0.0},
3334
{0.0, 0.0, 1.0, 0.0},
3335
{0.0, 0.0, 0.0, 1.0}};
3337
// Loop possible derivatives.
3338
for (unsigned int r = 0; r < num_derivatives; r++)
3340
// Resetting dmats values to compute next derivative.
3341
for (unsigned int t = 0; t < 4; t++)
3343
for (unsigned int u = 0; u < 4; u++)
3351
}// end loop over 'u'
3352
}// end loop over 't'
3354
// Looping derivative order to generate dmats.
3355
for (unsigned int s = 0; s < n; s++)
3357
// Updating dmats_old with new values and resetting dmats.
3358
for (unsigned int t = 0; t < 4; t++)
3360
for (unsigned int u = 0; u < 4; u++)
3362
dmats_old[t][u] = dmats[t][u];
3364
}// end loop over 'u'
3365
}// end loop over 't'
3367
// Update dmats using an inner product.
3368
if (combinations[r][s] == 0)
3370
for (unsigned int t = 0; t < 4; t++)
3372
for (unsigned int u = 0; u < 4; u++)
3374
for (unsigned int tu = 0; tu < 4; tu++)
3376
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3377
}// end loop over 'tu'
3378
}// end loop over 'u'
3379
}// end loop over 't'
3382
if (combinations[r][s] == 1)
3384
for (unsigned int t = 0; t < 4; t++)
3386
for (unsigned int u = 0; u < 4; u++)
3388
for (unsigned int tu = 0; tu < 4; tu++)
3390
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3391
}// end loop over 'tu'
3392
}// end loop over 'u'
3393
}// end loop over 't'
3396
if (combinations[r][s] == 2)
3398
for (unsigned int t = 0; t < 4; t++)
3400
for (unsigned int u = 0; u < 4; u++)
3402
for (unsigned int tu = 0; tu < 4; tu++)
3404
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3405
}// end loop over 'tu'
3406
}// end loop over 'u'
3407
}// end loop over 't'
3410
}// end loop over 's'
3411
for (unsigned int s = 0; s < 4; s++)
3413
for (unsigned int t = 0; t < 4; t++)
3415
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3416
}// end loop over 't'
3417
}// end loop over 's'
3418
}// end loop over 'r'
3420
// Transform derivatives back to physical element
3421
for (unsigned int r = 0; r < num_derivatives; r++)
3423
for (unsigned int s = 0; s < num_derivatives; s++)
3425
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
3426
}// end loop over 's'
3427
}// end loop over 'r'
3429
// Delete pointer to array of derivatives on FIAT element
3430
delete [] derivatives;
3432
// Delete pointer to array of combinations of derivatives and transform
3433
for (unsigned int r = 0; r < num_derivatives; r++)
3435
delete [] combinations[r];
3436
}// end loop over 'r'
3437
delete [] combinations;
3438
for (unsigned int r = 0; r < num_derivatives; r++)
3440
delete [] transform[r];
3441
}// end loop over 'r'
3442
delete [] transform;
3448
// Array of basisvalues.
3449
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
3451
// Declare helper variables.
3452
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
3454
// Compute basisvalues.
3455
basisvalues[0] = 1.0;
3456
basisvalues[1] = tmp0;
3457
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
3458
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
3459
basisvalues[0] *= std::sqrt(0.75);
3460
basisvalues[3] *= std::sqrt(1.25);
3461
basisvalues[2] *= std::sqrt(2.5);
3462
basisvalues[1] *= std::sqrt(7.5);
3464
// Table(s) of coefficients.
3465
static const double coefficients0[4] = \
3466
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
3468
// Tables of derivatives of the polynomial base (transpose).
3469
static const double dmats0[4][4] = \
3470
{{0.0, 0.0, 0.0, 0.0},
3471
{6.3245553, 0.0, 0.0, 0.0},
3472
{0.0, 0.0, 0.0, 0.0},
3473
{0.0, 0.0, 0.0, 0.0}};
3475
static const double dmats1[4][4] = \
3476
{{0.0, 0.0, 0.0, 0.0},
3477
{3.1622777, 0.0, 0.0, 0.0},
3478
{5.4772256, 0.0, 0.0, 0.0},
3479
{0.0, 0.0, 0.0, 0.0}};
3481
static const double dmats2[4][4] = \
3482
{{0.0, 0.0, 0.0, 0.0},
3483
{3.1622777, 0.0, 0.0, 0.0},
3484
{1.8257419, 0.0, 0.0, 0.0},
3485
{5.1639778, 0.0, 0.0, 0.0}};
3487
// Compute reference derivatives.
3488
// Declare pointer to array of derivatives on FIAT element.
3489
double *derivatives = new double[num_derivatives];
3490
for (unsigned int r = 0; r < num_derivatives; r++)
3492
derivatives[r] = 0.0;
3493
}// end loop over 'r'
3495
// Declare derivative matrix (of polynomial basis).
3496
double dmats[4][4] = \
3497
{{1.0, 0.0, 0.0, 0.0},
3498
{0.0, 1.0, 0.0, 0.0},
3499
{0.0, 0.0, 1.0, 0.0},
3500
{0.0, 0.0, 0.0, 1.0}};
3502
// Declare (auxiliary) derivative matrix (of polynomial basis).
3503
double dmats_old[4][4] = \
3504
{{1.0, 0.0, 0.0, 0.0},
3505
{0.0, 1.0, 0.0, 0.0},
3506
{0.0, 0.0, 1.0, 0.0},
3507
{0.0, 0.0, 0.0, 1.0}};
3509
// Loop possible derivatives.
3510
for (unsigned int r = 0; r < num_derivatives; r++)
3512
// Resetting dmats values to compute next derivative.
3513
for (unsigned int t = 0; t < 4; t++)
3515
for (unsigned int u = 0; u < 4; u++)
3523
}// end loop over 'u'
3524
}// end loop over 't'
3526
// Looping derivative order to generate dmats.
3527
for (unsigned int s = 0; s < n; s++)
3529
// Updating dmats_old with new values and resetting dmats.
3530
for (unsigned int t = 0; t < 4; t++)
3532
for (unsigned int u = 0; u < 4; u++)
3534
dmats_old[t][u] = dmats[t][u];
3536
}// end loop over 'u'
3537
}// end loop over 't'
3539
// Update dmats using an inner product.
3540
if (combinations[r][s] == 0)
3542
for (unsigned int t = 0; t < 4; t++)
3544
for (unsigned int u = 0; u < 4; u++)
3546
for (unsigned int tu = 0; tu < 4; tu++)
3548
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3549
}// end loop over 'tu'
3550
}// end loop over 'u'
3551
}// end loop over 't'
3554
if (combinations[r][s] == 1)
3556
for (unsigned int t = 0; t < 4; t++)
3558
for (unsigned int u = 0; u < 4; u++)
3560
for (unsigned int tu = 0; tu < 4; tu++)
3562
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3563
}// end loop over 'tu'
3564
}// end loop over 'u'
3565
}// end loop over 't'
3568
if (combinations[r][s] == 2)
3570
for (unsigned int t = 0; t < 4; t++)
3572
for (unsigned int u = 0; u < 4; u++)
3574
for (unsigned int tu = 0; tu < 4; tu++)
3576
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3577
}// end loop over 'tu'
3578
}// end loop over 'u'
3579
}// end loop over 't'
3582
}// end loop over 's'
3583
for (unsigned int s = 0; s < 4; s++)
3585
for (unsigned int t = 0; t < 4; t++)
3587
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3588
}// end loop over 't'
3589
}// end loop over 's'
3590
}// end loop over 'r'
3592
// Transform derivatives back to physical element
3593
for (unsigned int r = 0; r < num_derivatives; r++)
3595
for (unsigned int s = 0; s < num_derivatives; s++)
3597
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
3598
}// end loop over 's'
3599
}// end loop over 'r'
3601
// Delete pointer to array of derivatives on FIAT element
3602
delete [] derivatives;
3604
// Delete pointer to array of combinations of derivatives and transform
3605
for (unsigned int r = 0; r < num_derivatives; r++)
3607
delete [] combinations[r];
3608
}// end loop over 'r'
3609
delete [] combinations;
3610
for (unsigned int r = 0; r < num_derivatives; r++)
3612
delete [] transform[r];
3613
}// end loop over 'r'
3614
delete [] transform;
3620
// Array of basisvalues.
3621
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
3623
// Declare helper variables.
3624
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
3626
// Compute basisvalues.
3627
basisvalues[0] = 1.0;
3628
basisvalues[1] = tmp0;
3629
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
3630
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
3631
basisvalues[0] *= std::sqrt(0.75);
3632
basisvalues[3] *= std::sqrt(1.25);
3633
basisvalues[2] *= std::sqrt(2.5);
3634
basisvalues[1] *= std::sqrt(7.5);
3636
// Table(s) of coefficients.
3637
static const double coefficients0[4] = \
3638
{0.28867513, 0.0, 0.21081851, -0.074535599};
3640
// Tables of derivatives of the polynomial base (transpose).
3641
static const double dmats0[4][4] = \
3642
{{0.0, 0.0, 0.0, 0.0},
3643
{6.3245553, 0.0, 0.0, 0.0},
3644
{0.0, 0.0, 0.0, 0.0},
3645
{0.0, 0.0, 0.0, 0.0}};
3647
static const double dmats1[4][4] = \
3648
{{0.0, 0.0, 0.0, 0.0},
3649
{3.1622777, 0.0, 0.0, 0.0},
3650
{5.4772256, 0.0, 0.0, 0.0},
3651
{0.0, 0.0, 0.0, 0.0}};
3653
static const double dmats2[4][4] = \
3654
{{0.0, 0.0, 0.0, 0.0},
3655
{3.1622777, 0.0, 0.0, 0.0},
3656
{1.8257419, 0.0, 0.0, 0.0},
3657
{5.1639778, 0.0, 0.0, 0.0}};
3659
// Compute reference derivatives.
3660
// Declare pointer to array of derivatives on FIAT element.
3661
double *derivatives = new double[num_derivatives];
3662
for (unsigned int r = 0; r < num_derivatives; r++)
3664
derivatives[r] = 0.0;
3665
}// end loop over 'r'
3667
// Declare derivative matrix (of polynomial basis).
3668
double dmats[4][4] = \
3669
{{1.0, 0.0, 0.0, 0.0},
3670
{0.0, 1.0, 0.0, 0.0},
3671
{0.0, 0.0, 1.0, 0.0},
3672
{0.0, 0.0, 0.0, 1.0}};
3674
// Declare (auxiliary) derivative matrix (of polynomial basis).
3675
double dmats_old[4][4] = \
3676
{{1.0, 0.0, 0.0, 0.0},
3677
{0.0, 1.0, 0.0, 0.0},
3678
{0.0, 0.0, 1.0, 0.0},
3679
{0.0, 0.0, 0.0, 1.0}};
3681
// Loop possible derivatives.
3682
for (unsigned int r = 0; r < num_derivatives; r++)
3684
// Resetting dmats values to compute next derivative.
3685
for (unsigned int t = 0; t < 4; t++)
3687
for (unsigned int u = 0; u < 4; u++)
3695
}// end loop over 'u'
3696
}// end loop over 't'
3698
// Looping derivative order to generate dmats.
3699
for (unsigned int s = 0; s < n; s++)
3701
// Updating dmats_old with new values and resetting dmats.
3702
for (unsigned int t = 0; t < 4; t++)
3704
for (unsigned int u = 0; u < 4; u++)
3706
dmats_old[t][u] = dmats[t][u];
3708
}// end loop over 'u'
3709
}// end loop over 't'
3711
// Update dmats using an inner product.
3712
if (combinations[r][s] == 0)
3714
for (unsigned int t = 0; t < 4; t++)
3716
for (unsigned int u = 0; u < 4; u++)
3718
for (unsigned int tu = 0; tu < 4; tu++)
3720
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3721
}// end loop over 'tu'
3722
}// end loop over 'u'
3723
}// end loop over 't'
3726
if (combinations[r][s] == 1)
3728
for (unsigned int t = 0; t < 4; t++)
3730
for (unsigned int u = 0; u < 4; u++)
3732
for (unsigned int tu = 0; tu < 4; tu++)
3734
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3735
}// end loop over 'tu'
3736
}// end loop over 'u'
3737
}// end loop over 't'
3740
if (combinations[r][s] == 2)
3742
for (unsigned int t = 0; t < 4; t++)
3744
for (unsigned int u = 0; u < 4; u++)
3746
for (unsigned int tu = 0; tu < 4; tu++)
3748
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3749
}// end loop over 'tu'
3750
}// end loop over 'u'
3751
}// end loop over 't'
3754
}// end loop over 's'
3755
for (unsigned int s = 0; s < 4; s++)
3757
for (unsigned int t = 0; t < 4; t++)
3759
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3760
}// end loop over 't'
3761
}// end loop over 's'
3762
}// end loop over 'r'
3764
// Transform derivatives back to physical element
3765
for (unsigned int r = 0; r < num_derivatives; r++)
3767
for (unsigned int s = 0; s < num_derivatives; s++)
3769
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
3770
}// end loop over 's'
3771
}// end loop over 'r'
3773
// Delete pointer to array of derivatives on FIAT element
3774
delete [] derivatives;
3776
// Delete pointer to array of combinations of derivatives and transform
3777
for (unsigned int r = 0; r < num_derivatives; r++)
3779
delete [] combinations[r];
3780
}// end loop over 'r'
3781
delete [] combinations;
3782
for (unsigned int r = 0; r < num_derivatives; r++)
3784
delete [] transform[r];
3785
}// end loop over 'r'
3786
delete [] transform;
3792
// Array of basisvalues.
3793
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
3795
// Declare helper variables.
3796
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
3798
// Compute basisvalues.
3799
basisvalues[0] = 1.0;
3800
basisvalues[1] = tmp0;
3801
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
3802
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
3803
basisvalues[0] *= std::sqrt(0.75);
3804
basisvalues[3] *= std::sqrt(1.25);
3805
basisvalues[2] *= std::sqrt(2.5);
3806
basisvalues[1] *= std::sqrt(7.5);
3808
// Table(s) of coefficients.
3809
static const double coefficients0[4] = \
3810
{0.28867513, 0.0, 0.0, 0.2236068};
3812
// Tables of derivatives of the polynomial base (transpose).
3813
static const double dmats0[4][4] = \
3814
{{0.0, 0.0, 0.0, 0.0},
3815
{6.3245553, 0.0, 0.0, 0.0},
3816
{0.0, 0.0, 0.0, 0.0},
3817
{0.0, 0.0, 0.0, 0.0}};
3819
static const double dmats1[4][4] = \
3820
{{0.0, 0.0, 0.0, 0.0},
3821
{3.1622777, 0.0, 0.0, 0.0},
3822
{5.4772256, 0.0, 0.0, 0.0},
3823
{0.0, 0.0, 0.0, 0.0}};
3825
static const double dmats2[4][4] = \
3826
{{0.0, 0.0, 0.0, 0.0},
3827
{3.1622777, 0.0, 0.0, 0.0},
3828
{1.8257419, 0.0, 0.0, 0.0},
3829
{5.1639778, 0.0, 0.0, 0.0}};
3831
// Compute reference derivatives.
3832
// Declare pointer to array of derivatives on FIAT element.
3833
double *derivatives = new double[num_derivatives];
3834
for (unsigned int r = 0; r < num_derivatives; r++)
3836
derivatives[r] = 0.0;
3837
}// end loop over 'r'
3839
// Declare derivative matrix (of polynomial basis).
3840
double dmats[4][4] = \
3841
{{1.0, 0.0, 0.0, 0.0},
3842
{0.0, 1.0, 0.0, 0.0},
3843
{0.0, 0.0, 1.0, 0.0},
3844
{0.0, 0.0, 0.0, 1.0}};
3846
// Declare (auxiliary) derivative matrix (of polynomial basis).
3847
double dmats_old[4][4] = \
3848
{{1.0, 0.0, 0.0, 0.0},
3849
{0.0, 1.0, 0.0, 0.0},
3850
{0.0, 0.0, 1.0, 0.0},
3851
{0.0, 0.0, 0.0, 1.0}};
3853
// Loop possible derivatives.
3854
for (unsigned int r = 0; r < num_derivatives; r++)
3856
// Resetting dmats values to compute next derivative.
3857
for (unsigned int t = 0; t < 4; t++)
3859
for (unsigned int u = 0; u < 4; u++)
3867
}// end loop over 'u'
3868
}// end loop over 't'
3870
// Looping derivative order to generate dmats.
3871
for (unsigned int s = 0; s < n; s++)
3873
// Updating dmats_old with new values and resetting dmats.
3874
for (unsigned int t = 0; t < 4; t++)
3876
for (unsigned int u = 0; u < 4; u++)
3878
dmats_old[t][u] = dmats[t][u];
3880
}// end loop over 'u'
3881
}// end loop over 't'
3883
// Update dmats using an inner product.
3884
if (combinations[r][s] == 0)
3886
for (unsigned int t = 0; t < 4; t++)
3888
for (unsigned int u = 0; u < 4; u++)
3890
for (unsigned int tu = 0; tu < 4; tu++)
3892
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3893
}// end loop over 'tu'
3894
}// end loop over 'u'
3895
}// end loop over 't'
3898
if (combinations[r][s] == 1)
3900
for (unsigned int t = 0; t < 4; t++)
3902
for (unsigned int u = 0; u < 4; u++)
3904
for (unsigned int tu = 0; tu < 4; tu++)
3906
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3907
}// end loop over 'tu'
3908
}// end loop over 'u'
3909
}// end loop over 't'
3912
if (combinations[r][s] == 2)
3914
for (unsigned int t = 0; t < 4; t++)
3916
for (unsigned int u = 0; u < 4; u++)
3918
for (unsigned int tu = 0; tu < 4; tu++)
3920
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3921
}// end loop over 'tu'
3922
}// end loop over 'u'
3923
}// end loop over 't'
3926
}// end loop over 's'
3927
for (unsigned int s = 0; s < 4; s++)
3929
for (unsigned int t = 0; t < 4; t++)
3931
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3932
}// end loop over 't'
3933
}// end loop over 's'
3934
}// end loop over 'r'
3936
// Transform derivatives back to physical element
3937
for (unsigned int r = 0; r < num_derivatives; r++)
3939
for (unsigned int s = 0; s < num_derivatives; s++)
3941
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
3942
}// end loop over 's'
3943
}// end loop over 'r'
3945
// Delete pointer to array of derivatives on FIAT element
3946
delete [] derivatives;
3948
// Delete pointer to array of combinations of derivatives and transform
3949
for (unsigned int r = 0; r < num_derivatives; r++)
3951
delete [] combinations[r];
3952
}// end loop over 'r'
3953
delete [] combinations;
3954
for (unsigned int r = 0; r < num_derivatives; r++)
3956
delete [] transform[r];
3957
}// end loop over 'r'
3958
delete [] transform;
3965
/// Evaluate order n derivatives of all basis functions at given point in cell
3966
virtual void evaluate_basis_derivatives_all(unsigned int n,
3968
const double* coordinates,
3969
const ufc::cell& c) const
3971
// Compute number of derivatives.
3972
unsigned int num_derivatives = 1;
3973
for (unsigned int r = 0; r < n; r++)
3975
num_derivatives *= 3;
3976
}// end loop over 'r'
3978
// Helper variable to hold values of a single dof.
3979
double *dof_values = new double[3*num_derivatives];
3980
for (unsigned int r = 0; r < 3*num_derivatives; r++)
3982
dof_values[r] = 0.0;
3983
}// end loop over 'r'
3985
// Loop dofs and call evaluate_basis_derivatives.
3986
for (unsigned int r = 0; r < 12; r++)
3988
evaluate_basis_derivatives(r, n, dof_values, coordinates, c);
3989
for (unsigned int s = 0; s < 3*num_derivatives; s++)
3991
values[r*3*num_derivatives + s] = dof_values[s];
3992
}// end loop over 's'
3993
}// end loop over 'r'
3996
delete [] dof_values;
3999
/// Evaluate linear functional for dof i on the function f
4000
virtual double evaluate_dof(unsigned int i,
4001
const ufc::function& f,
4002
const ufc::cell& c) const
4004
// Declare variables for result of evaluation.
4007
// Declare variable for physical coordinates.
4009
const double * const * x = c.coordinates;
4017
f.evaluate(vals, y, c);
4026
f.evaluate(vals, y, c);
4035
f.evaluate(vals, y, c);
4044
f.evaluate(vals, y, c);
4053
f.evaluate(vals, y, c);
4062
f.evaluate(vals, y, c);
4071
f.evaluate(vals, y, c);
4080
f.evaluate(vals, y, c);
4089
f.evaluate(vals, y, c);
4098
f.evaluate(vals, y, c);
4107
f.evaluate(vals, y, c);
4116
f.evaluate(vals, y, c);
4125
/// Evaluate linear functionals for all dofs on the function f
4126
virtual void evaluate_dofs(double* values,
4127
const ufc::function& f,
4128
const ufc::cell& c) const
4130
// Declare variables for result of evaluation.
4133
// Declare variable for physical coordinates.
4135
const double * const * x = c.coordinates;
4139
f.evaluate(vals, y, c);
4140
values[0] = vals[0];
4144
f.evaluate(vals, y, c);
4145
values[1] = vals[0];
4149
f.evaluate(vals, y, c);
4150
values[2] = vals[0];
4154
f.evaluate(vals, y, c);
4155
values[3] = vals[0];
4159
f.evaluate(vals, y, c);
4160
values[4] = vals[1];
4164
f.evaluate(vals, y, c);
4165
values[5] = vals[1];
4169
f.evaluate(vals, y, c);
4170
values[6] = vals[1];
4174
f.evaluate(vals, y, c);
4175
values[7] = vals[1];
4179
f.evaluate(vals, y, c);
4180
values[8] = vals[2];
4184
f.evaluate(vals, y, c);
4185
values[9] = vals[2];
4189
f.evaluate(vals, y, c);
4190
values[10] = vals[2];
4194
f.evaluate(vals, y, c);
4195
values[11] = vals[2];
4198
/// Interpolate vertex values from dof values
4199
virtual void interpolate_vertex_values(double* vertex_values,
4200
const double* dof_values,
4201
const ufc::cell& c) const
4203
// Evaluate function and change variables
4204
vertex_values[0] = dof_values[0];
4205
vertex_values[3] = dof_values[1];
4206
vertex_values[6] = dof_values[2];
4207
vertex_values[9] = dof_values[3];
4208
// Evaluate function and change variables
4209
vertex_values[1] = dof_values[4];
4210
vertex_values[4] = dof_values[5];
4211
vertex_values[7] = dof_values[6];
4212
vertex_values[10] = dof_values[7];
4213
// Evaluate function and change variables
4214
vertex_values[2] = dof_values[8];
4215
vertex_values[5] = dof_values[9];
4216
vertex_values[8] = dof_values[10];
4217
vertex_values[11] = dof_values[11];
4220
/// Map coordinate xhat from reference cell to coordinate x in cell
4221
virtual void map_from_reference_cell(double* x,
4223
const ufc::cell& c) const
4225
std::cerr << "*** FFC warning: " << "map_from_reference_cell not yet implemented (introduced in UFC 2.0)." << std::endl;
4228
/// Map from coordinate x in cell to coordinate xhat in reference cell
4229
virtual void map_to_reference_cell(double* xhat,
4231
const ufc::cell& c) const
4233
std::cerr << "*** FFC warning: " << "map_to_reference_cell not yet implemented (introduced in UFC 2.0)." << std::endl;
4236
/// Return the number of sub elements (for a mixed element)
4237
virtual unsigned int num_sub_elements() const
4242
/// Create a new finite element for sub element i (for a mixed element)
4243
virtual ufc::finite_element* create_sub_element(unsigned int i) const
4249
return new navierstokes_finite_element_0();
4254
return new navierstokes_finite_element_0();
4259
return new navierstokes_finite_element_0();
4267
/// Create a new class instance
4268
virtual ufc::finite_element* create() const
4270
return new navierstokes_finite_element_1();
4275
/// This class defines the interface for a local-to-global mapping of
4276
/// degrees of freedom (dofs).
4278
class navierstokes_dofmap_0: public ufc::dofmap
4282
unsigned int _global_dimension;
4286
navierstokes_dofmap_0() : ufc::dofmap()
4288
_global_dimension = 0;
4292
virtual ~navierstokes_dofmap_0()
4297
/// Return a string identifying the dofmap
4298
virtual const char* signature() const
4300
return "FFC dofmap for FiniteElement('Lagrange', Cell('tetrahedron', Space(3)), 1, None)";
4303
/// Return true iff mesh entities of topological dimension d are needed
4304
virtual bool needs_mesh_entities(unsigned int d) const
4333
/// Initialize dofmap for mesh (return true iff init_cell() is needed)
4334
virtual bool init_mesh(const ufc::mesh& m)
4336
_global_dimension = m.num_entities[0];
4340
/// Initialize dofmap for given cell
4341
virtual void init_cell(const ufc::mesh& m,
4347
/// Finish initialization of dofmap for cells
4348
virtual void init_cell_finalize()
4353
/// Return the topological dimension of the associated cell shape
4354
virtual unsigned int topological_dimension() const
4359
/// Return the geometric dimension of the associated cell shape
4360
virtual unsigned int geometric_dimension() const
4365
/// Return the dimension of the global finite element function space
4366
virtual unsigned int global_dimension() const
4368
return _global_dimension;
4371
/// Return the dimension of the local finite element function space for a cell
4372
virtual unsigned int local_dimension(const ufc::cell& c) const
4377
/// Return the maximum dimension of the local finite element function space
4378
virtual unsigned int max_local_dimension() const
4383
/// Return the number of dofs on each cell facet
4384
virtual unsigned int num_facet_dofs() const
4389
/// Return the number of dofs associated with each cell entity of dimension d
4390
virtual unsigned int num_entity_dofs(unsigned int d) const
4419
/// Tabulate the local-to-global mapping of dofs on a cell
4420
virtual void tabulate_dofs(unsigned int* dofs,
4422
const ufc::cell& c) const
4424
dofs[0] = c.entity_indices[0][0];
4425
dofs[1] = c.entity_indices[0][1];
4426
dofs[2] = c.entity_indices[0][2];
4427
dofs[3] = c.entity_indices[0][3];
4430
/// Tabulate the local-to-local mapping from facet dofs to cell dofs
4431
virtual void tabulate_facet_dofs(unsigned int* dofs,
4432
unsigned int facet) const
4468
/// Tabulate the local-to-local mapping of dofs on entity (d, i)
4469
virtual void tabulate_entity_dofs(unsigned int* dofs,
4470
unsigned int d, unsigned int i) const
4474
std::cerr << "*** FFC warning: " << "d is larger than dimension (3)" << std::endl;
4483
std::cerr << "*** FFC warning: " << "i is larger than number of entities (3)" << std::endl;
4531
/// Tabulate the coordinates of all dofs on a cell
4532
virtual void tabulate_coordinates(double** coordinates,
4533
const ufc::cell& c) const
4535
const double * const * x = c.coordinates;
4537
coordinates[0][0] = x[0][0];
4538
coordinates[0][1] = x[0][1];
4539
coordinates[0][2] = x[0][2];
4540
coordinates[1][0] = x[1][0];
4541
coordinates[1][1] = x[1][1];
4542
coordinates[1][2] = x[1][2];
4543
coordinates[2][0] = x[2][0];
4544
coordinates[2][1] = x[2][1];
4545
coordinates[2][2] = x[2][2];
4546
coordinates[3][0] = x[3][0];
4547
coordinates[3][1] = x[3][1];
4548
coordinates[3][2] = x[3][2];
4551
/// Return the number of sub dofmaps (for a mixed element)
4552
virtual unsigned int num_sub_dofmaps() const
4557
/// Create a new dofmap for sub dofmap i (for a mixed element)
4558
virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const
4563
/// Create a new class instance
4564
virtual ufc::dofmap* create() const
4566
return new navierstokes_dofmap_0();
4571
/// This class defines the interface for a local-to-global mapping of
4572
/// degrees of freedom (dofs).
4574
class navierstokes_dofmap_1: public ufc::dofmap
4578
unsigned int _global_dimension;
4582
navierstokes_dofmap_1() : ufc::dofmap()
4584
_global_dimension = 0;
4588
virtual ~navierstokes_dofmap_1()
4593
/// Return a string identifying the dofmap
4594
virtual const char* signature() const
4596
return "FFC dofmap for VectorElement('Lagrange', Cell('tetrahedron', Space(3)), 1, 3, None)";
4599
/// Return true iff mesh entities of topological dimension d are needed
4600
virtual bool needs_mesh_entities(unsigned int d) const
4629
/// Initialize dofmap for mesh (return true iff init_cell() is needed)
4630
virtual bool init_mesh(const ufc::mesh& m)
4632
_global_dimension = 3*m.num_entities[0];
4636
/// Initialize dofmap for given cell
4637
virtual void init_cell(const ufc::mesh& m,
4643
/// Finish initialization of dofmap for cells
4644
virtual void init_cell_finalize()
4649
/// Return the topological dimension of the associated cell shape
4650
virtual unsigned int topological_dimension() const
4655
/// Return the geometric dimension of the associated cell shape
4656
virtual unsigned int geometric_dimension() const
4661
/// Return the dimension of the global finite element function space
4662
virtual unsigned int global_dimension() const
4664
return _global_dimension;
4667
/// Return the dimension of the local finite element function space for a cell
4668
virtual unsigned int local_dimension(const ufc::cell& c) const
4673
/// Return the maximum dimension of the local finite element function space
4674
virtual unsigned int max_local_dimension() const
4679
/// Return the number of dofs on each cell facet
4680
virtual unsigned int num_facet_dofs() const
4685
/// Return the number of dofs associated with each cell entity of dimension d
4686
virtual unsigned int num_entity_dofs(unsigned int d) const
4715
/// Tabulate the local-to-global mapping of dofs on a cell
4716
virtual void tabulate_dofs(unsigned int* dofs,
4718
const ufc::cell& c) const
4720
unsigned int offset = 0;
4721
dofs[0] = offset + c.entity_indices[0][0];
4722
dofs[1] = offset + c.entity_indices[0][1];
4723
dofs[2] = offset + c.entity_indices[0][2];
4724
dofs[3] = offset + c.entity_indices[0][3];
4725
offset += m.num_entities[0];
4726
dofs[4] = offset + c.entity_indices[0][0];
4727
dofs[5] = offset + c.entity_indices[0][1];
4728
dofs[6] = offset + c.entity_indices[0][2];
4729
dofs[7] = offset + c.entity_indices[0][3];
4730
offset += m.num_entities[0];
4731
dofs[8] = offset + c.entity_indices[0][0];
4732
dofs[9] = offset + c.entity_indices[0][1];
4733
dofs[10] = offset + c.entity_indices[0][2];
4734
dofs[11] = offset + c.entity_indices[0][3];
4735
offset += m.num_entities[0];
4738
/// Tabulate the local-to-local mapping from facet dofs to cell dofs
4739
virtual void tabulate_facet_dofs(unsigned int* dofs,
4740
unsigned int facet) const
4800
/// Tabulate the local-to-local mapping of dofs on entity (d, i)
4801
virtual void tabulate_entity_dofs(unsigned int* dofs,
4802
unsigned int d, unsigned int i) const
4806
std::cerr << "*** FFC warning: " << "d is larger than dimension (3)" << std::endl;
4815
std::cerr << "*** FFC warning: " << "i is larger than number of entities (3)" << std::endl;
4871
/// Tabulate the coordinates of all dofs on a cell
4872
virtual void tabulate_coordinates(double** coordinates,
4873
const ufc::cell& c) const
4875
const double * const * x = c.coordinates;
4877
coordinates[0][0] = x[0][0];
4878
coordinates[0][1] = x[0][1];
4879
coordinates[0][2] = x[0][2];
4880
coordinates[1][0] = x[1][0];
4881
coordinates[1][1] = x[1][1];
4882
coordinates[1][2] = x[1][2];
4883
coordinates[2][0] = x[2][0];
4884
coordinates[2][1] = x[2][1];
4885
coordinates[2][2] = x[2][2];
4886
coordinates[3][0] = x[3][0];
4887
coordinates[3][1] = x[3][1];
4888
coordinates[3][2] = x[3][2];
4889
coordinates[4][0] = x[0][0];
4890
coordinates[4][1] = x[0][1];
4891
coordinates[4][2] = x[0][2];
4892
coordinates[5][0] = x[1][0];
4893
coordinates[5][1] = x[1][1];
4894
coordinates[5][2] = x[1][2];
4895
coordinates[6][0] = x[2][0];
4896
coordinates[6][1] = x[2][1];
4897
coordinates[6][2] = x[2][2];
4898
coordinates[7][0] = x[3][0];
4899
coordinates[7][1] = x[3][1];
4900
coordinates[7][2] = x[3][2];
4901
coordinates[8][0] = x[0][0];
4902
coordinates[8][1] = x[0][1];
4903
coordinates[8][2] = x[0][2];
4904
coordinates[9][0] = x[1][0];
4905
coordinates[9][1] = x[1][1];
4906
coordinates[9][2] = x[1][2];
4907
coordinates[10][0] = x[2][0];
4908
coordinates[10][1] = x[2][1];
4909
coordinates[10][2] = x[2][2];
4910
coordinates[11][0] = x[3][0];
4911
coordinates[11][1] = x[3][1];
4912
coordinates[11][2] = x[3][2];
4915
/// Return the number of sub dofmaps (for a mixed element)
4916
virtual unsigned int num_sub_dofmaps() const
4921
/// Create a new dofmap for sub dofmap i (for a mixed element)
4922
virtual ufc::dofmap* create_sub_dofmap(unsigned int i) const
4928
return new navierstokes_dofmap_0();
4933
return new navierstokes_dofmap_0();
4938
return new navierstokes_dofmap_0();
4946
/// Create a new class instance
4947
virtual ufc::dofmap* create() const
4949
return new navierstokes_dofmap_1();
4954
/// This class defines the interface for the tabulation of the cell
4955
/// tensor corresponding to the local contribution to a form from
4956
/// the integral over a cell.
4958
class navierstokes_cell_integral_0_0: public ufc::cell_integral
4963
navierstokes_cell_integral_0_0() : ufc::cell_integral()
4969
virtual ~navierstokes_cell_integral_0_0()
4974
/// Tabulate the tensor for the contribution from a local cell
4975
virtual void tabulate_tensor(double* A,
4976
const double * const * w,
4977
const ufc::cell& c) const
4979
// Extract vertex coordinates
4980
const double * const * x = c.coordinates;
4982
// Compute Jacobian of affine map from reference cell
4983
const double J_00 = x[1][0] - x[0][0];
4984
const double J_01 = x[2][0] - x[0][0];
4985
const double J_02 = x[3][0] - x[0][0];
4986
const double J_10 = x[1][1] - x[0][1];
4987
const double J_11 = x[2][1] - x[0][1];
4988
const double J_12 = x[3][1] - x[0][1];
4989
const double J_20 = x[1][2] - x[0][2];
4990
const double J_21 = x[2][2] - x[0][2];
4991
const double J_22 = x[3][2] - x[0][2];
4993
// Compute sub determinants
4994
const double d_00 = J_11*J_22 - J_12*J_21;
4995
const double d_01 = J_12*J_20 - J_10*J_22;
4996
const double d_02 = J_10*J_21 - J_11*J_20;
4997
const double d_10 = J_02*J_21 - J_01*J_22;
4998
const double d_11 = J_00*J_22 - J_02*J_20;
4999
const double d_12 = J_01*J_20 - J_00*J_21;
5000
const double d_20 = J_01*J_12 - J_02*J_11;
5001
const double d_21 = J_02*J_10 - J_00*J_12;
5002
const double d_22 = J_00*J_11 - J_01*J_10;
5004
// Compute determinant of Jacobian
5005
double detJ = J_00*d_00 + J_10*d_10 + J_20*d_20;
5007
// Compute inverse of Jacobian
5008
const double K_00 = d_00 / detJ;
5009
const double K_01 = d_10 / detJ;
5010
const double K_02 = d_20 / detJ;
5011
const double K_10 = d_01 / detJ;
5012
const double K_11 = d_11 / detJ;
5013
const double K_12 = d_21 / detJ;
5014
const double K_20 = d_02 / detJ;
5015
const double K_21 = d_12 / detJ;
5016
const double K_22 = d_22 / detJ;
5019
const double det = std::abs(detJ);
5023
// Compute circumradius.
5026
// Facet Area (divide by two because 'det' is scaled by area of reference triangle).
5028
// Array of quadrature weights.
5029
static const double W4[4] = {0.041666667, 0.041666667, 0.041666667, 0.041666667};
5030
// Quadrature points on the UFC reference element: (0.5854102, 0.1381966, 0.1381966), (0.1381966, 0.5854102, 0.1381966), (0.1381966, 0.1381966, 0.5854102), (0.1381966, 0.1381966, 0.1381966)
5032
// Value of basis functions at quadrature points.
5033
static const double FE0_C0[4][4] = \
5034
{{0.1381966, 0.5854102, 0.1381966, 0.1381966},
5035
{0.1381966, 0.1381966, 0.5854102, 0.1381966},
5036
{0.1381966, 0.1381966, 0.1381966, 0.5854102},
5037
{0.5854102, 0.1381966, 0.1381966, 0.1381966}};
5039
// Array of non-zero columns
5040
static const unsigned int nzc8[4] = {8, 9, 10, 11};
5042
// Array of non-zero columns
5043
static const unsigned int nzc4[4] = {4, 5, 6, 7};
5045
// Array of non-zero columns
5046
static const unsigned int nzc0[4] = {0, 1, 2, 3};
5048
static const double FE0_C0_D001[4][2] = \
5054
// Array of non-zero columns
5055
static const unsigned int nzc9[2] = {8, 11};
5057
// Array of non-zero columns
5058
static const unsigned int nzc5[2] = {4, 7};
5060
// Array of non-zero columns
5061
static const unsigned int nzc6[2] = {4, 6};
5063
// Array of non-zero columns
5064
static const unsigned int nzc10[2] = {8, 10};
5066
// Array of non-zero columns
5067
static const unsigned int nzc7[2] = {4, 5};
5069
// Array of non-zero columns
5070
static const unsigned int nzc3[2] = {0, 1};
5072
// Array of non-zero columns
5073
static const unsigned int nzc2[2] = {0, 2};
5075
// Array of non-zero columns
5076
static const unsigned int nzc1[2] = {0, 3};
5078
// Array of non-zero columns
5079
static const unsigned int nzc11[2] = {8, 9};
5081
// Reset values in the element tensor.
5082
for (unsigned int r = 0; r < 144; r++)
5085
}// end loop over 'r'
5086
// Number of operations to compute geometry constants: 9.
5098
// Compute element tensor using UFL quadrature representation
5099
// Optimisations: ('eliminate zeros', True), ('ignore ones', True), ('ignore zero tables', True), ('optimisation', 'simplify_expressions'), ('remove zero terms', True)
5101
// Loop quadrature points for integral.
5102
// Number of operations to compute element tensor for following IP loop = 1032
5103
for (unsigned int ip = 0; ip < 4; ip++)
5106
// Coefficient declarations.
5111
// Total number of operations to compute function values = 24
5112
for (unsigned int r = 0; r < 4; r++)
5114
F0 += FE0_C0[ip][r]*w[0][nzc0[r]];
5115
F1 += FE0_C0[ip][r]*w[0][nzc4[r]];
5116
F2 += FE0_C0[ip][r]*w[0][nzc8[r]];
5117
}// end loop over 'r'
5119
// Number of operations to compute ip constants: 18
5121
// Number of operations: 6
5122
I[0] = W4[ip]*(F0*G[0] + F1*G[1] + F2*G[2]);
5124
// Number of operations: 6
5125
I[1] = W4[ip]*(F0*G[3] + F1*G[4] + F2*G[5]);
5127
// Number of operations: 6
5128
I[2] = W4[ip]*(F0*G[6] + F1*G[7] + F2*G[8]);
5131
// Number of operations for primary indices: 216
5132
for (unsigned int j = 0; j < 4; j++)
5134
for (unsigned int k = 0; k < 2; k++)
5136
// Number of operations to compute entry: 3
5137
A[nzc0[j]*12 + nzc1[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[0];
5138
// Number of operations to compute entry: 3
5139
A[nzc0[j]*12 + nzc2[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[1];
5140
// Number of operations to compute entry: 3
5141
A[nzc0[j]*12 + nzc3[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[2];
5142
// Number of operations to compute entry: 3
5143
A[nzc4[j]*12 + nzc5[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[0];
5144
// Number of operations to compute entry: 3
5145
A[nzc4[j]*12 + nzc6[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[1];
5146
// Number of operations to compute entry: 3
5147
A[nzc4[j]*12 + nzc7[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[2];
5148
// Number of operations to compute entry: 3
5149
A[nzc8[j]*12 + nzc10[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[1];
5150
// Number of operations to compute entry: 3
5151
A[nzc8[j]*12 + nzc11[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[2];
5152
// Number of operations to compute entry: 3
5153
A[nzc8[j]*12 + nzc9[k]] += FE0_C0[ip][j]*FE0_C0_D001[ip][k]*I[0];
5154
}// end loop over 'k'
5155
}// end loop over 'j'
5156
}// end loop over 'ip'
5159
/// Tabulate the tensor for the contribution from a local cell
5160
/// using the specified reference cell quadrature points/weights
5161
virtual void tabulate_tensor(double* A,
5162
const double * const * w,
5164
unsigned int num_quadrature_points,
5165
const double * const * quadrature_points,
5166
const double* quadrature_weights) const
5168
std::cerr << "*** FFC warning: " << "Quadrature version of tabulate_tensor not yet implemented (introduced in UFC 2.0)." << std::endl;
5173
/// This class defines the interface for the assembly of the global
5174
/// tensor corresponding to a form with r + n arguments, that is, a
5177
/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R
5179
/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r
5180
/// global tensor A is defined by
5182
/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn),
5184
/// where each argument Vj represents the application to the
5185
/// sequence of basis functions of Vj and w1, w2, ..., wn are given
5186
/// fixed functions (coefficients).
5188
class navierstokes_form_0: public ufc::form
5193
navierstokes_form_0() : ufc::form()
5199
virtual ~navierstokes_form_0()
5204
/// Return a string identifying the form
5205
virtual const char* signature() const
5207
return "Form([Integral(IndexSum(Product(IndexSum(Product(Indexed(Coefficient(VectorElement('Lagrange', Cell('tetrahedron', Space(3)), 1, 3, None), 0), MultiIndex((Index(0),), {Index(0): 3})), Indexed(SpatialDerivative(Argument(VectorElement('Lagrange', Cell('tetrahedron', Space(3)), 1, 3, None), 1), MultiIndex((Index(0),), {Index(0): 3})), MultiIndex((Index(1),), {Index(1): 3}))), MultiIndex((Index(0),), {Index(0): 3})), Indexed(Argument(VectorElement('Lagrange', Cell('tetrahedron', Space(3)), 1, 3, None), 0), MultiIndex((Index(1),), {Index(1): 3}))), MultiIndex((Index(1),), {Index(1): 3})), Measure('cell', 0, None))])";
5210
/// Return the rank of the global tensor (r)
5211
virtual unsigned int rank() const
5216
/// Return the number of coefficients (n)
5217
virtual unsigned int num_coefficients() const
5222
/// Return the number of cell domains
5223
virtual unsigned int num_cell_domains() const
5228
/// Return the number of exterior facet domains
5229
virtual unsigned int num_exterior_facet_domains() const
5234
/// Return the number of interior facet domains
5235
virtual unsigned int num_interior_facet_domains() const
5240
/// Create a new finite element for argument function i
5241
virtual ufc::finite_element* create_finite_element(unsigned int i) const
5247
return new navierstokes_finite_element_1();
5252
return new navierstokes_finite_element_1();
5257
return new navierstokes_finite_element_1();
5265
/// Create a new dofmap for argument function i
5266
virtual ufc::dofmap* create_dofmap(unsigned int i) const
5272
return new navierstokes_dofmap_1();
5277
return new navierstokes_dofmap_1();
5282
return new navierstokes_dofmap_1();
5290
/// Create a new cell integral on sub domain i
5291
virtual ufc::cell_integral* create_cell_integral(unsigned int i) const
5297
return new navierstokes_cell_integral_0_0();
5305
/// Create a new exterior facet integral on sub domain i
5306
virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const
5311
/// Create a new interior facet integral on sub domain i
5312
virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const