1
// This code conforms with the UFC specification version 2.2.0
2
// and was automatically generated by FFC version 1.2.0.
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 __SUBDOMAINS_H
27
#define __SUBDOMAINS_H
34
/// This class defines the interface for a finite element.
36
class subdomains_finite_element_0: public ufc::finite_element
41
subdomains_finite_element_0() : ufc::finite_element()
47
virtual ~subdomains_finite_element_0()
52
/// Return a string identifying the finite element
53
virtual const char* signature() const
55
return "FiniteElement('Lagrange', Domain(Cell('tetrahedron', 3), 'tetrahedron_multiverse', 3, 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 std::size_t topological_dimension() const
70
/// Return the geometric dimension of the cell shape
71
virtual std::size_t geometric_dimension() const
76
/// Return the dimension of the finite element function space
77
virtual std::size_t space_dimension() const
82
/// Return the rank of the value space
83
virtual std::size_t value_rank() const
88
/// Return the dimension of the value space for axis i
89
virtual std::size_t value_dimension(std::size_t i) const
94
/// Evaluate basis function i at given point x in cell
95
virtual void evaluate_basis(std::size_t i,
98
const double* vertex_coordinates,
99
int cell_orientation) const
103
compute_jacobian_tetrahedron_3d(J, vertex_coordinates);
105
// Compute Jacobian inverse and determinant
108
compute_jacobian_inverse_tetrahedron_3d(K, detJ, J);
112
const double C0 = vertex_coordinates[9] + vertex_coordinates[6] + vertex_coordinates[3] - vertex_coordinates[0];
113
const double C1 = vertex_coordinates[10] + vertex_coordinates[7] + vertex_coordinates[4] - vertex_coordinates[1];
114
const double C2 = vertex_coordinates[11] + vertex_coordinates[8] + vertex_coordinates[5] - vertex_coordinates[2];
116
// Compute subdeterminants
117
const double d_00 = J[4]*J[8] - J[5]*J[7];
118
const double d_01 = J[5]*J[6] - J[3]*J[8];
119
const double d_02 = J[3]*J[7] - J[4]*J[6];
120
const double d_10 = J[2]*J[7] - J[1]*J[8];
121
const double d_11 = J[0]*J[8] - J[2]*J[6];
122
const double d_12 = J[1]*J[6] - J[0]*J[7];
123
const double d_20 = J[1]*J[5] - J[2]*J[4];
124
const double d_21 = J[2]*J[3] - J[0]*J[5];
125
const double d_22 = J[0]*J[4] - J[1]*J[3];
127
// Get coordinates and map to the reference (FIAT) element
128
double X = (d_00*(2.0*x[0] - C0) + d_10*(2.0*x[1] - C1) + d_20*(2.0*x[2] - C2)) / detJ;
129
double Y = (d_01*(2.0*x[0] - C0) + d_11*(2.0*x[1] - C1) + d_21*(2.0*x[2] - C2)) / detJ;
130
double Z = (d_02*(2.0*x[0] - C0) + d_12*(2.0*x[1] - C1) + d_22*(2.0*x[2] - C2)) / detJ;
140
// Array of basisvalues
141
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
143
// Declare helper variables
144
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
146
// Compute basisvalues
147
basisvalues[0] = 1.0;
148
basisvalues[1] = tmp0;
149
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
150
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
151
basisvalues[0] *= std::sqrt(0.75);
152
basisvalues[3] *= std::sqrt(1.25);
153
basisvalues[2] *= std::sqrt(2.5);
154
basisvalues[1] *= std::sqrt(7.5);
156
// Table(s) of coefficients
157
static const double coefficients0[4] = \
158
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
161
for (unsigned int r = 0; r < 4; r++)
163
*values += coefficients0[r]*basisvalues[r];
164
}// end loop over 'r'
170
// Array of basisvalues
171
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
173
// Declare helper variables
174
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
176
// Compute basisvalues
177
basisvalues[0] = 1.0;
178
basisvalues[1] = tmp0;
179
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
180
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
181
basisvalues[0] *= std::sqrt(0.75);
182
basisvalues[3] *= std::sqrt(1.25);
183
basisvalues[2] *= std::sqrt(2.5);
184
basisvalues[1] *= std::sqrt(7.5);
186
// Table(s) of coefficients
187
static const double coefficients0[4] = \
188
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
191
for (unsigned int r = 0; r < 4; r++)
193
*values += coefficients0[r]*basisvalues[r];
194
}// end loop over 'r'
200
// Array of basisvalues
201
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
203
// Declare helper variables
204
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
206
// Compute basisvalues
207
basisvalues[0] = 1.0;
208
basisvalues[1] = tmp0;
209
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
210
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
211
basisvalues[0] *= std::sqrt(0.75);
212
basisvalues[3] *= std::sqrt(1.25);
213
basisvalues[2] *= std::sqrt(2.5);
214
basisvalues[1] *= std::sqrt(7.5);
216
// Table(s) of coefficients
217
static const double coefficients0[4] = \
218
{0.28867513, 0.0, 0.21081851, -0.074535599};
221
for (unsigned int r = 0; r < 4; r++)
223
*values += coefficients0[r]*basisvalues[r];
224
}// end loop over 'r'
230
// Array of basisvalues
231
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
233
// Declare helper variables
234
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
236
// Compute basisvalues
237
basisvalues[0] = 1.0;
238
basisvalues[1] = tmp0;
239
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
240
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
241
basisvalues[0] *= std::sqrt(0.75);
242
basisvalues[3] *= std::sqrt(1.25);
243
basisvalues[2] *= std::sqrt(2.5);
244
basisvalues[1] *= std::sqrt(7.5);
246
// Table(s) of coefficients
247
static const double coefficients0[4] = \
248
{0.28867513, 0.0, 0.0, 0.2236068};
251
for (unsigned int r = 0; r < 4; r++)
253
*values += coefficients0[r]*basisvalues[r];
254
}// end loop over 'r'
261
/// Evaluate all basis functions at given point x in cell
262
virtual void evaluate_basis_all(double* values,
264
const double* vertex_coordinates,
265
int cell_orientation) const
267
// Helper variable to hold values of a single dof.
268
double dof_values = 0.0;
270
// Loop dofs and call evaluate_basis
271
for (unsigned int r = 0; r < 4; r++)
273
evaluate_basis(r, &dof_values, x, vertex_coordinates, cell_orientation);
274
values[r] = dof_values;
275
}// end loop over 'r'
278
/// Evaluate order n derivatives of basis function i at given point x in cell
279
virtual void evaluate_basis_derivatives(std::size_t i,
283
const double* vertex_coordinates,
284
int cell_orientation) const
288
compute_jacobian_tetrahedron_3d(J, vertex_coordinates);
290
// Compute Jacobian inverse and determinant
293
compute_jacobian_inverse_tetrahedron_3d(K, detJ, J);
297
const double C0 = vertex_coordinates[9] + vertex_coordinates[6] + vertex_coordinates[3] - vertex_coordinates[0];
298
const double C1 = vertex_coordinates[10] + vertex_coordinates[7] + vertex_coordinates[4] - vertex_coordinates[1];
299
const double C2 = vertex_coordinates[11] + vertex_coordinates[8] + vertex_coordinates[5] - vertex_coordinates[2];
301
// Compute subdeterminants
302
const double d_00 = J[4]*J[8] - J[5]*J[7];
303
const double d_01 = J[5]*J[6] - J[3]*J[8];
304
const double d_02 = J[3]*J[7] - J[4]*J[6];
305
const double d_10 = J[2]*J[7] - J[1]*J[8];
306
const double d_11 = J[0]*J[8] - J[2]*J[6];
307
const double d_12 = J[1]*J[6] - J[0]*J[7];
308
const double d_20 = J[1]*J[5] - J[2]*J[4];
309
const double d_21 = J[2]*J[3] - J[0]*J[5];
310
const double d_22 = J[0]*J[4] - J[1]*J[3];
312
// Get coordinates and map to the reference (FIAT) element
313
double X = (d_00*(2.0*x[0] - C0) + d_10*(2.0*x[1] - C1) + d_20*(2.0*x[2] - C2)) / detJ;
314
double Y = (d_01*(2.0*x[0] - C0) + d_11*(2.0*x[1] - C1) + d_21*(2.0*x[2] - C2)) / detJ;
315
double Z = (d_02*(2.0*x[0] - C0) + d_12*(2.0*x[1] - C1) + d_22*(2.0*x[2] - C2)) / detJ;
318
// Compute number of derivatives.
319
unsigned int num_derivatives = 1;
320
for (unsigned int r = 0; r < n; r++)
322
num_derivatives *= 3;
323
}// end loop over 'r'
325
// Declare pointer to two dimensional array that holds combinations of derivatives and initialise
326
unsigned int **combinations = new unsigned int *[num_derivatives];
327
for (unsigned int row = 0; row < num_derivatives; row++)
329
combinations[row] = new unsigned int [n];
330
for (unsigned int col = 0; col < n; col++)
331
combinations[row][col] = 0;
334
// Generate combinations of derivatives
335
for (unsigned int row = 1; row < num_derivatives; row++)
337
for (unsigned int num = 0; num < row; num++)
339
for (unsigned int col = n-1; col+1 > 0; col--)
341
if (combinations[row][col] + 1 > 2)
342
combinations[row][col] = 0;
345
combinations[row][col] += 1;
352
// Compute inverse of Jacobian
353
const double Jinv[3][3] = {{K[0], K[1], K[2]}, {K[3], K[4], K[5]}, {K[6], K[7], K[8]}};
355
// Declare transformation matrix
356
// Declare pointer to two dimensional array and initialise
357
double **transform = new double *[num_derivatives];
359
for (unsigned int j = 0; j < num_derivatives; j++)
361
transform[j] = new double [num_derivatives];
362
for (unsigned int k = 0; k < num_derivatives; k++)
366
// Construct transformation matrix
367
for (unsigned int row = 0; row < num_derivatives; row++)
369
for (unsigned int col = 0; col < num_derivatives; col++)
371
for (unsigned int k = 0; k < n; k++)
372
transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];
376
// Reset values. Assuming that values is always an array.
377
for (unsigned int r = 0; r < num_derivatives; r++)
380
}// end loop over 'r'
387
// Array of basisvalues
388
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
390
// Declare helper variables
391
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
393
// Compute basisvalues
394
basisvalues[0] = 1.0;
395
basisvalues[1] = tmp0;
396
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
397
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
398
basisvalues[0] *= std::sqrt(0.75);
399
basisvalues[3] *= std::sqrt(1.25);
400
basisvalues[2] *= std::sqrt(2.5);
401
basisvalues[1] *= std::sqrt(7.5);
403
// Table(s) of coefficients
404
static const double coefficients0[4] = \
405
{0.28867513, -0.18257419, -0.10540926, -0.074535599};
407
// Tables of derivatives of the polynomial base (transpose).
408
static const double dmats0[4][4] = \
409
{{0.0, 0.0, 0.0, 0.0},
410
{6.3245553, 0.0, 0.0, 0.0},
411
{0.0, 0.0, 0.0, 0.0},
412
{0.0, 0.0, 0.0, 0.0}};
414
static const double dmats1[4][4] = \
415
{{0.0, 0.0, 0.0, 0.0},
416
{3.1622777, 0.0, 0.0, 0.0},
417
{5.4772256, 0.0, 0.0, 0.0},
418
{0.0, 0.0, 0.0, 0.0}};
420
static const double dmats2[4][4] = \
421
{{0.0, 0.0, 0.0, 0.0},
422
{3.1622777, 0.0, 0.0, 0.0},
423
{1.8257419, 0.0, 0.0, 0.0},
424
{5.1639778, 0.0, 0.0, 0.0}};
426
// Compute reference derivatives.
427
// Declare pointer to array of derivatives on FIAT element.
428
double *derivatives = new double[num_derivatives];
429
for (unsigned int r = 0; r < num_derivatives; r++)
431
derivatives[r] = 0.0;
432
}// end loop over 'r'
434
// Declare derivative matrix (of polynomial basis).
435
double dmats[4][4] = \
436
{{1.0, 0.0, 0.0, 0.0},
437
{0.0, 1.0, 0.0, 0.0},
438
{0.0, 0.0, 1.0, 0.0},
439
{0.0, 0.0, 0.0, 1.0}};
441
// Declare (auxiliary) derivative matrix (of polynomial basis).
442
double dmats_old[4][4] = \
443
{{1.0, 0.0, 0.0, 0.0},
444
{0.0, 1.0, 0.0, 0.0},
445
{0.0, 0.0, 1.0, 0.0},
446
{0.0, 0.0, 0.0, 1.0}};
448
// Loop possible derivatives.
449
for (unsigned int r = 0; r < num_derivatives; r++)
451
// Resetting dmats values to compute next derivative.
452
for (unsigned int t = 0; t < 4; t++)
454
for (unsigned int u = 0; u < 4; u++)
462
}// end loop over 'u'
463
}// end loop over 't'
465
// Looping derivative order to generate dmats.
466
for (unsigned int s = 0; s < n; s++)
468
// Updating dmats_old with new values and resetting dmats.
469
for (unsigned int t = 0; t < 4; t++)
471
for (unsigned int u = 0; u < 4; u++)
473
dmats_old[t][u] = dmats[t][u];
475
}// end loop over 'u'
476
}// end loop over 't'
478
// Update dmats using an inner product.
479
if (combinations[r][s] == 0)
481
for (unsigned int t = 0; t < 4; t++)
483
for (unsigned int u = 0; u < 4; u++)
485
for (unsigned int tu = 0; tu < 4; tu++)
487
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
488
}// end loop over 'tu'
489
}// end loop over 'u'
490
}// end loop over 't'
493
if (combinations[r][s] == 1)
495
for (unsigned int t = 0; t < 4; t++)
497
for (unsigned int u = 0; u < 4; u++)
499
for (unsigned int tu = 0; tu < 4; tu++)
501
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
502
}// end loop over 'tu'
503
}// end loop over 'u'
504
}// end loop over 't'
507
if (combinations[r][s] == 2)
509
for (unsigned int t = 0; t < 4; t++)
511
for (unsigned int u = 0; u < 4; u++)
513
for (unsigned int tu = 0; tu < 4; tu++)
515
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
516
}// end loop over 'tu'
517
}// end loop over 'u'
518
}// end loop over 't'
521
}// end loop over 's'
522
for (unsigned int s = 0; s < 4; s++)
524
for (unsigned int t = 0; t < 4; t++)
526
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
527
}// end loop over 't'
528
}// end loop over 's'
529
}// end loop over 'r'
531
// Transform derivatives back to physical element
532
for (unsigned int r = 0; r < num_derivatives; r++)
534
for (unsigned int s = 0; s < num_derivatives; s++)
536
values[r] += transform[r][s]*derivatives[s];
537
}// end loop over 's'
538
}// end loop over 'r'
540
// Delete pointer to array of derivatives on FIAT element
541
delete [] derivatives;
543
// Delete pointer to array of combinations of derivatives and transform
544
for (unsigned int r = 0; r < num_derivatives; r++)
546
delete [] combinations[r];
547
}// end loop over 'r'
548
delete [] combinations;
549
for (unsigned int r = 0; r < num_derivatives; r++)
551
delete [] transform[r];
552
}// end loop over 'r'
559
// Array of basisvalues
560
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
562
// Declare helper variables
563
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
565
// Compute basisvalues
566
basisvalues[0] = 1.0;
567
basisvalues[1] = tmp0;
568
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
569
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
570
basisvalues[0] *= std::sqrt(0.75);
571
basisvalues[3] *= std::sqrt(1.25);
572
basisvalues[2] *= std::sqrt(2.5);
573
basisvalues[1] *= std::sqrt(7.5);
575
// Table(s) of coefficients
576
static const double coefficients0[4] = \
577
{0.28867513, 0.18257419, -0.10540926, -0.074535599};
579
// Tables of derivatives of the polynomial base (transpose).
580
static const double dmats0[4][4] = \
581
{{0.0, 0.0, 0.0, 0.0},
582
{6.3245553, 0.0, 0.0, 0.0},
583
{0.0, 0.0, 0.0, 0.0},
584
{0.0, 0.0, 0.0, 0.0}};
586
static const double dmats1[4][4] = \
587
{{0.0, 0.0, 0.0, 0.0},
588
{3.1622777, 0.0, 0.0, 0.0},
589
{5.4772256, 0.0, 0.0, 0.0},
590
{0.0, 0.0, 0.0, 0.0}};
592
static const double dmats2[4][4] = \
593
{{0.0, 0.0, 0.0, 0.0},
594
{3.1622777, 0.0, 0.0, 0.0},
595
{1.8257419, 0.0, 0.0, 0.0},
596
{5.1639778, 0.0, 0.0, 0.0}};
598
// Compute reference derivatives.
599
// Declare pointer to array of derivatives on FIAT element.
600
double *derivatives = new double[num_derivatives];
601
for (unsigned int r = 0; r < num_derivatives; r++)
603
derivatives[r] = 0.0;
604
}// end loop over 'r'
606
// Declare derivative matrix (of polynomial basis).
607
double dmats[4][4] = \
608
{{1.0, 0.0, 0.0, 0.0},
609
{0.0, 1.0, 0.0, 0.0},
610
{0.0, 0.0, 1.0, 0.0},
611
{0.0, 0.0, 0.0, 1.0}};
613
// Declare (auxiliary) derivative matrix (of polynomial basis).
614
double dmats_old[4][4] = \
615
{{1.0, 0.0, 0.0, 0.0},
616
{0.0, 1.0, 0.0, 0.0},
617
{0.0, 0.0, 1.0, 0.0},
618
{0.0, 0.0, 0.0, 1.0}};
620
// Loop possible derivatives.
621
for (unsigned int r = 0; r < num_derivatives; r++)
623
// Resetting dmats values to compute next derivative.
624
for (unsigned int t = 0; t < 4; t++)
626
for (unsigned int u = 0; u < 4; u++)
634
}// end loop over 'u'
635
}// end loop over 't'
637
// Looping derivative order to generate dmats.
638
for (unsigned int s = 0; s < n; s++)
640
// Updating dmats_old with new values and resetting dmats.
641
for (unsigned int t = 0; t < 4; t++)
643
for (unsigned int u = 0; u < 4; u++)
645
dmats_old[t][u] = dmats[t][u];
647
}// end loop over 'u'
648
}// end loop over 't'
650
// Update dmats using an inner product.
651
if (combinations[r][s] == 0)
653
for (unsigned int t = 0; t < 4; t++)
655
for (unsigned int u = 0; u < 4; u++)
657
for (unsigned int tu = 0; tu < 4; tu++)
659
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
660
}// end loop over 'tu'
661
}// end loop over 'u'
662
}// end loop over 't'
665
if (combinations[r][s] == 1)
667
for (unsigned int t = 0; t < 4; t++)
669
for (unsigned int u = 0; u < 4; u++)
671
for (unsigned int tu = 0; tu < 4; tu++)
673
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
674
}// end loop over 'tu'
675
}// end loop over 'u'
676
}// end loop over 't'
679
if (combinations[r][s] == 2)
681
for (unsigned int t = 0; t < 4; t++)
683
for (unsigned int u = 0; u < 4; u++)
685
for (unsigned int tu = 0; tu < 4; tu++)
687
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
688
}// end loop over 'tu'
689
}// end loop over 'u'
690
}// end loop over 't'
693
}// end loop over 's'
694
for (unsigned int s = 0; s < 4; s++)
696
for (unsigned int t = 0; t < 4; t++)
698
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
699
}// end loop over 't'
700
}// end loop over 's'
701
}// end loop over 'r'
703
// Transform derivatives back to physical element
704
for (unsigned int r = 0; r < num_derivatives; r++)
706
for (unsigned int s = 0; s < num_derivatives; s++)
708
values[r] += transform[r][s]*derivatives[s];
709
}// end loop over 's'
710
}// end loop over 'r'
712
// Delete pointer to array of derivatives on FIAT element
713
delete [] derivatives;
715
// Delete pointer to array of combinations of derivatives and transform
716
for (unsigned int r = 0; r < num_derivatives; r++)
718
delete [] combinations[r];
719
}// end loop over 'r'
720
delete [] combinations;
721
for (unsigned int r = 0; r < num_derivatives; r++)
723
delete [] transform[r];
724
}// end loop over 'r'
731
// Array of basisvalues
732
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
734
// Declare helper variables
735
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
737
// Compute basisvalues
738
basisvalues[0] = 1.0;
739
basisvalues[1] = tmp0;
740
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
741
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
742
basisvalues[0] *= std::sqrt(0.75);
743
basisvalues[3] *= std::sqrt(1.25);
744
basisvalues[2] *= std::sqrt(2.5);
745
basisvalues[1] *= std::sqrt(7.5);
747
// Table(s) of coefficients
748
static const double coefficients0[4] = \
749
{0.28867513, 0.0, 0.21081851, -0.074535599};
751
// Tables of derivatives of the polynomial base (transpose).
752
static const double dmats0[4][4] = \
753
{{0.0, 0.0, 0.0, 0.0},
754
{6.3245553, 0.0, 0.0, 0.0},
755
{0.0, 0.0, 0.0, 0.0},
756
{0.0, 0.0, 0.0, 0.0}};
758
static const double dmats1[4][4] = \
759
{{0.0, 0.0, 0.0, 0.0},
760
{3.1622777, 0.0, 0.0, 0.0},
761
{5.4772256, 0.0, 0.0, 0.0},
762
{0.0, 0.0, 0.0, 0.0}};
764
static const double dmats2[4][4] = \
765
{{0.0, 0.0, 0.0, 0.0},
766
{3.1622777, 0.0, 0.0, 0.0},
767
{1.8257419, 0.0, 0.0, 0.0},
768
{5.1639778, 0.0, 0.0, 0.0}};
770
// Compute reference derivatives.
771
// Declare pointer to array of derivatives on FIAT element.
772
double *derivatives = new double[num_derivatives];
773
for (unsigned int r = 0; r < num_derivatives; r++)
775
derivatives[r] = 0.0;
776
}// end loop over 'r'
778
// Declare derivative matrix (of polynomial basis).
779
double dmats[4][4] = \
780
{{1.0, 0.0, 0.0, 0.0},
781
{0.0, 1.0, 0.0, 0.0},
782
{0.0, 0.0, 1.0, 0.0},
783
{0.0, 0.0, 0.0, 1.0}};
785
// Declare (auxiliary) derivative matrix (of polynomial basis).
786
double dmats_old[4][4] = \
787
{{1.0, 0.0, 0.0, 0.0},
788
{0.0, 1.0, 0.0, 0.0},
789
{0.0, 0.0, 1.0, 0.0},
790
{0.0, 0.0, 0.0, 1.0}};
792
// Loop possible derivatives.
793
for (unsigned int r = 0; r < num_derivatives; r++)
795
// Resetting dmats values to compute next derivative.
796
for (unsigned int t = 0; t < 4; t++)
798
for (unsigned int u = 0; u < 4; u++)
806
}// end loop over 'u'
807
}// end loop over 't'
809
// Looping derivative order to generate dmats.
810
for (unsigned int s = 0; s < n; s++)
812
// Updating dmats_old with new values and resetting dmats.
813
for (unsigned int t = 0; t < 4; t++)
815
for (unsigned int u = 0; u < 4; u++)
817
dmats_old[t][u] = dmats[t][u];
819
}// end loop over 'u'
820
}// end loop over 't'
822
// Update dmats using an inner product.
823
if (combinations[r][s] == 0)
825
for (unsigned int t = 0; t < 4; t++)
827
for (unsigned int u = 0; u < 4; u++)
829
for (unsigned int tu = 0; tu < 4; tu++)
831
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
832
}// end loop over 'tu'
833
}// end loop over 'u'
834
}// end loop over 't'
837
if (combinations[r][s] == 1)
839
for (unsigned int t = 0; t < 4; t++)
841
for (unsigned int u = 0; u < 4; u++)
843
for (unsigned int tu = 0; tu < 4; tu++)
845
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
846
}// end loop over 'tu'
847
}// end loop over 'u'
848
}// end loop over 't'
851
if (combinations[r][s] == 2)
853
for (unsigned int t = 0; t < 4; t++)
855
for (unsigned int u = 0; u < 4; u++)
857
for (unsigned int tu = 0; tu < 4; tu++)
859
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
860
}// end loop over 'tu'
861
}// end loop over 'u'
862
}// end loop over 't'
865
}// end loop over 's'
866
for (unsigned int s = 0; s < 4; s++)
868
for (unsigned int t = 0; t < 4; t++)
870
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
871
}// end loop over 't'
872
}// end loop over 's'
873
}// end loop over 'r'
875
// Transform derivatives back to physical element
876
for (unsigned int r = 0; r < num_derivatives; r++)
878
for (unsigned int s = 0; s < num_derivatives; s++)
880
values[r] += transform[r][s]*derivatives[s];
881
}// end loop over 's'
882
}// end loop over 'r'
884
// Delete pointer to array of derivatives on FIAT element
885
delete [] derivatives;
887
// Delete pointer to array of combinations of derivatives and transform
888
for (unsigned int r = 0; r < num_derivatives; r++)
890
delete [] combinations[r];
891
}// end loop over 'r'
892
delete [] combinations;
893
for (unsigned int r = 0; r < num_derivatives; r++)
895
delete [] transform[r];
896
}// end loop over 'r'
903
// Array of basisvalues
904
double basisvalues[4] = {0.0, 0.0, 0.0, 0.0};
906
// Declare helper variables
907
double tmp0 = 0.5*(2.0 + Y + Z + 2.0*X);
909
// Compute basisvalues
910
basisvalues[0] = 1.0;
911
basisvalues[1] = tmp0;
912
basisvalues[2] = 0.5*(2.0 + 3.0*Y + Z)*basisvalues[0];
913
basisvalues[3] = (2.0*Z + 1.0)*basisvalues[0];
914
basisvalues[0] *= std::sqrt(0.75);
915
basisvalues[3] *= std::sqrt(1.25);
916
basisvalues[2] *= std::sqrt(2.5);
917
basisvalues[1] *= std::sqrt(7.5);
919
// Table(s) of coefficients
920
static const double coefficients0[4] = \
921
{0.28867513, 0.0, 0.0, 0.2236068};
923
// Tables of derivatives of the polynomial base (transpose).
924
static const double dmats0[4][4] = \
925
{{0.0, 0.0, 0.0, 0.0},
926
{6.3245553, 0.0, 0.0, 0.0},
927
{0.0, 0.0, 0.0, 0.0},
928
{0.0, 0.0, 0.0, 0.0}};
930
static const double dmats1[4][4] = \
931
{{0.0, 0.0, 0.0, 0.0},
932
{3.1622777, 0.0, 0.0, 0.0},
933
{5.4772256, 0.0, 0.0, 0.0},
934
{0.0, 0.0, 0.0, 0.0}};
936
static const double dmats2[4][4] = \
937
{{0.0, 0.0, 0.0, 0.0},
938
{3.1622777, 0.0, 0.0, 0.0},
939
{1.8257419, 0.0, 0.0, 0.0},
940
{5.1639778, 0.0, 0.0, 0.0}};
942
// Compute reference derivatives.
943
// Declare pointer to array of derivatives on FIAT element.
944
double *derivatives = new double[num_derivatives];
945
for (unsigned int r = 0; r < num_derivatives; r++)
947
derivatives[r] = 0.0;
948
}// end loop over 'r'
950
// Declare derivative matrix (of polynomial basis).
951
double dmats[4][4] = \
952
{{1.0, 0.0, 0.0, 0.0},
953
{0.0, 1.0, 0.0, 0.0},
954
{0.0, 0.0, 1.0, 0.0},
955
{0.0, 0.0, 0.0, 1.0}};
957
// Declare (auxiliary) derivative matrix (of polynomial basis).
958
double dmats_old[4][4] = \
959
{{1.0, 0.0, 0.0, 0.0},
960
{0.0, 1.0, 0.0, 0.0},
961
{0.0, 0.0, 1.0, 0.0},
962
{0.0, 0.0, 0.0, 1.0}};
964
// Loop possible derivatives.
965
for (unsigned int r = 0; r < num_derivatives; r++)
967
// Resetting dmats values to compute next derivative.
968
for (unsigned int t = 0; t < 4; t++)
970
for (unsigned int u = 0; u < 4; u++)
978
}// end loop over 'u'
979
}// end loop over 't'
981
// Looping derivative order to generate dmats.
982
for (unsigned int s = 0; s < n; s++)
984
// Updating dmats_old with new values and resetting dmats.
985
for (unsigned int t = 0; t < 4; t++)
987
for (unsigned int u = 0; u < 4; u++)
989
dmats_old[t][u] = dmats[t][u];
991
}// end loop over 'u'
992
}// end loop over 't'
994
// Update dmats using an inner product.
995
if (combinations[r][s] == 0)
997
for (unsigned int t = 0; t < 4; t++)
999
for (unsigned int u = 0; u < 4; u++)
1001
for (unsigned int tu = 0; tu < 4; tu++)
1003
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1004
}// end loop over 'tu'
1005
}// end loop over 'u'
1006
}// end loop over 't'
1009
if (combinations[r][s] == 1)
1011
for (unsigned int t = 0; t < 4; t++)
1013
for (unsigned int u = 0; u < 4; u++)
1015
for (unsigned int tu = 0; tu < 4; tu++)
1017
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1018
}// end loop over 'tu'
1019
}// end loop over 'u'
1020
}// end loop over 't'
1023
if (combinations[r][s] == 2)
1025
for (unsigned int t = 0; t < 4; t++)
1027
for (unsigned int u = 0; u < 4; u++)
1029
for (unsigned int tu = 0; tu < 4; tu++)
1031
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1032
}// end loop over 'tu'
1033
}// end loop over 'u'
1034
}// end loop over 't'
1037
}// end loop over 's'
1038
for (unsigned int s = 0; s < 4; s++)
1040
for (unsigned int t = 0; t < 4; t++)
1042
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1043
}// end loop over 't'
1044
}// end loop over 's'
1045
}// end loop over 'r'
1047
// Transform derivatives back to physical element
1048
for (unsigned int r = 0; r < num_derivatives; r++)
1050
for (unsigned int s = 0; s < num_derivatives; s++)
1052
values[r] += transform[r][s]*derivatives[s];
1053
}// end loop over 's'
1054
}// end loop over 'r'
1056
// Delete pointer to array of derivatives on FIAT element
1057
delete [] derivatives;
1059
// Delete pointer to array of combinations of derivatives and transform
1060
for (unsigned int r = 0; r < num_derivatives; r++)
1062
delete [] combinations[r];
1063
}// end loop over 'r'
1064
delete [] combinations;
1065
for (unsigned int r = 0; r < num_derivatives; r++)
1067
delete [] transform[r];
1068
}// end loop over 'r'
1069
delete [] transform;
1076
/// Evaluate order n derivatives of all basis functions at given point x in cell
1077
virtual void evaluate_basis_derivatives_all(std::size_t n,
1080
const double* vertex_coordinates,
1081
int cell_orientation) const
1083
// Compute number of derivatives.
1084
unsigned int num_derivatives = 1;
1085
for (unsigned int r = 0; r < n; r++)
1087
num_derivatives *= 3;
1088
}// end loop over 'r'
1090
// Helper variable to hold values of a single dof.
1091
double *dof_values = new double[num_derivatives];
1092
for (unsigned int r = 0; r < num_derivatives; r++)
1094
dof_values[r] = 0.0;
1095
}// end loop over 'r'
1097
// Loop dofs and call evaluate_basis_derivatives.
1098
for (unsigned int r = 0; r < 4; r++)
1100
evaluate_basis_derivatives(r, n, dof_values, x, vertex_coordinates, cell_orientation);
1101
for (unsigned int s = 0; s < num_derivatives; s++)
1103
values[r*num_derivatives + s] = dof_values[s];
1104
}// end loop over 's'
1105
}// end loop over 'r'
1108
delete [] dof_values;
1111
/// Evaluate linear functional for dof i on the function f
1112
virtual double evaluate_dof(std::size_t i,
1113
const ufc::function& f,
1114
const double* vertex_coordinates,
1115
int cell_orientation,
1116
const ufc::cell& c) const
1118
// Declare variables for result of evaluation
1121
// Declare variable for physical coordinates
1127
y[0] = vertex_coordinates[0];
1128
y[1] = vertex_coordinates[1];
1129
y[2] = vertex_coordinates[2];
1130
f.evaluate(vals, y, c);
1136
y[0] = vertex_coordinates[3];
1137
y[1] = vertex_coordinates[4];
1138
y[2] = vertex_coordinates[5];
1139
f.evaluate(vals, y, c);
1145
y[0] = vertex_coordinates[6];
1146
y[1] = vertex_coordinates[7];
1147
y[2] = vertex_coordinates[8];
1148
f.evaluate(vals, y, c);
1154
y[0] = vertex_coordinates[9];
1155
y[1] = vertex_coordinates[10];
1156
y[2] = vertex_coordinates[11];
1157
f.evaluate(vals, y, c);
1166
/// Evaluate linear functionals for all dofs on the function f
1167
virtual void evaluate_dofs(double* values,
1168
const ufc::function& f,
1169
const double* vertex_coordinates,
1170
int cell_orientation,
1171
const ufc::cell& c) const
1173
// Declare variables for result of evaluation
1176
// Declare variable for physical coordinates
1178
y[0] = vertex_coordinates[0];
1179
y[1] = vertex_coordinates[1];
1180
y[2] = vertex_coordinates[2];
1181
f.evaluate(vals, y, c);
1182
values[0] = vals[0];
1183
y[0] = vertex_coordinates[3];
1184
y[1] = vertex_coordinates[4];
1185
y[2] = vertex_coordinates[5];
1186
f.evaluate(vals, y, c);
1187
values[1] = vals[0];
1188
y[0] = vertex_coordinates[6];
1189
y[1] = vertex_coordinates[7];
1190
y[2] = vertex_coordinates[8];
1191
f.evaluate(vals, y, c);
1192
values[2] = vals[0];
1193
y[0] = vertex_coordinates[9];
1194
y[1] = vertex_coordinates[10];
1195
y[2] = vertex_coordinates[11];
1196
f.evaluate(vals, y, c);
1197
values[3] = vals[0];
1200
/// Interpolate vertex values from dof values
1201
virtual void interpolate_vertex_values(double* vertex_values,
1202
const double* dof_values,
1203
const double* vertex_coordinates,
1204
int cell_orientation,
1205
const ufc::cell& c) const
1207
// Evaluate function and change variables
1208
vertex_values[0] = dof_values[0];
1209
vertex_values[1] = dof_values[1];
1210
vertex_values[2] = dof_values[2];
1211
vertex_values[3] = dof_values[3];
1214
/// Map coordinate xhat from reference cell to coordinate x in cell
1215
virtual void map_from_reference_cell(double* x,
1217
const ufc::cell& c) const
1219
std::cerr << "*** FFC warning: " << "map_from_reference_cell not yet implemented." << std::endl;
1222
/// Map from coordinate x in cell to coordinate xhat in reference cell
1223
virtual void map_to_reference_cell(double* xhat,
1225
const ufc::cell& c) const
1227
std::cerr << "*** FFC warning: " << "map_to_reference_cell not yet implemented." << std::endl;
1230
/// Return the number of sub elements (for a mixed element)
1231
virtual std::size_t num_sub_elements() const
1236
/// Create a new finite element for sub element i (for a mixed element)
1237
virtual ufc::finite_element* create_sub_element(std::size_t i) const
1242
/// Create a new class instance
1243
virtual ufc::finite_element* create() const
1245
return new subdomains_finite_element_0();
1250
/// This class defines the interface for a local-to-global mapping of
1251
/// degrees of freedom (dofs).
1253
class subdomains_dofmap_0: public ufc::dofmap
1258
subdomains_dofmap_0() : ufc::dofmap()
1264
virtual ~subdomains_dofmap_0()
1269
/// Return a string identifying the dofmap
1270
virtual const char* signature() const
1272
return "FFC dofmap for FiniteElement('Lagrange', Domain(Cell('tetrahedron', 3), 'tetrahedron_multiverse', 3, 3), 1, None)";
1275
/// Return true iff mesh entities of topological dimension d are needed
1276
virtual bool needs_mesh_entities(std::size_t d) const
1305
/// Return the topological dimension of the associated cell shape
1306
virtual std::size_t topological_dimension() const
1311
/// Return the geometric dimension of the associated cell shape
1312
virtual std::size_t geometric_dimension() const
1317
/// Return the dimension of the global finite element function space
1318
virtual std::size_t global_dimension(const std::vector<std::size_t>&
1319
num_global_entities) const
1321
return num_global_entities[0];
1324
/// Return the dimension of the local finite element function space for a cell
1325
virtual std::size_t local_dimension(const ufc::cell& c) const
1330
/// Return the maximum dimension of the local finite element function space
1331
virtual std::size_t max_local_dimension() const
1336
/// Return the number of dofs on each cell facet
1337
virtual std::size_t num_facet_dofs() const
1342
/// Return the number of dofs associated with each cell entity of dimension d
1343
virtual std::size_t num_entity_dofs(std::size_t d) const
1372
/// Tabulate the local-to-global mapping of dofs on a cell
1373
virtual void tabulate_dofs(std::size_t* dofs,
1374
const std::vector<std::size_t>& num_global_entities,
1375
const ufc::cell& c) const
1377
dofs[0] = c.entity_indices[0][0];
1378
dofs[1] = c.entity_indices[0][1];
1379
dofs[2] = c.entity_indices[0][2];
1380
dofs[3] = c.entity_indices[0][3];
1383
/// Tabulate the local-to-local mapping from facet dofs to cell dofs
1384
virtual void tabulate_facet_dofs(std::size_t* dofs,
1385
std::size_t facet) const
1421
/// Tabulate the local-to-local mapping of dofs on entity (d, i)
1422
virtual void tabulate_entity_dofs(std::size_t* dofs,
1423
std::size_t d, std::size_t i) const
1427
std::cerr << "*** FFC warning: " << "d is larger than dimension (3)" << std::endl;
1436
std::cerr << "*** FFC warning: " << "i is larger than number of entities (3)" << std::endl;
1484
/// Tabulate the coordinates of all dofs on a cell
1485
virtual void tabulate_coordinates(double** dof_coordinates,
1486
const double* vertex_coordinates) const
1488
dof_coordinates[0][0] = vertex_coordinates[0];
1489
dof_coordinates[0][1] = vertex_coordinates[1];
1490
dof_coordinates[0][2] = vertex_coordinates[2];
1491
dof_coordinates[1][0] = vertex_coordinates[3];
1492
dof_coordinates[1][1] = vertex_coordinates[4];
1493
dof_coordinates[1][2] = vertex_coordinates[5];
1494
dof_coordinates[2][0] = vertex_coordinates[6];
1495
dof_coordinates[2][1] = vertex_coordinates[7];
1496
dof_coordinates[2][2] = vertex_coordinates[8];
1497
dof_coordinates[3][0] = vertex_coordinates[9];
1498
dof_coordinates[3][1] = vertex_coordinates[10];
1499
dof_coordinates[3][2] = vertex_coordinates[11];
1502
/// Return the number of sub dofmaps (for a mixed element)
1503
virtual std::size_t num_sub_dofmaps() const
1508
/// Create a new dofmap for sub dofmap i (for a mixed element)
1509
virtual ufc::dofmap* create_sub_dofmap(std::size_t i) const
1514
/// Create a new class instance
1515
virtual ufc::dofmap* create() const
1517
return new subdomains_dofmap_0();
1522
/// This class defines the interface for the tabulation of the cell
1523
/// tensor corresponding to the local contribution to a form from
1524
/// the integral over a cell.
1526
class subdomains_cell_integral_0_0: public ufc::cell_integral
1531
subdomains_cell_integral_0_0() : ufc::cell_integral()
1537
virtual ~subdomains_cell_integral_0_0()
1542
/// Tabulate the tensor for the contribution from a local cell
1543
virtual void tabulate_tensor(double* A,
1544
const double * const * w,
1545
const double* vertex_coordinates,
1546
int cell_orientation) const
1550
compute_jacobian_tetrahedron_3d(J, vertex_coordinates);
1552
// Compute Jacobian inverse and determinant
1555
compute_jacobian_inverse_tetrahedron_3d(K, detJ, J);
1558
const double det = std::abs(detJ);
1562
// Compute circumradius
1565
// Facet area (divide by two because 'det' is scaled by area of reference triangle)
1567
// Array of quadrature weights.
1568
static const double W4[4] = {0.041666667, 0.041666667, 0.041666667, 0.041666667};
1569
// 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)
1571
// Value of basis functions at quadrature points.
1572
static const double FE0[4][4] = \
1573
{{0.1381966, 0.5854102, 0.1381966, 0.1381966},
1574
{0.1381966, 0.1381966, 0.5854102, 0.1381966},
1575
{0.1381966, 0.1381966, 0.1381966, 0.5854102},
1576
{0.5854102, 0.1381966, 0.1381966, 0.1381966}};
1578
// Reset values in the element tensor.
1579
for (unsigned int r = 0; r < 16; r++)
1582
}// end loop over 'r'
1584
// Compute element tensor using UFL quadrature representation
1585
// Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
1587
// Loop quadrature points for integral.
1588
// Number of operations to compute element tensor for following IP loop = 256
1589
for (unsigned int ip = 0; ip < 4; ip++)
1592
// Number of operations for primary indices: 64
1593
for (unsigned int j = 0; j < 4; j++)
1595
for (unsigned int k = 0; k < 4; k++)
1597
// Number of operations to compute entry: 4
1598
A[j*4 + k] += FE0[ip][j]*FE0[ip][k]*W4[ip]*det;
1599
}// end loop over 'k'
1600
}// end loop over 'j'
1601
}// end loop over 'ip'
1606
/// This class defines the interface for the tabulation of the cell
1607
/// tensor corresponding to the local contribution to a form from
1608
/// the integral over a cell.
1610
class subdomains_cell_integral_0_1: public ufc::cell_integral
1615
subdomains_cell_integral_0_1() : ufc::cell_integral()
1621
virtual ~subdomains_cell_integral_0_1()
1626
/// Tabulate the tensor for the contribution from a local cell
1627
virtual void tabulate_tensor(double* A,
1628
const double * const * w,
1629
const double* vertex_coordinates,
1630
int cell_orientation) const
1634
compute_jacobian_tetrahedron_3d(J, vertex_coordinates);
1636
// Compute Jacobian inverse and determinant
1639
compute_jacobian_inverse_tetrahedron_3d(K, detJ, J);
1642
const double det = std::abs(detJ);
1646
// Compute circumradius
1649
// Facet area (divide by two because 'det' is scaled by area of reference triangle)
1651
// Array of quadrature weights.
1652
static const double W4[4] = {0.041666667, 0.041666667, 0.041666667, 0.041666667};
1653
// 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)
1655
// Value of basis functions at quadrature points.
1656
static const double FE0[4][4] = \
1657
{{0.1381966, 0.5854102, 0.1381966, 0.1381966},
1658
{0.1381966, 0.1381966, 0.5854102, 0.1381966},
1659
{0.1381966, 0.1381966, 0.1381966, 0.5854102},
1660
{0.5854102, 0.1381966, 0.1381966, 0.1381966}};
1662
// Reset values in the element tensor.
1663
for (unsigned int r = 0; r < 16; r++)
1666
}// end loop over 'r'
1668
// Compute element tensor using UFL quadrature representation
1669
// Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
1671
// Loop quadrature points for integral.
1672
// Number of operations to compute element tensor for following IP loop = 320
1673
for (unsigned int ip = 0; ip < 4; ip++)
1676
// Number of operations for primary indices: 80
1677
for (unsigned int j = 0; j < 4; j++)
1679
for (unsigned int k = 0; k < 4; k++)
1681
// Number of operations to compute entry: 5
1682
A[j*4 + k] += FE0[ip][j]*FE0[ip][k]*10.0*W4[ip]*det;
1683
}// end loop over 'k'
1684
}// end loop over 'j'
1685
}// end loop over 'ip'
1690
/// This class defines the interface for the tabulation of the
1691
/// exterior facet tensor corresponding to the local contribution to
1692
/// a form from the integral over an exterior facet.
1694
class subdomains_exterior_facet_integral_0_0: public ufc::exterior_facet_integral
1699
subdomains_exterior_facet_integral_0_0() : ufc::exterior_facet_integral()
1705
virtual ~subdomains_exterior_facet_integral_0_0()
1710
/// Tabulate the tensor for the contribution from a local exterior facet
1711
virtual void tabulate_tensor(double* A,
1712
const double * const * w,
1713
const double* vertex_coordinates,
1714
std::size_t facet) const
1718
compute_jacobian_tetrahedron_3d(J, vertex_coordinates);
1720
// Compute Jacobian inverse and determinant
1723
compute_jacobian_inverse_tetrahedron_3d(K, detJ, J);
1727
// Get vertices on face
1728
static unsigned int face_vertices[4][3] = {{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}};
1729
const unsigned int v0 = face_vertices[facet][0];
1730
const unsigned int v1 = face_vertices[facet][1];
1731
const unsigned int v2 = face_vertices[facet][2];
1733
// Compute scale factor (area of face scaled by area of reference triangle)
1734
const double a0 = (vertex_coordinates[3*v0 + 1]*vertex_coordinates[3*v1 + 2] +
1735
vertex_coordinates[3*v0 + 2]*vertex_coordinates[3*v2 + 1] +
1736
vertex_coordinates[3*v1 + 1]*vertex_coordinates[3*v2 + 2]) -
1737
(vertex_coordinates[3*v2 + 1]*vertex_coordinates[3*v1 + 2] +
1738
vertex_coordinates[3*v2 + 2]*vertex_coordinates[3*v0 + 1] +
1739
vertex_coordinates[3*v1 + 1]*vertex_coordinates[3*v0 + 2]);
1741
const double a1 = (vertex_coordinates[3*v0 + 2]*vertex_coordinates[3*v1 + 0] +
1742
vertex_coordinates[3*v0 + 0]*vertex_coordinates[3*v2 + 2] +
1743
vertex_coordinates[3*v1 + 2]*vertex_coordinates[3*v2 + 0]) -
1744
(vertex_coordinates[3*v2 + 2]*vertex_coordinates[3*v1 + 0] +
1745
vertex_coordinates[3*v2 + 0]*vertex_coordinates[3*v0 + 2] +
1746
vertex_coordinates[3*v1 + 2]*vertex_coordinates[3*v0 + 0]);
1748
const double a2 = (vertex_coordinates[3*v0 + 0]*vertex_coordinates[3*v1 + 1] +
1749
vertex_coordinates[3*v0 + 1]*vertex_coordinates[3*v2 + 0] +
1750
vertex_coordinates[3*v1 + 0]*vertex_coordinates[3*v2 + 1]) -
1751
(vertex_coordinates[3*v2 + 0]*vertex_coordinates[3*v1 + 1] +
1752
vertex_coordinates[3*v2 + 1]*vertex_coordinates[3*v0 + 0] +
1753
vertex_coordinates[3*v1 + 0]*vertex_coordinates[3*v0 + 1]);
1755
const double det = std::sqrt(a0*a0 + a1*a1 + a2*a2);
1762
// Compute circumradius
1765
// Facet area (divide by two because 'det' is scaled by area of reference triangle)
1767
// Array of quadrature weights.
1768
static const double W3[3] = {0.16666667, 0.16666667, 0.16666667};
1769
// Quadrature points on the UFC reference element: (0.16666667, 0.16666667), (0.16666667, 0.66666667), (0.66666667, 0.16666667)
1771
// Value of basis functions at quadrature points.
1772
static const double FE0_f0[3][4] = \
1773
{{0.0, 0.66666667, 0.16666667, 0.16666667},
1774
{0.0, 0.16666667, 0.16666667, 0.66666667},
1775
{0.0, 0.16666667, 0.66666667, 0.16666667}};
1777
static const double FE0_f1[3][4] = \
1778
{{0.66666667, 0.0, 0.16666667, 0.16666667},
1779
{0.16666667, 0.0, 0.16666667, 0.66666667},
1780
{0.16666667, 0.0, 0.66666667, 0.16666667}};
1782
static const double FE0_f2[3][4] = \
1783
{{0.66666667, 0.16666667, 0.0, 0.16666667},
1784
{0.16666667, 0.16666667, 0.0, 0.66666667},
1785
{0.16666667, 0.66666667, 0.0, 0.16666667}};
1787
static const double FE0_f3[3][4] = \
1788
{{0.66666667, 0.16666667, 0.16666667, 0.0},
1789
{0.16666667, 0.16666667, 0.66666667, 0.0},
1790
{0.16666667, 0.66666667, 0.16666667, 0.0}};
1792
// Reset values in the element tensor.
1793
for (unsigned int r = 0; r < 16; r++)
1796
}// end loop over 'r'
1798
// Compute element tensor using UFL quadrature representation
1799
// Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
1804
// Total number of operations to compute element tensor (from this point): 192
1806
// Loop quadrature points for integral.
1807
// Number of operations to compute element tensor for following IP loop = 192
1808
for (unsigned int ip = 0; ip < 3; ip++)
1811
// Number of operations for primary indices: 64
1812
for (unsigned int j = 0; j < 4; j++)
1814
for (unsigned int k = 0; k < 4; k++)
1816
// Number of operations to compute entry: 4
1817
A[j*4 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*W3[ip]*det;
1818
}// end loop over 'k'
1819
}// end loop over 'j'
1820
}// end loop over 'ip'
1825
// Total number of operations to compute element tensor (from this point): 192
1827
// Loop quadrature points for integral.
1828
// Number of operations to compute element tensor for following IP loop = 192
1829
for (unsigned int ip = 0; ip < 3; ip++)
1832
// Number of operations for primary indices: 64
1833
for (unsigned int j = 0; j < 4; j++)
1835
for (unsigned int k = 0; k < 4; k++)
1837
// Number of operations to compute entry: 4
1838
A[j*4 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*W3[ip]*det;
1839
}// end loop over 'k'
1840
}// end loop over 'j'
1841
}// end loop over 'ip'
1846
// Total number of operations to compute element tensor (from this point): 192
1848
// Loop quadrature points for integral.
1849
// Number of operations to compute element tensor for following IP loop = 192
1850
for (unsigned int ip = 0; ip < 3; ip++)
1853
// Number of operations for primary indices: 64
1854
for (unsigned int j = 0; j < 4; j++)
1856
for (unsigned int k = 0; k < 4; k++)
1858
// Number of operations to compute entry: 4
1859
A[j*4 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*W3[ip]*det;
1860
}// end loop over 'k'
1861
}// end loop over 'j'
1862
}// end loop over 'ip'
1867
// Total number of operations to compute element tensor (from this point): 192
1869
// Loop quadrature points for integral.
1870
// Number of operations to compute element tensor for following IP loop = 192
1871
for (unsigned int ip = 0; ip < 3; ip++)
1874
// Number of operations for primary indices: 64
1875
for (unsigned int j = 0; j < 4; j++)
1877
for (unsigned int k = 0; k < 4; k++)
1879
// Number of operations to compute entry: 4
1880
A[j*4 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*W3[ip]*det;
1881
}// end loop over 'k'
1882
}// end loop over 'j'
1883
}// end loop over 'ip'
1892
/// This class defines the interface for the tabulation of the
1893
/// exterior facet tensor corresponding to the local contribution to
1894
/// a form from the integral over an exterior facet.
1896
class subdomains_exterior_facet_integral_0_1: public ufc::exterior_facet_integral
1901
subdomains_exterior_facet_integral_0_1() : ufc::exterior_facet_integral()
1907
virtual ~subdomains_exterior_facet_integral_0_1()
1912
/// Tabulate the tensor for the contribution from a local exterior facet
1913
virtual void tabulate_tensor(double* A,
1914
const double * const * w,
1915
const double* vertex_coordinates,
1916
std::size_t facet) const
1920
compute_jacobian_tetrahedron_3d(J, vertex_coordinates);
1922
// Compute Jacobian inverse and determinant
1925
compute_jacobian_inverse_tetrahedron_3d(K, detJ, J);
1929
// Get vertices on face
1930
static unsigned int face_vertices[4][3] = {{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}};
1931
const unsigned int v0 = face_vertices[facet][0];
1932
const unsigned int v1 = face_vertices[facet][1];
1933
const unsigned int v2 = face_vertices[facet][2];
1935
// Compute scale factor (area of face scaled by area of reference triangle)
1936
const double a0 = (vertex_coordinates[3*v0 + 1]*vertex_coordinates[3*v1 + 2] +
1937
vertex_coordinates[3*v0 + 2]*vertex_coordinates[3*v2 + 1] +
1938
vertex_coordinates[3*v1 + 1]*vertex_coordinates[3*v2 + 2]) -
1939
(vertex_coordinates[3*v2 + 1]*vertex_coordinates[3*v1 + 2] +
1940
vertex_coordinates[3*v2 + 2]*vertex_coordinates[3*v0 + 1] +
1941
vertex_coordinates[3*v1 + 1]*vertex_coordinates[3*v0 + 2]);
1943
const double a1 = (vertex_coordinates[3*v0 + 2]*vertex_coordinates[3*v1 + 0] +
1944
vertex_coordinates[3*v0 + 0]*vertex_coordinates[3*v2 + 2] +
1945
vertex_coordinates[3*v1 + 2]*vertex_coordinates[3*v2 + 0]) -
1946
(vertex_coordinates[3*v2 + 2]*vertex_coordinates[3*v1 + 0] +
1947
vertex_coordinates[3*v2 + 0]*vertex_coordinates[3*v0 + 2] +
1948
vertex_coordinates[3*v1 + 2]*vertex_coordinates[3*v0 + 0]);
1950
const double a2 = (vertex_coordinates[3*v0 + 0]*vertex_coordinates[3*v1 + 1] +
1951
vertex_coordinates[3*v0 + 1]*vertex_coordinates[3*v2 + 0] +
1952
vertex_coordinates[3*v1 + 0]*vertex_coordinates[3*v2 + 1]) -
1953
(vertex_coordinates[3*v2 + 0]*vertex_coordinates[3*v1 + 1] +
1954
vertex_coordinates[3*v2 + 1]*vertex_coordinates[3*v0 + 0] +
1955
vertex_coordinates[3*v1 + 0]*vertex_coordinates[3*v0 + 1]);
1957
const double det = std::sqrt(a0*a0 + a1*a1 + a2*a2);
1964
// Compute circumradius
1967
// Facet area (divide by two because 'det' is scaled by area of reference triangle)
1969
// Array of quadrature weights.
1970
static const double W3[3] = {0.16666667, 0.16666667, 0.16666667};
1971
// Quadrature points on the UFC reference element: (0.16666667, 0.16666667), (0.16666667, 0.66666667), (0.66666667, 0.16666667)
1973
// Value of basis functions at quadrature points.
1974
static const double FE0_f0[3][4] = \
1975
{{0.0, 0.66666667, 0.16666667, 0.16666667},
1976
{0.0, 0.16666667, 0.16666667, 0.66666667},
1977
{0.0, 0.16666667, 0.66666667, 0.16666667}};
1979
static const double FE0_f1[3][4] = \
1980
{{0.66666667, 0.0, 0.16666667, 0.16666667},
1981
{0.16666667, 0.0, 0.16666667, 0.66666667},
1982
{0.16666667, 0.0, 0.66666667, 0.16666667}};
1984
static const double FE0_f2[3][4] = \
1985
{{0.66666667, 0.16666667, 0.0, 0.16666667},
1986
{0.16666667, 0.16666667, 0.0, 0.66666667},
1987
{0.16666667, 0.66666667, 0.0, 0.16666667}};
1989
static const double FE0_f3[3][4] = \
1990
{{0.66666667, 0.16666667, 0.16666667, 0.0},
1991
{0.16666667, 0.16666667, 0.66666667, 0.0},
1992
{0.16666667, 0.66666667, 0.16666667, 0.0}};
1994
// Reset values in the element tensor.
1995
for (unsigned int r = 0; r < 16; r++)
1998
}// end loop over 'r'
2000
// Compute element tensor using UFL quadrature representation
2001
// Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
2006
// Total number of operations to compute element tensor (from this point): 240
2008
// Loop quadrature points for integral.
2009
// Number of operations to compute element tensor for following IP loop = 240
2010
for (unsigned int ip = 0; ip < 3; ip++)
2013
// Number of operations for primary indices: 80
2014
for (unsigned int j = 0; j < 4; j++)
2016
for (unsigned int k = 0; k < 4; k++)
2018
// Number of operations to compute entry: 5
2019
A[j*4 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*2.0*W3[ip]*det;
2020
}// end loop over 'k'
2021
}// end loop over 'j'
2022
}// end loop over 'ip'
2027
// Total number of operations to compute element tensor (from this point): 240
2029
// Loop quadrature points for integral.
2030
// Number of operations to compute element tensor for following IP loop = 240
2031
for (unsigned int ip = 0; ip < 3; ip++)
2034
// Number of operations for primary indices: 80
2035
for (unsigned int j = 0; j < 4; j++)
2037
for (unsigned int k = 0; k < 4; k++)
2039
// Number of operations to compute entry: 5
2040
A[j*4 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*2.0*W3[ip]*det;
2041
}// end loop over 'k'
2042
}// end loop over 'j'
2043
}// end loop over 'ip'
2048
// Total number of operations to compute element tensor (from this point): 240
2050
// Loop quadrature points for integral.
2051
// Number of operations to compute element tensor for following IP loop = 240
2052
for (unsigned int ip = 0; ip < 3; ip++)
2055
// Number of operations for primary indices: 80
2056
for (unsigned int j = 0; j < 4; j++)
2058
for (unsigned int k = 0; k < 4; k++)
2060
// Number of operations to compute entry: 5
2061
A[j*4 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*2.0*W3[ip]*det;
2062
}// end loop over 'k'
2063
}// end loop over 'j'
2064
}// end loop over 'ip'
2069
// Total number of operations to compute element tensor (from this point): 240
2071
// Loop quadrature points for integral.
2072
// Number of operations to compute element tensor for following IP loop = 240
2073
for (unsigned int ip = 0; ip < 3; ip++)
2076
// Number of operations for primary indices: 80
2077
for (unsigned int j = 0; j < 4; j++)
2079
for (unsigned int k = 0; k < 4; k++)
2081
// Number of operations to compute entry: 5
2082
A[j*4 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*2.0*W3[ip]*det;
2083
}// end loop over 'k'
2084
}// end loop over 'j'
2085
}// end loop over 'ip'
2094
/// This class defines the interface for the tabulation of the
2095
/// interior facet tensor corresponding to the local contribution to
2096
/// a form from the integral over an interior facet.
2098
class subdomains_interior_facet_integral_0_0: public ufc::interior_facet_integral
2103
subdomains_interior_facet_integral_0_0() : ufc::interior_facet_integral()
2109
virtual ~subdomains_interior_facet_integral_0_0()
2114
/// Tabulate the tensor for the contribution from a local interior facet
2115
virtual void tabulate_tensor(double* A,
2116
const double * const * w,
2117
const double* vertex_coordinates_0,
2118
const double* vertex_coordinates_1,
2119
std::size_t facet_0,
2120
std::size_t facet_1) const
2124
compute_jacobian_tetrahedron_3d(J_0, vertex_coordinates_0);
2126
// Compute Jacobian inverse and determinant
2129
compute_jacobian_inverse_tetrahedron_3d(K_0, detJ_0, J_0);
2133
compute_jacobian_tetrahedron_3d(J_1, vertex_coordinates_1);
2135
// Compute Jacobian inverse and determinant
2138
compute_jacobian_inverse_tetrahedron_3d(K_1, detJ_1, J_1);
2142
// Get vertices on face
2143
static unsigned int face_vertices[4][3] = {{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}};
2144
const unsigned int v0 = face_vertices[facet_0][0];
2145
const unsigned int v1 = face_vertices[facet_0][1];
2146
const unsigned int v2 = face_vertices[facet_0][2];
2148
// Compute scale factor (area of face scaled by area of reference triangle)
2149
const double a0 = (vertex_coordinates_0[3*v0 + 1]*vertex_coordinates_0[3*v1 + 2] +
2150
vertex_coordinates_0[3*v0 + 2]*vertex_coordinates_0[3*v2 + 1] +
2151
vertex_coordinates_0[3*v1 + 1]*vertex_coordinates_0[3*v2 + 2]) -
2152
(vertex_coordinates_0[3*v2 + 1]*vertex_coordinates_0[3*v1 + 2] +
2153
vertex_coordinates_0[3*v2 + 2]*vertex_coordinates_0[3*v0 + 1] +
2154
vertex_coordinates_0[3*v1 + 1]*vertex_coordinates_0[3*v0 + 2]);
2156
const double a1 = (vertex_coordinates_0[3*v0 + 2]*vertex_coordinates_0[3*v1 + 0] +
2157
vertex_coordinates_0[3*v0 + 0]*vertex_coordinates_0[3*v2 + 2] +
2158
vertex_coordinates_0[3*v1 + 2]*vertex_coordinates_0[3*v2 + 0]) -
2159
(vertex_coordinates_0[3*v2 + 2]*vertex_coordinates_0[3*v1 + 0] +
2160
vertex_coordinates_0[3*v2 + 0]*vertex_coordinates_0[3*v0 + 2] +
2161
vertex_coordinates_0[3*v1 + 2]*vertex_coordinates_0[3*v0 + 0]);
2163
const double a2 = (vertex_coordinates_0[3*v0 + 0]*vertex_coordinates_0[3*v1 + 1] +
2164
vertex_coordinates_0[3*v0 + 1]*vertex_coordinates_0[3*v2 + 0] +
2165
vertex_coordinates_0[3*v1 + 0]*vertex_coordinates_0[3*v2 + 1]) -
2166
(vertex_coordinates_0[3*v2 + 0]*vertex_coordinates_0[3*v1 + 1] +
2167
vertex_coordinates_0[3*v2 + 1]*vertex_coordinates_0[3*v0 + 0] +
2168
vertex_coordinates_0[3*v1 + 0]*vertex_coordinates_0[3*v0 + 1]);
2170
const double det = std::sqrt(a0*a0 + a1*a1 + a2*a2);
2177
// Compute circumradius
2181
// Facet area (divide by two because 'det' is scaled by area of reference triangle)
2183
// Array of quadrature weights.
2184
static const double W3[3] = {0.16666667, 0.16666667, 0.16666667};
2185
// Quadrature points on the UFC reference element: (0.16666667, 0.16666667), (0.16666667, 0.66666667), (0.66666667, 0.16666667)
2187
// Value of basis functions at quadrature points.
2188
static const double FE0_f0[3][4] = \
2189
{{0.0, 0.66666667, 0.16666667, 0.16666667},
2190
{0.0, 0.16666667, 0.16666667, 0.66666667},
2191
{0.0, 0.16666667, 0.66666667, 0.16666667}};
2193
static const double FE0_f1[3][4] = \
2194
{{0.66666667, 0.0, 0.16666667, 0.16666667},
2195
{0.16666667, 0.0, 0.16666667, 0.66666667},
2196
{0.16666667, 0.0, 0.66666667, 0.16666667}};
2198
static const double FE0_f2[3][4] = \
2199
{{0.66666667, 0.16666667, 0.0, 0.16666667},
2200
{0.16666667, 0.16666667, 0.0, 0.66666667},
2201
{0.16666667, 0.66666667, 0.0, 0.16666667}};
2203
static const double FE0_f3[3][4] = \
2204
{{0.66666667, 0.16666667, 0.16666667, 0.0},
2205
{0.16666667, 0.16666667, 0.66666667, 0.0},
2206
{0.16666667, 0.66666667, 0.16666667, 0.0}};
2208
// Reset values in the element tensor.
2209
for (unsigned int r = 0; r < 64; r++)
2212
}// end loop over 'r'
2214
// Compute element tensor using UFL quadrature representation
2215
// Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
2224
// Total number of operations to compute element tensor (from this point): 192
2226
// Loop quadrature points for integral.
2227
// Number of operations to compute element tensor for following IP loop = 192
2228
for (unsigned int ip = 0; ip < 3; ip++)
2231
// Number of operations for primary indices: 64
2232
for (unsigned int j = 0; j < 4; j++)
2234
for (unsigned int k = 0; k < 4; k++)
2236
// Number of operations to compute entry: 4
2237
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*W3[ip]*det;
2238
}// end loop over 'k'
2239
}// end loop over 'j'
2240
}// end loop over 'ip'
2245
// Total number of operations to compute element tensor (from this point): 192
2247
// Loop quadrature points for integral.
2248
// Number of operations to compute element tensor for following IP loop = 192
2249
for (unsigned int ip = 0; ip < 3; ip++)
2252
// Number of operations for primary indices: 64
2253
for (unsigned int j = 0; j < 4; j++)
2255
for (unsigned int k = 0; k < 4; k++)
2257
// Number of operations to compute entry: 4
2258
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*W3[ip]*det;
2259
}// end loop over 'k'
2260
}// end loop over 'j'
2261
}// end loop over 'ip'
2266
// Total number of operations to compute element tensor (from this point): 192
2268
// Loop quadrature points for integral.
2269
// Number of operations to compute element tensor for following IP loop = 192
2270
for (unsigned int ip = 0; ip < 3; ip++)
2273
// Number of operations for primary indices: 64
2274
for (unsigned int j = 0; j < 4; j++)
2276
for (unsigned int k = 0; k < 4; k++)
2278
// Number of operations to compute entry: 4
2279
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*W3[ip]*det;
2280
}// end loop over 'k'
2281
}// end loop over 'j'
2282
}// end loop over 'ip'
2287
// Total number of operations to compute element tensor (from this point): 192
2289
// Loop quadrature points for integral.
2290
// Number of operations to compute element tensor for following IP loop = 192
2291
for (unsigned int ip = 0; ip < 3; ip++)
2294
// Number of operations for primary indices: 64
2295
for (unsigned int j = 0; j < 4; j++)
2297
for (unsigned int k = 0; k < 4; k++)
2299
// Number of operations to compute entry: 4
2300
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*W3[ip]*det;
2301
}// end loop over 'k'
2302
}// end loop over 'j'
2303
}// end loop over 'ip'
2316
// Total number of operations to compute element tensor (from this point): 192
2318
// Loop quadrature points for integral.
2319
// Number of operations to compute element tensor for following IP loop = 192
2320
for (unsigned int ip = 0; ip < 3; ip++)
2323
// Number of operations for primary indices: 64
2324
for (unsigned int j = 0; j < 4; j++)
2326
for (unsigned int k = 0; k < 4; k++)
2328
// Number of operations to compute entry: 4
2329
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*W3[ip]*det;
2330
}// end loop over 'k'
2331
}// end loop over 'j'
2332
}// end loop over 'ip'
2337
// Total number of operations to compute element tensor (from this point): 192
2339
// Loop quadrature points for integral.
2340
// Number of operations to compute element tensor for following IP loop = 192
2341
for (unsigned int ip = 0; ip < 3; ip++)
2344
// Number of operations for primary indices: 64
2345
for (unsigned int j = 0; j < 4; j++)
2347
for (unsigned int k = 0; k < 4; k++)
2349
// Number of operations to compute entry: 4
2350
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*W3[ip]*det;
2351
}// end loop over 'k'
2352
}// end loop over 'j'
2353
}// end loop over 'ip'
2358
// Total number of operations to compute element tensor (from this point): 192
2360
// Loop quadrature points for integral.
2361
// Number of operations to compute element tensor for following IP loop = 192
2362
for (unsigned int ip = 0; ip < 3; ip++)
2365
// Number of operations for primary indices: 64
2366
for (unsigned int j = 0; j < 4; j++)
2368
for (unsigned int k = 0; k < 4; k++)
2370
// Number of operations to compute entry: 4
2371
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*W3[ip]*det;
2372
}// end loop over 'k'
2373
}// end loop over 'j'
2374
}// end loop over 'ip'
2379
// Total number of operations to compute element tensor (from this point): 192
2381
// Loop quadrature points for integral.
2382
// Number of operations to compute element tensor for following IP loop = 192
2383
for (unsigned int ip = 0; ip < 3; ip++)
2386
// Number of operations for primary indices: 64
2387
for (unsigned int j = 0; j < 4; j++)
2389
for (unsigned int k = 0; k < 4; k++)
2391
// Number of operations to compute entry: 4
2392
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*W3[ip]*det;
2393
}// end loop over 'k'
2394
}// end loop over 'j'
2395
}// end loop over 'ip'
2408
// Total number of operations to compute element tensor (from this point): 192
2410
// Loop quadrature points for integral.
2411
// Number of operations to compute element tensor for following IP loop = 192
2412
for (unsigned int ip = 0; ip < 3; ip++)
2415
// Number of operations for primary indices: 64
2416
for (unsigned int j = 0; j < 4; j++)
2418
for (unsigned int k = 0; k < 4; k++)
2420
// Number of operations to compute entry: 4
2421
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*W3[ip]*det;
2422
}// end loop over 'k'
2423
}// end loop over 'j'
2424
}// end loop over 'ip'
2429
// Total number of operations to compute element tensor (from this point): 192
2431
// Loop quadrature points for integral.
2432
// Number of operations to compute element tensor for following IP loop = 192
2433
for (unsigned int ip = 0; ip < 3; ip++)
2436
// Number of operations for primary indices: 64
2437
for (unsigned int j = 0; j < 4; j++)
2439
for (unsigned int k = 0; k < 4; k++)
2441
// Number of operations to compute entry: 4
2442
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*W3[ip]*det;
2443
}// end loop over 'k'
2444
}// end loop over 'j'
2445
}// end loop over 'ip'
2450
// Total number of operations to compute element tensor (from this point): 192
2452
// Loop quadrature points for integral.
2453
// Number of operations to compute element tensor for following IP loop = 192
2454
for (unsigned int ip = 0; ip < 3; ip++)
2457
// Number of operations for primary indices: 64
2458
for (unsigned int j = 0; j < 4; j++)
2460
for (unsigned int k = 0; k < 4; k++)
2462
// Number of operations to compute entry: 4
2463
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*W3[ip]*det;
2464
}// end loop over 'k'
2465
}// end loop over 'j'
2466
}// end loop over 'ip'
2471
// Total number of operations to compute element tensor (from this point): 192
2473
// Loop quadrature points for integral.
2474
// Number of operations to compute element tensor for following IP loop = 192
2475
for (unsigned int ip = 0; ip < 3; ip++)
2478
// Number of operations for primary indices: 64
2479
for (unsigned int j = 0; j < 4; j++)
2481
for (unsigned int k = 0; k < 4; k++)
2483
// Number of operations to compute entry: 4
2484
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*W3[ip]*det;
2485
}// end loop over 'k'
2486
}// end loop over 'j'
2487
}// end loop over 'ip'
2500
// Total number of operations to compute element tensor (from this point): 192
2502
// Loop quadrature points for integral.
2503
// Number of operations to compute element tensor for following IP loop = 192
2504
for (unsigned int ip = 0; ip < 3; ip++)
2507
// Number of operations for primary indices: 64
2508
for (unsigned int j = 0; j < 4; j++)
2510
for (unsigned int k = 0; k < 4; k++)
2512
// Number of operations to compute entry: 4
2513
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*W3[ip]*det;
2514
}// end loop over 'k'
2515
}// end loop over 'j'
2516
}// end loop over 'ip'
2521
// Total number of operations to compute element tensor (from this point): 192
2523
// Loop quadrature points for integral.
2524
// Number of operations to compute element tensor for following IP loop = 192
2525
for (unsigned int ip = 0; ip < 3; ip++)
2528
// Number of operations for primary indices: 64
2529
for (unsigned int j = 0; j < 4; j++)
2531
for (unsigned int k = 0; k < 4; k++)
2533
// Number of operations to compute entry: 4
2534
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*W3[ip]*det;
2535
}// end loop over 'k'
2536
}// end loop over 'j'
2537
}// end loop over 'ip'
2542
// Total number of operations to compute element tensor (from this point): 192
2544
// Loop quadrature points for integral.
2545
// Number of operations to compute element tensor for following IP loop = 192
2546
for (unsigned int ip = 0; ip < 3; ip++)
2549
// Number of operations for primary indices: 64
2550
for (unsigned int j = 0; j < 4; j++)
2552
for (unsigned int k = 0; k < 4; k++)
2554
// Number of operations to compute entry: 4
2555
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*W3[ip]*det;
2556
}// end loop over 'k'
2557
}// end loop over 'j'
2558
}// end loop over 'ip'
2563
// Total number of operations to compute element tensor (from this point): 192
2565
// Loop quadrature points for integral.
2566
// Number of operations to compute element tensor for following IP loop = 192
2567
for (unsigned int ip = 0; ip < 3; ip++)
2570
// Number of operations for primary indices: 64
2571
for (unsigned int j = 0; j < 4; j++)
2573
for (unsigned int k = 0; k < 4; k++)
2575
// Number of operations to compute entry: 4
2576
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*W3[ip]*det;
2577
}// end loop over 'k'
2578
}// end loop over 'j'
2579
}// end loop over 'ip'
2592
/// This class defines the interface for the tabulation of the
2593
/// interior facet tensor corresponding to the local contribution to
2594
/// a form from the integral over an interior facet.
2596
class subdomains_interior_facet_integral_0_1: public ufc::interior_facet_integral
2601
subdomains_interior_facet_integral_0_1() : ufc::interior_facet_integral()
2607
virtual ~subdomains_interior_facet_integral_0_1()
2612
/// Tabulate the tensor for the contribution from a local interior facet
2613
virtual void tabulate_tensor(double* A,
2614
const double * const * w,
2615
const double* vertex_coordinates_0,
2616
const double* vertex_coordinates_1,
2617
std::size_t facet_0,
2618
std::size_t facet_1) const
2622
compute_jacobian_tetrahedron_3d(J_0, vertex_coordinates_0);
2624
// Compute Jacobian inverse and determinant
2627
compute_jacobian_inverse_tetrahedron_3d(K_0, detJ_0, J_0);
2631
compute_jacobian_tetrahedron_3d(J_1, vertex_coordinates_1);
2633
// Compute Jacobian inverse and determinant
2636
compute_jacobian_inverse_tetrahedron_3d(K_1, detJ_1, J_1);
2640
// Get vertices on face
2641
static unsigned int face_vertices[4][3] = {{1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}};
2642
const unsigned int v0 = face_vertices[facet_0][0];
2643
const unsigned int v1 = face_vertices[facet_0][1];
2644
const unsigned int v2 = face_vertices[facet_0][2];
2646
// Compute scale factor (area of face scaled by area of reference triangle)
2647
const double a0 = (vertex_coordinates_0[3*v0 + 1]*vertex_coordinates_0[3*v1 + 2] +
2648
vertex_coordinates_0[3*v0 + 2]*vertex_coordinates_0[3*v2 + 1] +
2649
vertex_coordinates_0[3*v1 + 1]*vertex_coordinates_0[3*v2 + 2]) -
2650
(vertex_coordinates_0[3*v2 + 1]*vertex_coordinates_0[3*v1 + 2] +
2651
vertex_coordinates_0[3*v2 + 2]*vertex_coordinates_0[3*v0 + 1] +
2652
vertex_coordinates_0[3*v1 + 1]*vertex_coordinates_0[3*v0 + 2]);
2654
const double a1 = (vertex_coordinates_0[3*v0 + 2]*vertex_coordinates_0[3*v1 + 0] +
2655
vertex_coordinates_0[3*v0 + 0]*vertex_coordinates_0[3*v2 + 2] +
2656
vertex_coordinates_0[3*v1 + 2]*vertex_coordinates_0[3*v2 + 0]) -
2657
(vertex_coordinates_0[3*v2 + 2]*vertex_coordinates_0[3*v1 + 0] +
2658
vertex_coordinates_0[3*v2 + 0]*vertex_coordinates_0[3*v0 + 2] +
2659
vertex_coordinates_0[3*v1 + 2]*vertex_coordinates_0[3*v0 + 0]);
2661
const double a2 = (vertex_coordinates_0[3*v0 + 0]*vertex_coordinates_0[3*v1 + 1] +
2662
vertex_coordinates_0[3*v0 + 1]*vertex_coordinates_0[3*v2 + 0] +
2663
vertex_coordinates_0[3*v1 + 0]*vertex_coordinates_0[3*v2 + 1]) -
2664
(vertex_coordinates_0[3*v2 + 0]*vertex_coordinates_0[3*v1 + 1] +
2665
vertex_coordinates_0[3*v2 + 1]*vertex_coordinates_0[3*v0 + 0] +
2666
vertex_coordinates_0[3*v1 + 0]*vertex_coordinates_0[3*v0 + 1]);
2668
const double det = std::sqrt(a0*a0 + a1*a1 + a2*a2);
2675
// Compute circumradius
2679
// Facet area (divide by two because 'det' is scaled by area of reference triangle)
2681
// Array of quadrature weights.
2682
static const double W3[3] = {0.16666667, 0.16666667, 0.16666667};
2683
// Quadrature points on the UFC reference element: (0.16666667, 0.16666667), (0.16666667, 0.66666667), (0.66666667, 0.16666667)
2685
// Value of basis functions at quadrature points.
2686
static const double FE0_f0[3][4] = \
2687
{{0.0, 0.66666667, 0.16666667, 0.16666667},
2688
{0.0, 0.16666667, 0.16666667, 0.66666667},
2689
{0.0, 0.16666667, 0.66666667, 0.16666667}};
2691
static const double FE0_f1[3][4] = \
2692
{{0.66666667, 0.0, 0.16666667, 0.16666667},
2693
{0.16666667, 0.0, 0.16666667, 0.66666667},
2694
{0.16666667, 0.0, 0.66666667, 0.16666667}};
2696
static const double FE0_f2[3][4] = \
2697
{{0.66666667, 0.16666667, 0.0, 0.16666667},
2698
{0.16666667, 0.16666667, 0.0, 0.66666667},
2699
{0.16666667, 0.66666667, 0.0, 0.16666667}};
2701
static const double FE0_f3[3][4] = \
2702
{{0.66666667, 0.16666667, 0.16666667, 0.0},
2703
{0.16666667, 0.16666667, 0.66666667, 0.0},
2704
{0.16666667, 0.66666667, 0.16666667, 0.0}};
2706
// Reset values in the element tensor.
2707
for (unsigned int r = 0; r < 64; r++)
2710
}// end loop over 'r'
2712
// Compute element tensor using UFL quadrature representation
2713
// Optimisations: ('eliminate zeros', False), ('ignore ones', False), ('ignore zero tables', False), ('optimisation', False), ('remove zero terms', False)
2722
// Total number of operations to compute element tensor (from this point): 240
2724
// Loop quadrature points for integral.
2725
// Number of operations to compute element tensor for following IP loop = 240
2726
for (unsigned int ip = 0; ip < 3; ip++)
2729
// Number of operations for primary indices: 80
2730
for (unsigned int j = 0; j < 4; j++)
2732
for (unsigned int k = 0; k < 4; k++)
2734
// Number of operations to compute entry: 5
2735
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*4.3*W3[ip]*det;
2736
}// end loop over 'k'
2737
}// end loop over 'j'
2738
}// end loop over 'ip'
2743
// Total number of operations to compute element tensor (from this point): 240
2745
// Loop quadrature points for integral.
2746
// Number of operations to compute element tensor for following IP loop = 240
2747
for (unsigned int ip = 0; ip < 3; ip++)
2750
// Number of operations for primary indices: 80
2751
for (unsigned int j = 0; j < 4; j++)
2753
for (unsigned int k = 0; k < 4; k++)
2755
// Number of operations to compute entry: 5
2756
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*4.3*W3[ip]*det;
2757
}// end loop over 'k'
2758
}// end loop over 'j'
2759
}// end loop over 'ip'
2764
// Total number of operations to compute element tensor (from this point): 240
2766
// Loop quadrature points for integral.
2767
// Number of operations to compute element tensor for following IP loop = 240
2768
for (unsigned int ip = 0; ip < 3; ip++)
2771
// Number of operations for primary indices: 80
2772
for (unsigned int j = 0; j < 4; j++)
2774
for (unsigned int k = 0; k < 4; k++)
2776
// Number of operations to compute entry: 5
2777
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*4.3*W3[ip]*det;
2778
}// end loop over 'k'
2779
}// end loop over 'j'
2780
}// end loop over 'ip'
2785
// Total number of operations to compute element tensor (from this point): 240
2787
// Loop quadrature points for integral.
2788
// Number of operations to compute element tensor for following IP loop = 240
2789
for (unsigned int ip = 0; ip < 3; ip++)
2792
// Number of operations for primary indices: 80
2793
for (unsigned int j = 0; j < 4; j++)
2795
for (unsigned int k = 0; k < 4; k++)
2797
// Number of operations to compute entry: 5
2798
A[j*8 + k] += FE0_f0[ip][j]*FE0_f0[ip][k]*4.3*W3[ip]*det;
2799
}// end loop over 'k'
2800
}// end loop over 'j'
2801
}// end loop over 'ip'
2814
// Total number of operations to compute element tensor (from this point): 240
2816
// Loop quadrature points for integral.
2817
// Number of operations to compute element tensor for following IP loop = 240
2818
for (unsigned int ip = 0; ip < 3; ip++)
2821
// Number of operations for primary indices: 80
2822
for (unsigned int j = 0; j < 4; j++)
2824
for (unsigned int k = 0; k < 4; k++)
2826
// Number of operations to compute entry: 5
2827
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*4.3*W3[ip]*det;
2828
}// end loop over 'k'
2829
}// end loop over 'j'
2830
}// end loop over 'ip'
2835
// Total number of operations to compute element tensor (from this point): 240
2837
// Loop quadrature points for integral.
2838
// Number of operations to compute element tensor for following IP loop = 240
2839
for (unsigned int ip = 0; ip < 3; ip++)
2842
// Number of operations for primary indices: 80
2843
for (unsigned int j = 0; j < 4; j++)
2845
for (unsigned int k = 0; k < 4; k++)
2847
// Number of operations to compute entry: 5
2848
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*4.3*W3[ip]*det;
2849
}// end loop over 'k'
2850
}// end loop over 'j'
2851
}// end loop over 'ip'
2856
// Total number of operations to compute element tensor (from this point): 240
2858
// Loop quadrature points for integral.
2859
// Number of operations to compute element tensor for following IP loop = 240
2860
for (unsigned int ip = 0; ip < 3; ip++)
2863
// Number of operations for primary indices: 80
2864
for (unsigned int j = 0; j < 4; j++)
2866
for (unsigned int k = 0; k < 4; k++)
2868
// Number of operations to compute entry: 5
2869
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*4.3*W3[ip]*det;
2870
}// end loop over 'k'
2871
}// end loop over 'j'
2872
}// end loop over 'ip'
2877
// Total number of operations to compute element tensor (from this point): 240
2879
// Loop quadrature points for integral.
2880
// Number of operations to compute element tensor for following IP loop = 240
2881
for (unsigned int ip = 0; ip < 3; ip++)
2884
// Number of operations for primary indices: 80
2885
for (unsigned int j = 0; j < 4; j++)
2887
for (unsigned int k = 0; k < 4; k++)
2889
// Number of operations to compute entry: 5
2890
A[j*8 + k] += FE0_f1[ip][j]*FE0_f1[ip][k]*4.3*W3[ip]*det;
2891
}// end loop over 'k'
2892
}// end loop over 'j'
2893
}// end loop over 'ip'
2906
// Total number of operations to compute element tensor (from this point): 240
2908
// Loop quadrature points for integral.
2909
// Number of operations to compute element tensor for following IP loop = 240
2910
for (unsigned int ip = 0; ip < 3; ip++)
2913
// Number of operations for primary indices: 80
2914
for (unsigned int j = 0; j < 4; j++)
2916
for (unsigned int k = 0; k < 4; k++)
2918
// Number of operations to compute entry: 5
2919
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*4.3*W3[ip]*det;
2920
}// end loop over 'k'
2921
}// end loop over 'j'
2922
}// end loop over 'ip'
2927
// Total number of operations to compute element tensor (from this point): 240
2929
// Loop quadrature points for integral.
2930
// Number of operations to compute element tensor for following IP loop = 240
2931
for (unsigned int ip = 0; ip < 3; ip++)
2934
// Number of operations for primary indices: 80
2935
for (unsigned int j = 0; j < 4; j++)
2937
for (unsigned int k = 0; k < 4; k++)
2939
// Number of operations to compute entry: 5
2940
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*4.3*W3[ip]*det;
2941
}// end loop over 'k'
2942
}// end loop over 'j'
2943
}// end loop over 'ip'
2948
// Total number of operations to compute element tensor (from this point): 240
2950
// Loop quadrature points for integral.
2951
// Number of operations to compute element tensor for following IP loop = 240
2952
for (unsigned int ip = 0; ip < 3; ip++)
2955
// Number of operations for primary indices: 80
2956
for (unsigned int j = 0; j < 4; j++)
2958
for (unsigned int k = 0; k < 4; k++)
2960
// Number of operations to compute entry: 5
2961
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*4.3*W3[ip]*det;
2962
}// end loop over 'k'
2963
}// end loop over 'j'
2964
}// end loop over 'ip'
2969
// Total number of operations to compute element tensor (from this point): 240
2971
// Loop quadrature points for integral.
2972
// Number of operations to compute element tensor for following IP loop = 240
2973
for (unsigned int ip = 0; ip < 3; ip++)
2976
// Number of operations for primary indices: 80
2977
for (unsigned int j = 0; j < 4; j++)
2979
for (unsigned int k = 0; k < 4; k++)
2981
// Number of operations to compute entry: 5
2982
A[j*8 + k] += FE0_f2[ip][j]*FE0_f2[ip][k]*4.3*W3[ip]*det;
2983
}// end loop over 'k'
2984
}// end loop over 'j'
2985
}// end loop over 'ip'
2998
// Total number of operations to compute element tensor (from this point): 240
3000
// Loop quadrature points for integral.
3001
// Number of operations to compute element tensor for following IP loop = 240
3002
for (unsigned int ip = 0; ip < 3; ip++)
3005
// Number of operations for primary indices: 80
3006
for (unsigned int j = 0; j < 4; j++)
3008
for (unsigned int k = 0; k < 4; k++)
3010
// Number of operations to compute entry: 5
3011
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*4.3*W3[ip]*det;
3012
}// end loop over 'k'
3013
}// end loop over 'j'
3014
}// end loop over 'ip'
3019
// Total number of operations to compute element tensor (from this point): 240
3021
// Loop quadrature points for integral.
3022
// Number of operations to compute element tensor for following IP loop = 240
3023
for (unsigned int ip = 0; ip < 3; ip++)
3026
// Number of operations for primary indices: 80
3027
for (unsigned int j = 0; j < 4; j++)
3029
for (unsigned int k = 0; k < 4; k++)
3031
// Number of operations to compute entry: 5
3032
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*4.3*W3[ip]*det;
3033
}// end loop over 'k'
3034
}// end loop over 'j'
3035
}// end loop over 'ip'
3040
// Total number of operations to compute element tensor (from this point): 240
3042
// Loop quadrature points for integral.
3043
// Number of operations to compute element tensor for following IP loop = 240
3044
for (unsigned int ip = 0; ip < 3; ip++)
3047
// Number of operations for primary indices: 80
3048
for (unsigned int j = 0; j < 4; j++)
3050
for (unsigned int k = 0; k < 4; k++)
3052
// Number of operations to compute entry: 5
3053
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*4.3*W3[ip]*det;
3054
}// end loop over 'k'
3055
}// end loop over 'j'
3056
}// end loop over 'ip'
3061
// Total number of operations to compute element tensor (from this point): 240
3063
// Loop quadrature points for integral.
3064
// Number of operations to compute element tensor for following IP loop = 240
3065
for (unsigned int ip = 0; ip < 3; ip++)
3068
// Number of operations for primary indices: 80
3069
for (unsigned int j = 0; j < 4; j++)
3071
for (unsigned int k = 0; k < 4; k++)
3073
// Number of operations to compute entry: 5
3074
A[j*8 + k] += FE0_f3[ip][j]*FE0_f3[ip][k]*4.3*W3[ip]*det;
3075
}// end loop over 'k'
3076
}// end loop over 'j'
3077
}// end loop over 'ip'
3090
/// This class defines the interface for the assembly of the global
3091
/// tensor corresponding to a form with r + n arguments, that is, a
3094
/// a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R
3096
/// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r
3097
/// global tensor A is defined by
3099
/// A = a(V1, V2, ..., Vr, w1, w2, ..., wn),
3101
/// where each argument Vj represents the application to the
3102
/// sequence of basis functions of Vj and w1, w2, ..., wn are given
3103
/// fixed functions (coefficients).
3105
class subdomains_form_0: public ufc::form
3110
subdomains_form_0() : ufc::form()
3116
virtual ~subdomains_form_0()
3121
/// Return a string identifying the form
3122
virtual const char* signature() const
3124
return "c17952b2c83838426100f76fe740de69b4b0acc30c1cf7c0abf689d75fa9f6b364394b545ddedf4e00bc21ea5627667ed0af863ea861afa2923937668979ab82";
3127
/// Return the rank of the global tensor (r)
3128
virtual std::size_t rank() const
3133
/// Return the number of coefficients (n)
3134
virtual std::size_t num_coefficients() const
3139
/// Return the number of cell domains
3140
virtual std::size_t num_cell_domains() const
3145
/// Return the number of exterior facet domains
3146
virtual std::size_t num_exterior_facet_domains() const
3151
/// Return the number of interior facet domains
3152
virtual std::size_t num_interior_facet_domains() const
3157
/// Return the number of point domains
3158
virtual std::size_t num_point_domains() const
3163
/// Return whether the form has any cell integrals
3164
virtual bool has_cell_integrals() const
3169
/// Return whether the form has any exterior facet integrals
3170
virtual bool has_exterior_facet_integrals() const
3175
/// Return whether the form has any interior facet integrals
3176
virtual bool has_interior_facet_integrals() const
3181
/// Return whether the form has any point integrals
3182
virtual bool has_point_integrals() const
3187
/// Create a new finite element for argument function i
3188
virtual ufc::finite_element* create_finite_element(std::size_t i) const
3194
return new subdomains_finite_element_0();
3199
return new subdomains_finite_element_0();
3207
/// Create a new dofmap for argument function i
3208
virtual ufc::dofmap* create_dofmap(std::size_t i) const
3214
return new subdomains_dofmap_0();
3219
return new subdomains_dofmap_0();
3227
/// Create a new cell integral on sub domain i
3228
virtual ufc::cell_integral* create_cell_integral(std::size_t i) const
3234
return new subdomains_cell_integral_0_0();
3239
return new subdomains_cell_integral_0_1();
3247
/// Create a new exterior facet integral on sub domain i
3248
virtual ufc::exterior_facet_integral* create_exterior_facet_integral(std::size_t i) const
3254
return new subdomains_exterior_facet_integral_0_0();
3259
return new subdomains_exterior_facet_integral_0_1();
3267
/// Create a new interior facet integral on sub domain i
3268
virtual ufc::interior_facet_integral* create_interior_facet_integral(std::size_t i) const
3274
return new subdomains_interior_facet_integral_0_0();
3279
return new subdomains_interior_facet_integral_0_1();
3287
/// Create a new point integral on sub domain i
3288
virtual ufc::point_integral* create_point_integral(std::size_t i) const
3293
/// Create a new cell integral on everywhere else
3294
virtual ufc::cell_integral* create_default_cell_integral() const
3299
/// Create a new exterior facet integral on everywhere else
3300
virtual ufc::exterior_facet_integral* create_default_exterior_facet_integral() const
3305
/// Create a new interior facet integral on everywhere else
3306
virtual ufc::interior_facet_integral* create_default_interior_facet_integral() const
3311
/// Create a new point integral on everywhere else
3312
virtual ufc::point_integral* create_default_point_integral() const