367
1227
values[r] = 0.00000000;
368
1228
}// end loop over 'r'
370
// Map degree of freedom to element degree of freedom
371
const unsigned int dof = i;
373
// Array of basisvalues.
374
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
376
// Declare helper variables.
380
double tmp5 = 0.00000000;
381
double tmp6 = 0.00000000;
382
double tmp7 = 0.00000000;
383
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
384
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
385
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
386
double tmp3 = 0.50000000*(1.00000000 - Z);
387
double tmp4 = tmp3*tmp3;
389
// Compute basisvalues.
390
basisvalues[0] = 1.00000000;
391
basisvalues[1] = tmp0;
392
for (unsigned int r = 1; r < 2; r++)
394
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
395
ss = r*(r + 1)*(r + 2)/6;
396
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
397
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
398
}// end loop over 'r'
399
for (unsigned int r = 0; r < 2; r++)
401
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
402
ss = r*(r + 1)*(r + 2)/6;
403
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
404
}// end loop over 'r'
405
for (unsigned int r = 0; r < 1; r++)
407
for (unsigned int s = 1; s < 2 - r; s++)
409
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
410
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
411
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
412
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
413
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
414
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
415
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
416
}// end loop over 's'
417
}// end loop over 'r'
418
for (unsigned int r = 0; r < 2; r++)
420
for (unsigned int s = 0; s < 2 - r; s++)
422
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
423
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
424
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
425
}// end loop over 's'
426
}// end loop over 'r'
427
for (unsigned int r = 0; r < 1; r++)
429
for (unsigned int s = 0; s < 1 - r; s++)
431
for (unsigned int t = 1; t < 2 - r - s; t++)
433
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
434
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
435
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
436
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
437
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
438
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
439
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
440
}// end loop over 't'
441
}// end loop over 's'
442
}// end loop over 'r'
443
for (unsigned int r = 0; r < 3; r++)
445
for (unsigned int s = 0; s < 3 - r; s++)
447
for (unsigned int t = 0; t < 3 - r - s; t++)
449
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
450
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
451
}// end loop over 't'
452
}// end loop over 's'
453
}// end loop over 'r'
455
// Table(s) of coefficients.
456
static const double coefficients0[10][10] = \
457
{{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
458
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
459
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
460
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
461
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
462
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
463
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
464
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
465
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
466
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
468
// Tables of derivatives of the polynomial base (transpose).
469
static const double dmats0[10][10] = \
470
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
471
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
472
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
473
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
474
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
475
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
476
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
477
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
478
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
479
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
481
static const double dmats1[10][10] = \
482
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
483
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
484
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
485
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
486
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
487
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
488
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
489
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
490
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
491
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
493
static const double dmats2[10][10] = \
494
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
495
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
496
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
497
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
498
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
499
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
500
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
501
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
502
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
503
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
505
// Compute reference derivatives.
506
// Declare pointer to array of derivatives on FIAT element.
507
double *derivatives = new double[num_derivatives];
508
for (unsigned int r = 0; r < num_derivatives; r++)
510
derivatives[r] = 0.00000000;
511
}// end loop over 'r'
513
// Declare derivative matrix (of polynomial basis).
514
double dmats[10][10] = \
515
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
516
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
517
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
518
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
519
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
520
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
521
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
522
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
523
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
524
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
526
// Declare (auxiliary) derivative matrix (of polynomial basis).
527
double dmats_old[10][10] = \
528
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
529
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
530
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
531
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
532
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
533
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
534
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
535
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
536
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
537
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
539
// Loop possible derivatives.
540
for (unsigned int r = 0; r < num_derivatives; r++)
542
// Resetting dmats values to compute next derivative.
543
for (unsigned int t = 0; t < 10; t++)
545
for (unsigned int u = 0; u < 10; u++)
547
dmats[t][u] = 0.00000000;
550
dmats[t][u] = 1.00000000;
553
}// end loop over 'u'
554
}// end loop over 't'
556
// Looping derivative order to generate dmats.
557
for (unsigned int s = 0; s < n; s++)
559
// Updating dmats_old with new values and resetting dmats.
560
for (unsigned int t = 0; t < 10; t++)
562
for (unsigned int u = 0; u < 10; u++)
564
dmats_old[t][u] = dmats[t][u];
565
dmats[t][u] = 0.00000000;
566
}// end loop over 'u'
567
}// end loop over 't'
569
// Update dmats using an inner product.
570
if (combinations[r][s] == 0)
572
for (unsigned int t = 0; t < 10; t++)
574
for (unsigned int u = 0; u < 10; u++)
576
for (unsigned int tu = 0; tu < 10; tu++)
578
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
579
}// end loop over 'tu'
580
}// end loop over 'u'
581
}// end loop over 't'
584
if (combinations[r][s] == 1)
586
for (unsigned int t = 0; t < 10; t++)
588
for (unsigned int u = 0; u < 10; u++)
590
for (unsigned int tu = 0; tu < 10; tu++)
592
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
593
}// end loop over 'tu'
594
}// end loop over 'u'
595
}// end loop over 't'
598
if (combinations[r][s] == 2)
600
for (unsigned int t = 0; t < 10; t++)
602
for (unsigned int u = 0; u < 10; u++)
604
for (unsigned int tu = 0; tu < 10; tu++)
606
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
607
}// end loop over 'tu'
608
}// end loop over 'u'
609
}// end loop over 't'
612
}// end loop over 's'
613
for (unsigned int s = 0; s < 10; s++)
615
for (unsigned int t = 0; t < 10; t++)
617
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
618
}// end loop over 't'
619
}// end loop over 's'
620
}// end loop over 'r'
622
// Transform derivatives back to physical element
623
for (unsigned int r = 0; r < num_derivatives; r++)
625
for (unsigned int s = 0; s < num_derivatives; s++)
627
values[r] += transform[r][s]*derivatives[s];
628
}// end loop over 's'
629
}// end loop over 'r'
631
// Delete pointer to array of derivatives on FIAT element
632
delete [] derivatives;
634
// Delete pointer to array of combinations of derivatives and transform
635
for (unsigned int r = 0; r < num_derivatives; r++)
637
delete [] combinations[r];
638
}// end loop over 'r'
639
delete [] combinations;
640
for (unsigned int r = 0; r < num_derivatives; r++)
642
delete [] transform[r];
643
}// end loop over 'r'
1235
// Array of basisvalues.
1236
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1238
// Declare helper variables.
1239
unsigned int rr = 0;
1240
unsigned int ss = 0;
1241
unsigned int tt = 0;
1242
double tmp5 = 0.00000000;
1243
double tmp6 = 0.00000000;
1244
double tmp7 = 0.00000000;
1245
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1246
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1247
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1248
double tmp3 = 0.50000000*(1.00000000 - Z);
1249
double tmp4 = tmp3*tmp3;
1251
// Compute basisvalues.
1252
basisvalues[0] = 1.00000000;
1253
basisvalues[1] = tmp0;
1254
for (unsigned int r = 1; r < 2; r++)
1256
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1257
ss = r*(r + 1)*(r + 2)/6;
1258
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1259
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1260
}// end loop over 'r'
1261
for (unsigned int r = 0; r < 2; r++)
1263
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1264
ss = r*(r + 1)*(r + 2)/6;
1265
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1266
}// end loop over 'r'
1267
for (unsigned int r = 0; r < 1; r++)
1269
for (unsigned int s = 1; s < 2 - r; s++)
1271
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1272
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1273
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1274
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1275
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1276
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1277
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1278
}// end loop over 's'
1279
}// end loop over 'r'
1280
for (unsigned int r = 0; r < 2; r++)
1282
for (unsigned int s = 0; s < 2 - r; s++)
1284
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1285
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1286
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1287
}// end loop over 's'
1288
}// end loop over 'r'
1289
for (unsigned int r = 0; r < 1; r++)
1291
for (unsigned int s = 0; s < 1 - r; s++)
1293
for (unsigned int t = 1; t < 2 - r - s; t++)
1295
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1296
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1297
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1298
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1299
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1300
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1301
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1302
}// end loop over 't'
1303
}// end loop over 's'
1304
}// end loop over 'r'
1305
for (unsigned int r = 0; r < 3; r++)
1307
for (unsigned int s = 0; s < 3 - r; s++)
1309
for (unsigned int t = 0; t < 3 - r - s; t++)
1311
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1312
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1313
}// end loop over 't'
1314
}// end loop over 's'
1315
}// end loop over 'r'
1317
// Table(s) of coefficients.
1318
static const double coefficients0[10] = \
1319
{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
1321
// Tables of derivatives of the polynomial base (transpose).
1322
static const double dmats0[10][10] = \
1323
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1324
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1325
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1326
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1327
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1328
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1329
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1330
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1331
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1332
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1334
static const double dmats1[10][10] = \
1335
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1336
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1337
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1338
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1339
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1340
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1341
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1342
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1343
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1344
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1346
static const double dmats2[10][10] = \
1347
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1348
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1349
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1350
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1351
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1352
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1353
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1354
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1355
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1356
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1358
// Compute reference derivatives.
1359
// Declare pointer to array of derivatives on FIAT element.
1360
double *derivatives = new double[num_derivatives];
1361
for (unsigned int r = 0; r < num_derivatives; r++)
1363
derivatives[r] = 0.00000000;
1364
}// end loop over 'r'
1366
// Declare derivative matrix (of polynomial basis).
1367
double dmats[10][10] = \
1368
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1369
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1370
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1371
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1372
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1373
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1374
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1375
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1376
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1377
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1379
// Declare (auxiliary) derivative matrix (of polynomial basis).
1380
double dmats_old[10][10] = \
1381
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1382
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1383
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1384
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1385
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1386
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1387
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1388
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1389
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1390
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1392
// Loop possible derivatives.
1393
for (unsigned int r = 0; r < num_derivatives; r++)
1395
// Resetting dmats values to compute next derivative.
1396
for (unsigned int t = 0; t < 10; t++)
1398
for (unsigned int u = 0; u < 10; u++)
1400
dmats[t][u] = 0.00000000;
1403
dmats[t][u] = 1.00000000;
1406
}// end loop over 'u'
1407
}// end loop over 't'
1409
// Looping derivative order to generate dmats.
1410
for (unsigned int s = 0; s < n; s++)
1412
// Updating dmats_old with new values and resetting dmats.
1413
for (unsigned int t = 0; t < 10; t++)
1415
for (unsigned int u = 0; u < 10; u++)
1417
dmats_old[t][u] = dmats[t][u];
1418
dmats[t][u] = 0.00000000;
1419
}// end loop over 'u'
1420
}// end loop over 't'
1422
// Update dmats using an inner product.
1423
if (combinations[r][s] == 0)
1425
for (unsigned int t = 0; t < 10; t++)
1427
for (unsigned int u = 0; u < 10; u++)
1429
for (unsigned int tu = 0; tu < 10; tu++)
1431
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1432
}// end loop over 'tu'
1433
}// end loop over 'u'
1434
}// end loop over 't'
1437
if (combinations[r][s] == 1)
1439
for (unsigned int t = 0; t < 10; t++)
1441
for (unsigned int u = 0; u < 10; u++)
1443
for (unsigned int tu = 0; tu < 10; tu++)
1445
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1446
}// end loop over 'tu'
1447
}// end loop over 'u'
1448
}// end loop over 't'
1451
if (combinations[r][s] == 2)
1453
for (unsigned int t = 0; t < 10; t++)
1455
for (unsigned int u = 0; u < 10; u++)
1457
for (unsigned int tu = 0; tu < 10; tu++)
1459
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1460
}// end loop over 'tu'
1461
}// end loop over 'u'
1462
}// end loop over 't'
1465
}// end loop over 's'
1466
for (unsigned int s = 0; s < 10; s++)
1468
for (unsigned int t = 0; t < 10; t++)
1470
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1471
}// end loop over 't'
1472
}// end loop over 's'
1473
}// end loop over 'r'
1475
// Transform derivatives back to physical element
1476
for (unsigned int r = 0; r < num_derivatives; r++)
1478
for (unsigned int s = 0; s < num_derivatives; s++)
1480
values[r] += transform[r][s]*derivatives[s];
1481
}// end loop over 's'
1482
}// end loop over 'r'
1484
// Delete pointer to array of derivatives on FIAT element
1485
delete [] derivatives;
1487
// Delete pointer to array of combinations of derivatives and transform
1488
for (unsigned int r = 0; r < num_derivatives; r++)
1490
delete [] combinations[r];
1491
}// end loop over 'r'
1492
delete [] combinations;
1493
for (unsigned int r = 0; r < num_derivatives; r++)
1495
delete [] transform[r];
1496
}// end loop over 'r'
1497
delete [] transform;
1503
// Array of basisvalues.
1504
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1506
// Declare helper variables.
1507
unsigned int rr = 0;
1508
unsigned int ss = 0;
1509
unsigned int tt = 0;
1510
double tmp5 = 0.00000000;
1511
double tmp6 = 0.00000000;
1512
double tmp7 = 0.00000000;
1513
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1514
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1515
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1516
double tmp3 = 0.50000000*(1.00000000 - Z);
1517
double tmp4 = tmp3*tmp3;
1519
// Compute basisvalues.
1520
basisvalues[0] = 1.00000000;
1521
basisvalues[1] = tmp0;
1522
for (unsigned int r = 1; r < 2; r++)
1524
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1525
ss = r*(r + 1)*(r + 2)/6;
1526
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1527
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1528
}// end loop over 'r'
1529
for (unsigned int r = 0; r < 2; r++)
1531
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1532
ss = r*(r + 1)*(r + 2)/6;
1533
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1534
}// end loop over 'r'
1535
for (unsigned int r = 0; r < 1; r++)
1537
for (unsigned int s = 1; s < 2 - r; s++)
1539
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1540
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1541
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1542
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1543
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1544
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1545
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1546
}// end loop over 's'
1547
}// end loop over 'r'
1548
for (unsigned int r = 0; r < 2; r++)
1550
for (unsigned int s = 0; s < 2 - r; s++)
1552
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1553
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1554
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1555
}// end loop over 's'
1556
}// end loop over 'r'
1557
for (unsigned int r = 0; r < 1; r++)
1559
for (unsigned int s = 0; s < 1 - r; s++)
1561
for (unsigned int t = 1; t < 2 - r - s; t++)
1563
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1564
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1565
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1566
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1567
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1568
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1569
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1570
}// end loop over 't'
1571
}// end loop over 's'
1572
}// end loop over 'r'
1573
for (unsigned int r = 0; r < 3; r++)
1575
for (unsigned int s = 0; s < 3 - r; s++)
1577
for (unsigned int t = 0; t < 3 - r - s; t++)
1579
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1580
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1581
}// end loop over 't'
1582
}// end loop over 's'
1583
}// end loop over 'r'
1585
// Table(s) of coefficients.
1586
static const double coefficients0[10] = \
1587
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
1589
// Tables of derivatives of the polynomial base (transpose).
1590
static const double dmats0[10][10] = \
1591
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1592
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1593
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1594
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1595
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1596
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1597
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1598
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1599
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1600
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1602
static const double dmats1[10][10] = \
1603
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1604
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1605
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1606
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1607
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1608
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1609
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1610
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1611
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1612
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1614
static const double dmats2[10][10] = \
1615
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1616
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1617
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1618
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1619
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1620
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1621
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1622
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1623
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1624
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1626
// Compute reference derivatives.
1627
// Declare pointer to array of derivatives on FIAT element.
1628
double *derivatives = new double[num_derivatives];
1629
for (unsigned int r = 0; r < num_derivatives; r++)
1631
derivatives[r] = 0.00000000;
1632
}// end loop over 'r'
1634
// Declare derivative matrix (of polynomial basis).
1635
double dmats[10][10] = \
1636
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1637
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1638
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1639
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1640
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1641
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1642
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1643
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1644
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1645
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1647
// Declare (auxiliary) derivative matrix (of polynomial basis).
1648
double dmats_old[10][10] = \
1649
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1650
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1651
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1652
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1653
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1654
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1655
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1656
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1657
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1658
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1660
// Loop possible derivatives.
1661
for (unsigned int r = 0; r < num_derivatives; r++)
1663
// Resetting dmats values to compute next derivative.
1664
for (unsigned int t = 0; t < 10; t++)
1666
for (unsigned int u = 0; u < 10; u++)
1668
dmats[t][u] = 0.00000000;
1671
dmats[t][u] = 1.00000000;
1674
}// end loop over 'u'
1675
}// end loop over 't'
1677
// Looping derivative order to generate dmats.
1678
for (unsigned int s = 0; s < n; s++)
1680
// Updating dmats_old with new values and resetting dmats.
1681
for (unsigned int t = 0; t < 10; t++)
1683
for (unsigned int u = 0; u < 10; u++)
1685
dmats_old[t][u] = dmats[t][u];
1686
dmats[t][u] = 0.00000000;
1687
}// end loop over 'u'
1688
}// end loop over 't'
1690
// Update dmats using an inner product.
1691
if (combinations[r][s] == 0)
1693
for (unsigned int t = 0; t < 10; t++)
1695
for (unsigned int u = 0; u < 10; u++)
1697
for (unsigned int tu = 0; tu < 10; tu++)
1699
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1700
}// end loop over 'tu'
1701
}// end loop over 'u'
1702
}// end loop over 't'
1705
if (combinations[r][s] == 1)
1707
for (unsigned int t = 0; t < 10; t++)
1709
for (unsigned int u = 0; u < 10; u++)
1711
for (unsigned int tu = 0; tu < 10; tu++)
1713
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1714
}// end loop over 'tu'
1715
}// end loop over 'u'
1716
}// end loop over 't'
1719
if (combinations[r][s] == 2)
1721
for (unsigned int t = 0; t < 10; t++)
1723
for (unsigned int u = 0; u < 10; u++)
1725
for (unsigned int tu = 0; tu < 10; tu++)
1727
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1728
}// end loop over 'tu'
1729
}// end loop over 'u'
1730
}// end loop over 't'
1733
}// end loop over 's'
1734
for (unsigned int s = 0; s < 10; s++)
1736
for (unsigned int t = 0; t < 10; t++)
1738
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1739
}// end loop over 't'
1740
}// end loop over 's'
1741
}// end loop over 'r'
1743
// Transform derivatives back to physical element
1744
for (unsigned int r = 0; r < num_derivatives; r++)
1746
for (unsigned int s = 0; s < num_derivatives; s++)
1748
values[r] += transform[r][s]*derivatives[s];
1749
}// end loop over 's'
1750
}// end loop over 'r'
1752
// Delete pointer to array of derivatives on FIAT element
1753
delete [] derivatives;
1755
// Delete pointer to array of combinations of derivatives and transform
1756
for (unsigned int r = 0; r < num_derivatives; r++)
1758
delete [] combinations[r];
1759
}// end loop over 'r'
1760
delete [] combinations;
1761
for (unsigned int r = 0; r < num_derivatives; r++)
1763
delete [] transform[r];
1764
}// end loop over 'r'
1765
delete [] transform;
1771
// Array of basisvalues.
1772
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1774
// Declare helper variables.
1775
unsigned int rr = 0;
1776
unsigned int ss = 0;
1777
unsigned int tt = 0;
1778
double tmp5 = 0.00000000;
1779
double tmp6 = 0.00000000;
1780
double tmp7 = 0.00000000;
1781
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1782
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1783
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1784
double tmp3 = 0.50000000*(1.00000000 - Z);
1785
double tmp4 = tmp3*tmp3;
1787
// Compute basisvalues.
1788
basisvalues[0] = 1.00000000;
1789
basisvalues[1] = tmp0;
1790
for (unsigned int r = 1; r < 2; r++)
1792
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1793
ss = r*(r + 1)*(r + 2)/6;
1794
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1795
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1796
}// end loop over 'r'
1797
for (unsigned int r = 0; r < 2; r++)
1799
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1800
ss = r*(r + 1)*(r + 2)/6;
1801
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1802
}// end loop over 'r'
1803
for (unsigned int r = 0; r < 1; r++)
1805
for (unsigned int s = 1; s < 2 - r; s++)
1807
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1808
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1809
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1810
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1811
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1812
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1813
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1814
}// end loop over 's'
1815
}// end loop over 'r'
1816
for (unsigned int r = 0; r < 2; r++)
1818
for (unsigned int s = 0; s < 2 - r; s++)
1820
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1821
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1822
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1823
}// end loop over 's'
1824
}// end loop over 'r'
1825
for (unsigned int r = 0; r < 1; r++)
1827
for (unsigned int s = 0; s < 1 - r; s++)
1829
for (unsigned int t = 1; t < 2 - r - s; t++)
1831
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1832
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1833
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1834
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1835
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1836
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1837
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1838
}// end loop over 't'
1839
}// end loop over 's'
1840
}// end loop over 'r'
1841
for (unsigned int r = 0; r < 3; r++)
1843
for (unsigned int s = 0; s < 3 - r; s++)
1845
for (unsigned int t = 0; t < 3 - r - s; t++)
1847
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1848
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1849
}// end loop over 't'
1850
}// end loop over 's'
1851
}// end loop over 'r'
1853
// Table(s) of coefficients.
1854
static const double coefficients0[10] = \
1855
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
1857
// Tables of derivatives of the polynomial base (transpose).
1858
static const double dmats0[10][10] = \
1859
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1860
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1861
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1862
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1863
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1864
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1865
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1866
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1867
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1868
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1870
static const double dmats1[10][10] = \
1871
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1872
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1873
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1874
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1875
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1876
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1877
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1878
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1879
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1880
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1882
static const double dmats2[10][10] = \
1883
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1884
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1885
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1886
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1887
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1888
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1889
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1890
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1891
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1892
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1894
// Compute reference derivatives.
1895
// Declare pointer to array of derivatives on FIAT element.
1896
double *derivatives = new double[num_derivatives];
1897
for (unsigned int r = 0; r < num_derivatives; r++)
1899
derivatives[r] = 0.00000000;
1900
}// end loop over 'r'
1902
// Declare derivative matrix (of polynomial basis).
1903
double dmats[10][10] = \
1904
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1905
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1906
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1907
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1908
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1909
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1910
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1911
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1912
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1913
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1915
// Declare (auxiliary) derivative matrix (of polynomial basis).
1916
double dmats_old[10][10] = \
1917
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1918
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1919
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1920
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1921
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1922
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1923
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1924
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1925
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1926
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1928
// Loop possible derivatives.
1929
for (unsigned int r = 0; r < num_derivatives; r++)
1931
// Resetting dmats values to compute next derivative.
1932
for (unsigned int t = 0; t < 10; t++)
1934
for (unsigned int u = 0; u < 10; u++)
1936
dmats[t][u] = 0.00000000;
1939
dmats[t][u] = 1.00000000;
1942
}// end loop over 'u'
1943
}// end loop over 't'
1945
// Looping derivative order to generate dmats.
1946
for (unsigned int s = 0; s < n; s++)
1948
// Updating dmats_old with new values and resetting dmats.
1949
for (unsigned int t = 0; t < 10; t++)
1951
for (unsigned int u = 0; u < 10; u++)
1953
dmats_old[t][u] = dmats[t][u];
1954
dmats[t][u] = 0.00000000;
1955
}// end loop over 'u'
1956
}// end loop over 't'
1958
// Update dmats using an inner product.
1959
if (combinations[r][s] == 0)
1961
for (unsigned int t = 0; t < 10; t++)
1963
for (unsigned int u = 0; u < 10; u++)
1965
for (unsigned int tu = 0; tu < 10; tu++)
1967
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1968
}// end loop over 'tu'
1969
}// end loop over 'u'
1970
}// end loop over 't'
1973
if (combinations[r][s] == 1)
1975
for (unsigned int t = 0; t < 10; t++)
1977
for (unsigned int u = 0; u < 10; u++)
1979
for (unsigned int tu = 0; tu < 10; tu++)
1981
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1982
}// end loop over 'tu'
1983
}// end loop over 'u'
1984
}// end loop over 't'
1987
if (combinations[r][s] == 2)
1989
for (unsigned int t = 0; t < 10; t++)
1991
for (unsigned int u = 0; u < 10; u++)
1993
for (unsigned int tu = 0; tu < 10; tu++)
1995
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1996
}// end loop over 'tu'
1997
}// end loop over 'u'
1998
}// end loop over 't'
2001
}// end loop over 's'
2002
for (unsigned int s = 0; s < 10; s++)
2004
for (unsigned int t = 0; t < 10; t++)
2006
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2007
}// end loop over 't'
2008
}// end loop over 's'
2009
}// end loop over 'r'
2011
// Transform derivatives back to physical element
2012
for (unsigned int r = 0; r < num_derivatives; r++)
2014
for (unsigned int s = 0; s < num_derivatives; s++)
2016
values[r] += transform[r][s]*derivatives[s];
2017
}// end loop over 's'
2018
}// end loop over 'r'
2020
// Delete pointer to array of derivatives on FIAT element
2021
delete [] derivatives;
2023
// Delete pointer to array of combinations of derivatives and transform
2024
for (unsigned int r = 0; r < num_derivatives; r++)
2026
delete [] combinations[r];
2027
}// end loop over 'r'
2028
delete [] combinations;
2029
for (unsigned int r = 0; r < num_derivatives; r++)
2031
delete [] transform[r];
2032
}// end loop over 'r'
2033
delete [] transform;
2039
// Array of basisvalues.
2040
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2042
// Declare helper variables.
2043
unsigned int rr = 0;
2044
unsigned int ss = 0;
2045
unsigned int tt = 0;
2046
double tmp5 = 0.00000000;
2047
double tmp6 = 0.00000000;
2048
double tmp7 = 0.00000000;
2049
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2050
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
2051
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
2052
double tmp3 = 0.50000000*(1.00000000 - Z);
2053
double tmp4 = tmp3*tmp3;
2055
// Compute basisvalues.
2056
basisvalues[0] = 1.00000000;
2057
basisvalues[1] = tmp0;
2058
for (unsigned int r = 1; r < 2; r++)
2060
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
2061
ss = r*(r + 1)*(r + 2)/6;
2062
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
2063
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
2064
}// end loop over 'r'
2065
for (unsigned int r = 0; r < 2; r++)
2067
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2068
ss = r*(r + 1)*(r + 2)/6;
2069
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2070
}// end loop over 'r'
2071
for (unsigned int r = 0; r < 1; r++)
2073
for (unsigned int s = 1; s < 2 - r; s++)
2075
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
2076
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2077
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
2078
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2079
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2080
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2081
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
2082
}// end loop over 's'
2083
}// end loop over 'r'
2084
for (unsigned int r = 0; r < 2; r++)
2086
for (unsigned int s = 0; s < 2 - r; s++)
2088
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2089
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2090
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2091
}// end loop over 's'
2092
}// end loop over 'r'
2093
for (unsigned int r = 0; r < 1; r++)
2095
for (unsigned int s = 0; s < 1 - r; s++)
2097
for (unsigned int t = 1; t < 2 - r - s; t++)
2099
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
2100
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2101
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
2102
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2103
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2104
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2105
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
2106
}// end loop over 't'
2107
}// end loop over 's'
2108
}// end loop over 'r'
2109
for (unsigned int r = 0; r < 3; r++)
2111
for (unsigned int s = 0; s < 3 - r; s++)
2113
for (unsigned int t = 0; t < 3 - r - s; t++)
2115
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2116
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2117
}// end loop over 't'
2118
}// end loop over 's'
2119
}// end loop over 'r'
2121
// Table(s) of coefficients.
2122
static const double coefficients0[10] = \
2123
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
2125
// Tables of derivatives of the polynomial base (transpose).
2126
static const double dmats0[10][10] = \
2127
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2128
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2129
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2130
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2131
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2132
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2133
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2134
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2135
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2136
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2138
static const double dmats1[10][10] = \
2139
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2140
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2141
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2142
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2143
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2144
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2145
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2146
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2147
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2148
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2150
static const double dmats2[10][10] = \
2151
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2152
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2153
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2154
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2155
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2156
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2157
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2158
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2159
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2160
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2162
// Compute reference derivatives.
2163
// Declare pointer to array of derivatives on FIAT element.
2164
double *derivatives = new double[num_derivatives];
2165
for (unsigned int r = 0; r < num_derivatives; r++)
2167
derivatives[r] = 0.00000000;
2168
}// end loop over 'r'
2170
// Declare derivative matrix (of polynomial basis).
2171
double dmats[10][10] = \
2172
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2173
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2174
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2175
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2176
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2177
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2178
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2179
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2180
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2181
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2183
// Declare (auxiliary) derivative matrix (of polynomial basis).
2184
double dmats_old[10][10] = \
2185
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2186
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2187
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2188
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2189
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2190
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2191
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2192
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2193
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2194
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2196
// Loop possible derivatives.
2197
for (unsigned int r = 0; r < num_derivatives; r++)
2199
// Resetting dmats values to compute next derivative.
2200
for (unsigned int t = 0; t < 10; t++)
2202
for (unsigned int u = 0; u < 10; u++)
2204
dmats[t][u] = 0.00000000;
2207
dmats[t][u] = 1.00000000;
2210
}// end loop over 'u'
2211
}// end loop over 't'
2213
// Looping derivative order to generate dmats.
2214
for (unsigned int s = 0; s < n; s++)
2216
// Updating dmats_old with new values and resetting dmats.
2217
for (unsigned int t = 0; t < 10; t++)
2219
for (unsigned int u = 0; u < 10; u++)
2221
dmats_old[t][u] = dmats[t][u];
2222
dmats[t][u] = 0.00000000;
2223
}// end loop over 'u'
2224
}// end loop over 't'
2226
// Update dmats using an inner product.
2227
if (combinations[r][s] == 0)
2229
for (unsigned int t = 0; t < 10; t++)
2231
for (unsigned int u = 0; u < 10; u++)
2233
for (unsigned int tu = 0; tu < 10; tu++)
2235
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2236
}// end loop over 'tu'
2237
}// end loop over 'u'
2238
}// end loop over 't'
2241
if (combinations[r][s] == 1)
2243
for (unsigned int t = 0; t < 10; t++)
2245
for (unsigned int u = 0; u < 10; u++)
2247
for (unsigned int tu = 0; tu < 10; tu++)
2249
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2250
}// end loop over 'tu'
2251
}// end loop over 'u'
2252
}// end loop over 't'
2255
if (combinations[r][s] == 2)
2257
for (unsigned int t = 0; t < 10; t++)
2259
for (unsigned int u = 0; u < 10; u++)
2261
for (unsigned int tu = 0; tu < 10; tu++)
2263
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2264
}// end loop over 'tu'
2265
}// end loop over 'u'
2266
}// end loop over 't'
2269
}// end loop over 's'
2270
for (unsigned int s = 0; s < 10; s++)
2272
for (unsigned int t = 0; t < 10; t++)
2274
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2275
}// end loop over 't'
2276
}// end loop over 's'
2277
}// end loop over 'r'
2279
// Transform derivatives back to physical element
2280
for (unsigned int r = 0; r < num_derivatives; r++)
2282
for (unsigned int s = 0; s < num_derivatives; s++)
2284
values[r] += transform[r][s]*derivatives[s];
2285
}// end loop over 's'
2286
}// end loop over 'r'
2288
// Delete pointer to array of derivatives on FIAT element
2289
delete [] derivatives;
2291
// Delete pointer to array of combinations of derivatives and transform
2292
for (unsigned int r = 0; r < num_derivatives; r++)
2294
delete [] combinations[r];
2295
}// end loop over 'r'
2296
delete [] combinations;
2297
for (unsigned int r = 0; r < num_derivatives; r++)
2299
delete [] transform[r];
2300
}// end loop over 'r'
2301
delete [] transform;
2307
// Array of basisvalues.
2308
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2310
// Declare helper variables.
2311
unsigned int rr = 0;
2312
unsigned int ss = 0;
2313
unsigned int tt = 0;
2314
double tmp5 = 0.00000000;
2315
double tmp6 = 0.00000000;
2316
double tmp7 = 0.00000000;
2317
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2318
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
2319
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
2320
double tmp3 = 0.50000000*(1.00000000 - Z);
2321
double tmp4 = tmp3*tmp3;
2323
// Compute basisvalues.
2324
basisvalues[0] = 1.00000000;
2325
basisvalues[1] = tmp0;
2326
for (unsigned int r = 1; r < 2; r++)
2328
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
2329
ss = r*(r + 1)*(r + 2)/6;
2330
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
2331
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
2332
}// end loop over 'r'
2333
for (unsigned int r = 0; r < 2; r++)
2335
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2336
ss = r*(r + 1)*(r + 2)/6;
2337
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2338
}// end loop over 'r'
2339
for (unsigned int r = 0; r < 1; r++)
2341
for (unsigned int s = 1; s < 2 - r; s++)
2343
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
2344
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2345
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
2346
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2347
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2348
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2349
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
2350
}// end loop over 's'
2351
}// end loop over 'r'
2352
for (unsigned int r = 0; r < 2; r++)
2354
for (unsigned int s = 0; s < 2 - r; s++)
2356
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2357
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2358
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2359
}// end loop over 's'
2360
}// end loop over 'r'
2361
for (unsigned int r = 0; r < 1; r++)
2363
for (unsigned int s = 0; s < 1 - r; s++)
2365
for (unsigned int t = 1; t < 2 - r - s; t++)
2367
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
2368
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2369
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
2370
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2371
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2372
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2373
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
2374
}// end loop over 't'
2375
}// end loop over 's'
2376
}// end loop over 'r'
2377
for (unsigned int r = 0; r < 3; r++)
2379
for (unsigned int s = 0; s < 3 - r; s++)
2381
for (unsigned int t = 0; t < 3 - r - s; t++)
2383
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2384
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2385
}// end loop over 't'
2386
}// end loop over 's'
2387
}// end loop over 'r'
2389
// Table(s) of coefficients.
2390
static const double coefficients0[10] = \
2391
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
2393
// Tables of derivatives of the polynomial base (transpose).
2394
static const double dmats0[10][10] = \
2395
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2396
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2397
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2398
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2399
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2400
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2401
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2402
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2403
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2404
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2406
static const double dmats1[10][10] = \
2407
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2408
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2409
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2410
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2411
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2412
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2413
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2414
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2415
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2416
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2418
static const double dmats2[10][10] = \
2419
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2420
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2421
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2422
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2423
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2424
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2425
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2426
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2427
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2428
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2430
// Compute reference derivatives.
2431
// Declare pointer to array of derivatives on FIAT element.
2432
double *derivatives = new double[num_derivatives];
2433
for (unsigned int r = 0; r < num_derivatives; r++)
2435
derivatives[r] = 0.00000000;
2436
}// end loop over 'r'
2438
// Declare derivative matrix (of polynomial basis).
2439
double dmats[10][10] = \
2440
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2441
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2442
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2443
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2444
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2445
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2446
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2447
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2448
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2449
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2451
// Declare (auxiliary) derivative matrix (of polynomial basis).
2452
double dmats_old[10][10] = \
2453
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2454
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2455
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2456
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2457
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2458
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2459
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2460
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2461
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2462
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2464
// Loop possible derivatives.
2465
for (unsigned int r = 0; r < num_derivatives; r++)
2467
// Resetting dmats values to compute next derivative.
2468
for (unsigned int t = 0; t < 10; t++)
2470
for (unsigned int u = 0; u < 10; u++)
2472
dmats[t][u] = 0.00000000;
2475
dmats[t][u] = 1.00000000;
2478
}// end loop over 'u'
2479
}// end loop over 't'
2481
// Looping derivative order to generate dmats.
2482
for (unsigned int s = 0; s < n; s++)
2484
// Updating dmats_old with new values and resetting dmats.
2485
for (unsigned int t = 0; t < 10; t++)
2487
for (unsigned int u = 0; u < 10; u++)
2489
dmats_old[t][u] = dmats[t][u];
2490
dmats[t][u] = 0.00000000;
2491
}// end loop over 'u'
2492
}// end loop over 't'
2494
// Update dmats using an inner product.
2495
if (combinations[r][s] == 0)
2497
for (unsigned int t = 0; t < 10; t++)
2499
for (unsigned int u = 0; u < 10; u++)
2501
for (unsigned int tu = 0; tu < 10; tu++)
2503
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2504
}// end loop over 'tu'
2505
}// end loop over 'u'
2506
}// end loop over 't'
2509
if (combinations[r][s] == 1)
2511
for (unsigned int t = 0; t < 10; t++)
2513
for (unsigned int u = 0; u < 10; u++)
2515
for (unsigned int tu = 0; tu < 10; tu++)
2517
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2518
}// end loop over 'tu'
2519
}// end loop over 'u'
2520
}// end loop over 't'
2523
if (combinations[r][s] == 2)
2525
for (unsigned int t = 0; t < 10; t++)
2527
for (unsigned int u = 0; u < 10; u++)
2529
for (unsigned int tu = 0; tu < 10; tu++)
2531
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2532
}// end loop over 'tu'
2533
}// end loop over 'u'
2534
}// end loop over 't'
2537
}// end loop over 's'
2538
for (unsigned int s = 0; s < 10; s++)
2540
for (unsigned int t = 0; t < 10; t++)
2542
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2543
}// end loop over 't'
2544
}// end loop over 's'
2545
}// end loop over 'r'
2547
// Transform derivatives back to physical element
2548
for (unsigned int r = 0; r < num_derivatives; r++)
2550
for (unsigned int s = 0; s < num_derivatives; s++)
2552
values[r] += transform[r][s]*derivatives[s];
2553
}// end loop over 's'
2554
}// end loop over 'r'
2556
// Delete pointer to array of derivatives on FIAT element
2557
delete [] derivatives;
2559
// Delete pointer to array of combinations of derivatives and transform
2560
for (unsigned int r = 0; r < num_derivatives; r++)
2562
delete [] combinations[r];
2563
}// end loop over 'r'
2564
delete [] combinations;
2565
for (unsigned int r = 0; r < num_derivatives; r++)
2567
delete [] transform[r];
2568
}// end loop over 'r'
2569
delete [] transform;
2575
// Array of basisvalues.
2576
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2578
// Declare helper variables.
2579
unsigned int rr = 0;
2580
unsigned int ss = 0;
2581
unsigned int tt = 0;
2582
double tmp5 = 0.00000000;
2583
double tmp6 = 0.00000000;
2584
double tmp7 = 0.00000000;
2585
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2586
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
2587
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
2588
double tmp3 = 0.50000000*(1.00000000 - Z);
2589
double tmp4 = tmp3*tmp3;
2591
// Compute basisvalues.
2592
basisvalues[0] = 1.00000000;
2593
basisvalues[1] = tmp0;
2594
for (unsigned int r = 1; r < 2; r++)
2596
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
2597
ss = r*(r + 1)*(r + 2)/6;
2598
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
2599
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
2600
}// end loop over 'r'
2601
for (unsigned int r = 0; r < 2; r++)
2603
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2604
ss = r*(r + 1)*(r + 2)/6;
2605
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2606
}// end loop over 'r'
2607
for (unsigned int r = 0; r < 1; r++)
2609
for (unsigned int s = 1; s < 2 - r; s++)
2611
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
2612
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2613
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
2614
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2615
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2616
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2617
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
2618
}// end loop over 's'
2619
}// end loop over 'r'
2620
for (unsigned int r = 0; r < 2; r++)
2622
for (unsigned int s = 0; s < 2 - r; s++)
2624
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2625
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2626
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2627
}// end loop over 's'
2628
}// end loop over 'r'
2629
for (unsigned int r = 0; r < 1; r++)
2631
for (unsigned int s = 0; s < 1 - r; s++)
2633
for (unsigned int t = 1; t < 2 - r - s; t++)
2635
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
2636
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2637
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
2638
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2639
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2640
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2641
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
2642
}// end loop over 't'
2643
}// end loop over 's'
2644
}// end loop over 'r'
2645
for (unsigned int r = 0; r < 3; r++)
2647
for (unsigned int s = 0; s < 3 - r; s++)
2649
for (unsigned int t = 0; t < 3 - r - s; t++)
2651
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2652
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2653
}// end loop over 't'
2654
}// end loop over 's'
2655
}// end loop over 'r'
2657
// Table(s) of coefficients.
2658
static const double coefficients0[10] = \
2659
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
2661
// Tables of derivatives of the polynomial base (transpose).
2662
static const double dmats0[10][10] = \
2663
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2664
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2665
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2666
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2667
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2668
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2669
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2670
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2671
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2672
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2674
static const double dmats1[10][10] = \
2675
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2676
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2677
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2678
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2679
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2680
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2681
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2682
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2683
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2684
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2686
static const double dmats2[10][10] = \
2687
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2688
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2689
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2690
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2691
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2692
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2693
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2694
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2695
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2696
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2698
// Compute reference derivatives.
2699
// Declare pointer to array of derivatives on FIAT element.
2700
double *derivatives = new double[num_derivatives];
2701
for (unsigned int r = 0; r < num_derivatives; r++)
2703
derivatives[r] = 0.00000000;
2704
}// end loop over 'r'
2706
// Declare derivative matrix (of polynomial basis).
2707
double dmats[10][10] = \
2708
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2709
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2710
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2711
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2712
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2713
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2714
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2715
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2716
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2717
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2719
// Declare (auxiliary) derivative matrix (of polynomial basis).
2720
double dmats_old[10][10] = \
2721
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2722
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2723
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2724
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2725
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2726
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2727
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2728
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2729
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2730
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2732
// Loop possible derivatives.
2733
for (unsigned int r = 0; r < num_derivatives; r++)
2735
// Resetting dmats values to compute next derivative.
2736
for (unsigned int t = 0; t < 10; t++)
2738
for (unsigned int u = 0; u < 10; u++)
2740
dmats[t][u] = 0.00000000;
2743
dmats[t][u] = 1.00000000;
2746
}// end loop over 'u'
2747
}// end loop over 't'
2749
// Looping derivative order to generate dmats.
2750
for (unsigned int s = 0; s < n; s++)
2752
// Updating dmats_old with new values and resetting dmats.
2753
for (unsigned int t = 0; t < 10; t++)
2755
for (unsigned int u = 0; u < 10; u++)
2757
dmats_old[t][u] = dmats[t][u];
2758
dmats[t][u] = 0.00000000;
2759
}// end loop over 'u'
2760
}// end loop over 't'
2762
// Update dmats using an inner product.
2763
if (combinations[r][s] == 0)
2765
for (unsigned int t = 0; t < 10; t++)
2767
for (unsigned int u = 0; u < 10; u++)
2769
for (unsigned int tu = 0; tu < 10; tu++)
2771
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2772
}// end loop over 'tu'
2773
}// end loop over 'u'
2774
}// end loop over 't'
2777
if (combinations[r][s] == 1)
2779
for (unsigned int t = 0; t < 10; t++)
2781
for (unsigned int u = 0; u < 10; u++)
2783
for (unsigned int tu = 0; tu < 10; tu++)
2785
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2786
}// end loop over 'tu'
2787
}// end loop over 'u'
2788
}// end loop over 't'
2791
if (combinations[r][s] == 2)
2793
for (unsigned int t = 0; t < 10; t++)
2795
for (unsigned int u = 0; u < 10; u++)
2797
for (unsigned int tu = 0; tu < 10; tu++)
2799
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2800
}// end loop over 'tu'
2801
}// end loop over 'u'
2802
}// end loop over 't'
2805
}// end loop over 's'
2806
for (unsigned int s = 0; s < 10; s++)
2808
for (unsigned int t = 0; t < 10; t++)
2810
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2811
}// end loop over 't'
2812
}// end loop over 's'
2813
}// end loop over 'r'
2815
// Transform derivatives back to physical element
2816
for (unsigned int r = 0; r < num_derivatives; r++)
2818
for (unsigned int s = 0; s < num_derivatives; s++)
2820
values[r] += transform[r][s]*derivatives[s];
2821
}// end loop over 's'
2822
}// end loop over 'r'
2824
// Delete pointer to array of derivatives on FIAT element
2825
delete [] derivatives;
2827
// Delete pointer to array of combinations of derivatives and transform
2828
for (unsigned int r = 0; r < num_derivatives; r++)
2830
delete [] combinations[r];
2831
}// end loop over 'r'
2832
delete [] combinations;
2833
for (unsigned int r = 0; r < num_derivatives; r++)
2835
delete [] transform[r];
2836
}// end loop over 'r'
2837
delete [] transform;
2843
// Array of basisvalues.
2844
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2846
// Declare helper variables.
2847
unsigned int rr = 0;
2848
unsigned int ss = 0;
2849
unsigned int tt = 0;
2850
double tmp5 = 0.00000000;
2851
double tmp6 = 0.00000000;
2852
double tmp7 = 0.00000000;
2853
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2854
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
2855
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
2856
double tmp3 = 0.50000000*(1.00000000 - Z);
2857
double tmp4 = tmp3*tmp3;
2859
// Compute basisvalues.
2860
basisvalues[0] = 1.00000000;
2861
basisvalues[1] = tmp0;
2862
for (unsigned int r = 1; r < 2; r++)
2864
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
2865
ss = r*(r + 1)*(r + 2)/6;
2866
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
2867
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
2868
}// end loop over 'r'
2869
for (unsigned int r = 0; r < 2; r++)
2871
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2872
ss = r*(r + 1)*(r + 2)/6;
2873
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2874
}// end loop over 'r'
2875
for (unsigned int r = 0; r < 1; r++)
2877
for (unsigned int s = 1; s < 2 - r; s++)
2879
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
2880
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2881
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
2882
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2883
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2884
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2885
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
2886
}// end loop over 's'
2887
}// end loop over 'r'
2888
for (unsigned int r = 0; r < 2; r++)
2890
for (unsigned int s = 0; s < 2 - r; s++)
2892
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2893
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2894
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2895
}// end loop over 's'
2896
}// end loop over 'r'
2897
for (unsigned int r = 0; r < 1; r++)
2899
for (unsigned int s = 0; s < 1 - r; s++)
2901
for (unsigned int t = 1; t < 2 - r - s; t++)
2903
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
2904
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2905
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
2906
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2907
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2908
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2909
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
2910
}// end loop over 't'
2911
}// end loop over 's'
2912
}// end loop over 'r'
2913
for (unsigned int r = 0; r < 3; r++)
2915
for (unsigned int s = 0; s < 3 - r; s++)
2917
for (unsigned int t = 0; t < 3 - r - s; t++)
2919
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2920
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2921
}// end loop over 't'
2922
}// end loop over 's'
2923
}// end loop over 'r'
2925
// Table(s) of coefficients.
2926
static const double coefficients0[10] = \
2927
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
2929
// Tables of derivatives of the polynomial base (transpose).
2930
static const double dmats0[10][10] = \
2931
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2932
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2933
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2934
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2935
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2936
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2937
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2938
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2939
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2940
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2942
static const double dmats1[10][10] = \
2943
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2944
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2945
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2946
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2947
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2948
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2949
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2950
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2951
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2952
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2954
static const double dmats2[10][10] = \
2955
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2956
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2957
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2958
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2959
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2960
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2961
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2962
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2963
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2964
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2966
// Compute reference derivatives.
2967
// Declare pointer to array of derivatives on FIAT element.
2968
double *derivatives = new double[num_derivatives];
2969
for (unsigned int r = 0; r < num_derivatives; r++)
2971
derivatives[r] = 0.00000000;
2972
}// end loop over 'r'
2974
// Declare derivative matrix (of polynomial basis).
2975
double dmats[10][10] = \
2976
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2977
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2978
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2979
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2980
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2981
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2982
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2983
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2984
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2985
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2987
// Declare (auxiliary) derivative matrix (of polynomial basis).
2988
double dmats_old[10][10] = \
2989
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2990
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2991
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2992
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2993
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2994
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2995
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2996
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2997
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2998
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3000
// Loop possible derivatives.
3001
for (unsigned int r = 0; r < num_derivatives; r++)
3003
// Resetting dmats values to compute next derivative.
3004
for (unsigned int t = 0; t < 10; t++)
3006
for (unsigned int u = 0; u < 10; u++)
3008
dmats[t][u] = 0.00000000;
3011
dmats[t][u] = 1.00000000;
3014
}// end loop over 'u'
3015
}// end loop over 't'
3017
// Looping derivative order to generate dmats.
3018
for (unsigned int s = 0; s < n; s++)
3020
// Updating dmats_old with new values and resetting dmats.
3021
for (unsigned int t = 0; t < 10; t++)
3023
for (unsigned int u = 0; u < 10; u++)
3025
dmats_old[t][u] = dmats[t][u];
3026
dmats[t][u] = 0.00000000;
3027
}// end loop over 'u'
3028
}// end loop over 't'
3030
// Update dmats using an inner product.
3031
if (combinations[r][s] == 0)
3033
for (unsigned int t = 0; t < 10; t++)
3035
for (unsigned int u = 0; u < 10; u++)
3037
for (unsigned int tu = 0; tu < 10; tu++)
3039
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3040
}// end loop over 'tu'
3041
}// end loop over 'u'
3042
}// end loop over 't'
3045
if (combinations[r][s] == 1)
3047
for (unsigned int t = 0; t < 10; t++)
3049
for (unsigned int u = 0; u < 10; u++)
3051
for (unsigned int tu = 0; tu < 10; tu++)
3053
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3054
}// end loop over 'tu'
3055
}// end loop over 'u'
3056
}// end loop over 't'
3059
if (combinations[r][s] == 2)
3061
for (unsigned int t = 0; t < 10; t++)
3063
for (unsigned int u = 0; u < 10; u++)
3065
for (unsigned int tu = 0; tu < 10; tu++)
3067
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3068
}// end loop over 'tu'
3069
}// end loop over 'u'
3070
}// end loop over 't'
3073
}// end loop over 's'
3074
for (unsigned int s = 0; s < 10; s++)
3076
for (unsigned int t = 0; t < 10; t++)
3078
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3079
}// end loop over 't'
3080
}// end loop over 's'
3081
}// end loop over 'r'
3083
// Transform derivatives back to physical element
3084
for (unsigned int r = 0; r < num_derivatives; r++)
3086
for (unsigned int s = 0; s < num_derivatives; s++)
3088
values[r] += transform[r][s]*derivatives[s];
3089
}// end loop over 's'
3090
}// end loop over 'r'
3092
// Delete pointer to array of derivatives on FIAT element
3093
delete [] derivatives;
3095
// Delete pointer to array of combinations of derivatives and transform
3096
for (unsigned int r = 0; r < num_derivatives; r++)
3098
delete [] combinations[r];
3099
}// end loop over 'r'
3100
delete [] combinations;
3101
for (unsigned int r = 0; r < num_derivatives; r++)
3103
delete [] transform[r];
3104
}// end loop over 'r'
3105
delete [] transform;
3111
// Array of basisvalues.
3112
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
3114
// Declare helper variables.
3115
unsigned int rr = 0;
3116
unsigned int ss = 0;
3117
unsigned int tt = 0;
3118
double tmp5 = 0.00000000;
3119
double tmp6 = 0.00000000;
3120
double tmp7 = 0.00000000;
3121
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3122
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
3123
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
3124
double tmp3 = 0.50000000*(1.00000000 - Z);
3125
double tmp4 = tmp3*tmp3;
3127
// Compute basisvalues.
3128
basisvalues[0] = 1.00000000;
3129
basisvalues[1] = tmp0;
3130
for (unsigned int r = 1; r < 2; r++)
3132
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
3133
ss = r*(r + 1)*(r + 2)/6;
3134
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
3135
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
3136
}// end loop over 'r'
3137
for (unsigned int r = 0; r < 2; r++)
3139
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3140
ss = r*(r + 1)*(r + 2)/6;
3141
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3142
}// end loop over 'r'
3143
for (unsigned int r = 0; r < 1; r++)
3145
for (unsigned int s = 1; s < 2 - r; s++)
3147
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
3148
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3149
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
3150
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3151
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3152
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3153
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
3154
}// end loop over 's'
3155
}// end loop over 'r'
3156
for (unsigned int r = 0; r < 2; r++)
3158
for (unsigned int s = 0; s < 2 - r; s++)
3160
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3161
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3162
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3163
}// end loop over 's'
3164
}// end loop over 'r'
3165
for (unsigned int r = 0; r < 1; r++)
3167
for (unsigned int s = 0; s < 1 - r; s++)
3169
for (unsigned int t = 1; t < 2 - r - s; t++)
3171
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
3172
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3173
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
3174
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3175
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3176
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3177
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
3178
}// end loop over 't'
3179
}// end loop over 's'
3180
}// end loop over 'r'
3181
for (unsigned int r = 0; r < 3; r++)
3183
for (unsigned int s = 0; s < 3 - r; s++)
3185
for (unsigned int t = 0; t < 3 - r - s; t++)
3187
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3188
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3189
}// end loop over 't'
3190
}// end loop over 's'
3191
}// end loop over 'r'
3193
// Table(s) of coefficients.
3194
static const double coefficients0[10] = \
3195
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
3197
// Tables of derivatives of the polynomial base (transpose).
3198
static const double dmats0[10][10] = \
3199
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3200
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3201
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3202
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3203
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3204
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3205
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3206
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3207
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3208
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3210
static const double dmats1[10][10] = \
3211
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3212
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3213
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3214
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3215
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3216
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3217
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3218
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3219
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3220
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3222
static const double dmats2[10][10] = \
3223
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3224
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3225
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3226
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3227
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3228
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3229
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3230
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3231
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3232
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3234
// Compute reference derivatives.
3235
// Declare pointer to array of derivatives on FIAT element.
3236
double *derivatives = new double[num_derivatives];
3237
for (unsigned int r = 0; r < num_derivatives; r++)
3239
derivatives[r] = 0.00000000;
3240
}// end loop over 'r'
3242
// Declare derivative matrix (of polynomial basis).
3243
double dmats[10][10] = \
3244
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3245
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3246
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3247
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3248
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3249
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3250
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
3251
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
3252
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
3253
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3255
// Declare (auxiliary) derivative matrix (of polynomial basis).
3256
double dmats_old[10][10] = \
3257
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3258
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3259
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3260
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3261
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3262
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3263
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
3264
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
3265
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
3266
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3268
// Loop possible derivatives.
3269
for (unsigned int r = 0; r < num_derivatives; r++)
3271
// Resetting dmats values to compute next derivative.
3272
for (unsigned int t = 0; t < 10; t++)
3274
for (unsigned int u = 0; u < 10; u++)
3276
dmats[t][u] = 0.00000000;
3279
dmats[t][u] = 1.00000000;
3282
}// end loop over 'u'
3283
}// end loop over 't'
3285
// Looping derivative order to generate dmats.
3286
for (unsigned int s = 0; s < n; s++)
3288
// Updating dmats_old with new values and resetting dmats.
3289
for (unsigned int t = 0; t < 10; t++)
3291
for (unsigned int u = 0; u < 10; u++)
3293
dmats_old[t][u] = dmats[t][u];
3294
dmats[t][u] = 0.00000000;
3295
}// end loop over 'u'
3296
}// end loop over 't'
3298
// Update dmats using an inner product.
3299
if (combinations[r][s] == 0)
3301
for (unsigned int t = 0; t < 10; t++)
3303
for (unsigned int u = 0; u < 10; u++)
3305
for (unsigned int tu = 0; tu < 10; tu++)
3307
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3308
}// end loop over 'tu'
3309
}// end loop over 'u'
3310
}// end loop over 't'
3313
if (combinations[r][s] == 1)
3315
for (unsigned int t = 0; t < 10; t++)
3317
for (unsigned int u = 0; u < 10; u++)
3319
for (unsigned int tu = 0; tu < 10; tu++)
3321
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3322
}// end loop over 'tu'
3323
}// end loop over 'u'
3324
}// end loop over 't'
3327
if (combinations[r][s] == 2)
3329
for (unsigned int t = 0; t < 10; t++)
3331
for (unsigned int u = 0; u < 10; u++)
3333
for (unsigned int tu = 0; tu < 10; tu++)
3335
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3336
}// end loop over 'tu'
3337
}// end loop over 'u'
3338
}// end loop over 't'
3341
}// end loop over 's'
3342
for (unsigned int s = 0; s < 10; s++)
3344
for (unsigned int t = 0; t < 10; t++)
3346
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3347
}// end loop over 't'
3348
}// end loop over 's'
3349
}// end loop over 'r'
3351
// Transform derivatives back to physical element
3352
for (unsigned int r = 0; r < num_derivatives; r++)
3354
for (unsigned int s = 0; s < num_derivatives; s++)
3356
values[r] += transform[r][s]*derivatives[s];
3357
}// end loop over 's'
3358
}// end loop over 'r'
3360
// Delete pointer to array of derivatives on FIAT element
3361
delete [] derivatives;
3363
// Delete pointer to array of combinations of derivatives and transform
3364
for (unsigned int r = 0; r < num_derivatives; r++)
3366
delete [] combinations[r];
3367
}// end loop over 'r'
3368
delete [] combinations;
3369
for (unsigned int r = 0; r < num_derivatives; r++)
3371
delete [] transform[r];
3372
}// end loop over 'r'
3373
delete [] transform;
3379
// Array of basisvalues.
3380
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
3382
// Declare helper variables.
3383
unsigned int rr = 0;
3384
unsigned int ss = 0;
3385
unsigned int tt = 0;
3386
double tmp5 = 0.00000000;
3387
double tmp6 = 0.00000000;
3388
double tmp7 = 0.00000000;
3389
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3390
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
3391
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
3392
double tmp3 = 0.50000000*(1.00000000 - Z);
3393
double tmp4 = tmp3*tmp3;
3395
// Compute basisvalues.
3396
basisvalues[0] = 1.00000000;
3397
basisvalues[1] = tmp0;
3398
for (unsigned int r = 1; r < 2; r++)
3400
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
3401
ss = r*(r + 1)*(r + 2)/6;
3402
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
3403
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
3404
}// end loop over 'r'
3405
for (unsigned int r = 0; r < 2; r++)
3407
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3408
ss = r*(r + 1)*(r + 2)/6;
3409
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3410
}// end loop over 'r'
3411
for (unsigned int r = 0; r < 1; r++)
3413
for (unsigned int s = 1; s < 2 - r; s++)
3415
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
3416
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3417
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
3418
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3419
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3420
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3421
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
3422
}// end loop over 's'
3423
}// end loop over 'r'
3424
for (unsigned int r = 0; r < 2; r++)
3426
for (unsigned int s = 0; s < 2 - r; s++)
3428
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3429
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3430
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3431
}// end loop over 's'
3432
}// end loop over 'r'
3433
for (unsigned int r = 0; r < 1; r++)
3435
for (unsigned int s = 0; s < 1 - r; s++)
3437
for (unsigned int t = 1; t < 2 - r - s; t++)
3439
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
3440
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3441
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
3442
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3443
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3444
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3445
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
3446
}// end loop over 't'
3447
}// end loop over 's'
3448
}// end loop over 'r'
3449
for (unsigned int r = 0; r < 3; r++)
3451
for (unsigned int s = 0; s < 3 - r; s++)
3453
for (unsigned int t = 0; t < 3 - r - s; t++)
3455
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3456
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3457
}// end loop over 't'
3458
}// end loop over 's'
3459
}// end loop over 'r'
3461
// Table(s) of coefficients.
3462
static const double coefficients0[10] = \
3463
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
3465
// Tables of derivatives of the polynomial base (transpose).
3466
static const double dmats0[10][10] = \
3467
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3468
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3469
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3470
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3471
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3472
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3473
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3474
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3475
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3476
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3478
static const double dmats1[10][10] = \
3479
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3480
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3481
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3482
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3483
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3484
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3485
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3486
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3487
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3488
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3490
static const double dmats2[10][10] = \
3491
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3492
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3493
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3494
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3495
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3496
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3497
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3498
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3499
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3500
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3502
// Compute reference derivatives.
3503
// Declare pointer to array of derivatives on FIAT element.
3504
double *derivatives = new double[num_derivatives];
3505
for (unsigned int r = 0; r < num_derivatives; r++)
3507
derivatives[r] = 0.00000000;
3508
}// end loop over 'r'
3510
// Declare derivative matrix (of polynomial basis).
3511
double dmats[10][10] = \
3512
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3513
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3514
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3515
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3516
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3517
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3518
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
3519
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
3520
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
3521
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3523
// Declare (auxiliary) derivative matrix (of polynomial basis).
3524
double dmats_old[10][10] = \
3525
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3526
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3527
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3528
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3529
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3530
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3531
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
3532
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
3533
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
3534
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3536
// Loop possible derivatives.
3537
for (unsigned int r = 0; r < num_derivatives; r++)
3539
// Resetting dmats values to compute next derivative.
3540
for (unsigned int t = 0; t < 10; t++)
3542
for (unsigned int u = 0; u < 10; u++)
3544
dmats[t][u] = 0.00000000;
3547
dmats[t][u] = 1.00000000;
3550
}// end loop over 'u'
3551
}// end loop over 't'
3553
// Looping derivative order to generate dmats.
3554
for (unsigned int s = 0; s < n; s++)
3556
// Updating dmats_old with new values and resetting dmats.
3557
for (unsigned int t = 0; t < 10; t++)
3559
for (unsigned int u = 0; u < 10; u++)
3561
dmats_old[t][u] = dmats[t][u];
3562
dmats[t][u] = 0.00000000;
3563
}// end loop over 'u'
3564
}// end loop over 't'
3566
// Update dmats using an inner product.
3567
if (combinations[r][s] == 0)
3569
for (unsigned int t = 0; t < 10; t++)
3571
for (unsigned int u = 0; u < 10; u++)
3573
for (unsigned int tu = 0; tu < 10; tu++)
3575
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3576
}// end loop over 'tu'
3577
}// end loop over 'u'
3578
}// end loop over 't'
3581
if (combinations[r][s] == 1)
3583
for (unsigned int t = 0; t < 10; t++)
3585
for (unsigned int u = 0; u < 10; u++)
3587
for (unsigned int tu = 0; tu < 10; tu++)
3589
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3590
}// end loop over 'tu'
3591
}// end loop over 'u'
3592
}// end loop over 't'
3595
if (combinations[r][s] == 2)
3597
for (unsigned int t = 0; t < 10; t++)
3599
for (unsigned int u = 0; u < 10; u++)
3601
for (unsigned int tu = 0; tu < 10; tu++)
3603
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3604
}// end loop over 'tu'
3605
}// end loop over 'u'
3606
}// end loop over 't'
3609
}// end loop over 's'
3610
for (unsigned int s = 0; s < 10; s++)
3612
for (unsigned int t = 0; t < 10; t++)
3614
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3615
}// end loop over 't'
3616
}// end loop over 's'
3617
}// end loop over 'r'
3619
// Transform derivatives back to physical element
3620
for (unsigned int r = 0; r < num_derivatives; r++)
3622
for (unsigned int s = 0; s < num_derivatives; s++)
3624
values[r] += transform[r][s]*derivatives[s];
3625
}// end loop over 's'
3626
}// end loop over 'r'
3628
// Delete pointer to array of derivatives on FIAT element
3629
delete [] derivatives;
3631
// Delete pointer to array of combinations of derivatives and transform
3632
for (unsigned int r = 0; r < num_derivatives; r++)
3634
delete [] combinations[r];
3635
}// end loop over 'r'
3636
delete [] combinations;
3637
for (unsigned int r = 0; r < num_derivatives; r++)
3639
delete [] transform[r];
3640
}// end loop over 'r'
3641
delete [] transform;
3647
// Array of basisvalues.
3648
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
3650
// Declare helper variables.
3651
unsigned int rr = 0;
3652
unsigned int ss = 0;
3653
unsigned int tt = 0;
3654
double tmp5 = 0.00000000;
3655
double tmp6 = 0.00000000;
3656
double tmp7 = 0.00000000;
3657
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
3658
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
3659
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
3660
double tmp3 = 0.50000000*(1.00000000 - Z);
3661
double tmp4 = tmp3*tmp3;
3663
// Compute basisvalues.
3664
basisvalues[0] = 1.00000000;
3665
basisvalues[1] = tmp0;
3666
for (unsigned int r = 1; r < 2; r++)
3668
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
3669
ss = r*(r + 1)*(r + 2)/6;
3670
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
3671
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
3672
}// end loop over 'r'
3673
for (unsigned int r = 0; r < 2; r++)
3675
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
3676
ss = r*(r + 1)*(r + 2)/6;
3677
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
3678
}// end loop over 'r'
3679
for (unsigned int r = 0; r < 1; r++)
3681
for (unsigned int s = 1; s < 2 - r; s++)
3683
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
3684
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3685
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
3686
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3687
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3688
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
3689
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
3690
}// end loop over 's'
3691
}// end loop over 'r'
3692
for (unsigned int r = 0; r < 2; r++)
3694
for (unsigned int s = 0; s < 2 - r; s++)
3696
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
3697
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
3698
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
3699
}// end loop over 's'
3700
}// end loop over 'r'
3701
for (unsigned int r = 0; r < 1; r++)
3703
for (unsigned int s = 0; s < 1 - r; s++)
3705
for (unsigned int t = 1; t < 2 - r - s; t++)
3707
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
3708
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3709
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
3710
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3711
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3712
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
3713
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
3714
}// end loop over 't'
3715
}// end loop over 's'
3716
}// end loop over 'r'
3717
for (unsigned int r = 0; r < 3; r++)
3719
for (unsigned int s = 0; s < 3 - r; s++)
3721
for (unsigned int t = 0; t < 3 - r - s; t++)
3723
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
3724
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
3725
}// end loop over 't'
3726
}// end loop over 's'
3727
}// end loop over 'r'
3729
// Table(s) of coefficients.
3730
static const double coefficients0[10] = \
3731
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
3733
// Tables of derivatives of the polynomial base (transpose).
3734
static const double dmats0[10][10] = \
3735
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3736
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3737
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3738
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3739
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3740
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3741
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3742
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3743
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3744
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3746
static const double dmats1[10][10] = \
3747
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3748
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3749
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3750
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3751
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3752
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3753
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3754
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3755
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3756
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3758
static const double dmats2[10][10] = \
3759
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3760
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3761
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3762
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3763
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3764
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3765
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3766
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3767
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3768
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
3770
// Compute reference derivatives.
3771
// Declare pointer to array of derivatives on FIAT element.
3772
double *derivatives = new double[num_derivatives];
3773
for (unsigned int r = 0; r < num_derivatives; r++)
3775
derivatives[r] = 0.00000000;
3776
}// end loop over 'r'
3778
// Declare derivative matrix (of polynomial basis).
3779
double dmats[10][10] = \
3780
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3781
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3782
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3783
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3784
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3785
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3786
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
3787
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
3788
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
3789
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3791
// Declare (auxiliary) derivative matrix (of polynomial basis).
3792
double dmats_old[10][10] = \
3793
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3794
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3795
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3796
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3797
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3798
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
3799
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
3800
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
3801
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
3802
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
3804
// Loop possible derivatives.
3805
for (unsigned int r = 0; r < num_derivatives; r++)
3807
// Resetting dmats values to compute next derivative.
3808
for (unsigned int t = 0; t < 10; t++)
3810
for (unsigned int u = 0; u < 10; u++)
3812
dmats[t][u] = 0.00000000;
3815
dmats[t][u] = 1.00000000;
3818
}// end loop over 'u'
3819
}// end loop over 't'
3821
// Looping derivative order to generate dmats.
3822
for (unsigned int s = 0; s < n; s++)
3824
// Updating dmats_old with new values and resetting dmats.
3825
for (unsigned int t = 0; t < 10; t++)
3827
for (unsigned int u = 0; u < 10; u++)
3829
dmats_old[t][u] = dmats[t][u];
3830
dmats[t][u] = 0.00000000;
3831
}// end loop over 'u'
3832
}// end loop over 't'
3834
// Update dmats using an inner product.
3835
if (combinations[r][s] == 0)
3837
for (unsigned int t = 0; t < 10; t++)
3839
for (unsigned int u = 0; u < 10; u++)
3841
for (unsigned int tu = 0; tu < 10; tu++)
3843
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
3844
}// end loop over 'tu'
3845
}// end loop over 'u'
3846
}// end loop over 't'
3849
if (combinations[r][s] == 1)
3851
for (unsigned int t = 0; t < 10; t++)
3853
for (unsigned int u = 0; u < 10; u++)
3855
for (unsigned int tu = 0; tu < 10; tu++)
3857
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
3858
}// end loop over 'tu'
3859
}// end loop over 'u'
3860
}// end loop over 't'
3863
if (combinations[r][s] == 2)
3865
for (unsigned int t = 0; t < 10; t++)
3867
for (unsigned int u = 0; u < 10; u++)
3869
for (unsigned int tu = 0; tu < 10; tu++)
3871
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
3872
}// end loop over 'tu'
3873
}// end loop over 'u'
3874
}// end loop over 't'
3877
}// end loop over 's'
3878
for (unsigned int s = 0; s < 10; s++)
3880
for (unsigned int t = 0; t < 10; t++)
3882
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3883
}// end loop over 't'
3884
}// end loop over 's'
3885
}// end loop over 'r'
3887
// Transform derivatives back to physical element
3888
for (unsigned int r = 0; r < num_derivatives; r++)
3890
for (unsigned int s = 0; s < num_derivatives; s++)
3892
values[r] += transform[r][s]*derivatives[s];
3893
}// end loop over 's'
3894
}// end loop over 'r'
3896
// Delete pointer to array of derivatives on FIAT element
3897
delete [] derivatives;
3899
// Delete pointer to array of combinations of derivatives and transform
3900
for (unsigned int r = 0; r < num_derivatives; r++)
3902
delete [] combinations[r];
3903
}// end loop over 'r'
3904
delete [] combinations;
3905
for (unsigned int r = 0; r < num_derivatives; r++)
3907
delete [] transform[r];
3908
}// end loop over 'r'
3909
delete [] transform;
647
3916
/// Evaluate order n derivatives of all basis functions at given point in cell
1446
7278
values[r] = 0.00000000;
1447
7279
}// end loop over 'r'
1449
if (0 <= i && i <= 9)
1451
// Map degree of freedom to element degree of freedom
1452
const unsigned int dof = i;
1454
// Array of basisvalues.
1455
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1457
// Declare helper variables.
1458
unsigned int rr = 0;
1459
unsigned int ss = 0;
1460
unsigned int tt = 0;
1461
double tmp5 = 0.00000000;
1462
double tmp6 = 0.00000000;
1463
double tmp7 = 0.00000000;
1464
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1465
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1466
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1467
double tmp3 = 0.50000000*(1.00000000 - Z);
1468
double tmp4 = tmp3*tmp3;
1470
// Compute basisvalues.
1471
basisvalues[0] = 1.00000000;
1472
basisvalues[1] = tmp0;
1473
for (unsigned int r = 1; r < 2; r++)
1475
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1476
ss = r*(r + 1)*(r + 2)/6;
1477
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1478
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1479
}// end loop over 'r'
1480
for (unsigned int r = 0; r < 2; r++)
1482
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1483
ss = r*(r + 1)*(r + 2)/6;
1484
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1485
}// end loop over 'r'
1486
for (unsigned int r = 0; r < 1; r++)
1488
for (unsigned int s = 1; s < 2 - r; s++)
1490
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1491
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1492
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1493
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1494
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1495
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1496
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1497
}// end loop over 's'
1498
}// end loop over 'r'
1499
for (unsigned int r = 0; r < 2; r++)
1501
for (unsigned int s = 0; s < 2 - r; s++)
1503
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1504
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1505
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1506
}// end loop over 's'
1507
}// end loop over 'r'
1508
for (unsigned int r = 0; r < 1; r++)
1510
for (unsigned int s = 0; s < 1 - r; s++)
1512
for (unsigned int t = 1; t < 2 - r - s; t++)
1514
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1515
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1516
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1517
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1518
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1519
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1520
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1521
}// end loop over 't'
1522
}// end loop over 's'
1523
}// end loop over 'r'
1524
for (unsigned int r = 0; r < 3; r++)
1526
for (unsigned int s = 0; s < 3 - r; s++)
1528
for (unsigned int t = 0; t < 3 - r - s; t++)
1530
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1531
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1532
}// end loop over 't'
1533
}// end loop over 's'
1534
}// end loop over 'r'
1536
// Table(s) of coefficients.
1537
static const double coefficients0[10][10] = \
1538
{{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1539
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1540
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1541
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1542
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1543
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1544
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1545
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1546
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1547
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1549
// Tables of derivatives of the polynomial base (transpose).
1550
static const double dmats0[10][10] = \
1551
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1552
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1553
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1554
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1555
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1556
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1557
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1558
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1559
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1560
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1562
static const double dmats1[10][10] = \
1563
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1564
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1565
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1566
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1567
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1568
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1569
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1570
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1571
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1572
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1574
static const double dmats2[10][10] = \
1575
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1576
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1577
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1578
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1579
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1580
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1581
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1582
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1583
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1584
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1586
// Compute reference derivatives.
1587
// Declare pointer to array of derivatives on FIAT element.
1588
double *derivatives = new double[num_derivatives];
1589
for (unsigned int r = 0; r < num_derivatives; r++)
1591
derivatives[r] = 0.00000000;
1592
}// end loop over 'r'
1594
// Declare derivative matrix (of polynomial basis).
1595
double dmats[10][10] = \
1596
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1597
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1598
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1599
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1600
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1601
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1602
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1603
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1604
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1605
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1607
// Declare (auxiliary) derivative matrix (of polynomial basis).
1608
double dmats_old[10][10] = \
1609
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1610
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1611
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1612
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1613
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1614
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1615
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1616
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1617
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1618
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1620
// Loop possible derivatives.
1621
for (unsigned int r = 0; r < num_derivatives; r++)
1623
// Resetting dmats values to compute next derivative.
1624
for (unsigned int t = 0; t < 10; t++)
1626
for (unsigned int u = 0; u < 10; u++)
1628
dmats[t][u] = 0.00000000;
1631
dmats[t][u] = 1.00000000;
1634
}// end loop over 'u'
1635
}// end loop over 't'
1637
// Looping derivative order to generate dmats.
1638
for (unsigned int s = 0; s < n; s++)
1640
// Updating dmats_old with new values and resetting dmats.
1641
for (unsigned int t = 0; t < 10; t++)
1643
for (unsigned int u = 0; u < 10; u++)
1645
dmats_old[t][u] = dmats[t][u];
1646
dmats[t][u] = 0.00000000;
1647
}// end loop over 'u'
1648
}// end loop over 't'
1650
// Update dmats using an inner product.
1651
if (combinations[r][s] == 0)
1653
for (unsigned int t = 0; t < 10; t++)
1655
for (unsigned int u = 0; u < 10; u++)
1657
for (unsigned int tu = 0; tu < 10; tu++)
1659
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1660
}// end loop over 'tu'
1661
}// end loop over 'u'
1662
}// end loop over 't'
1665
if (combinations[r][s] == 1)
1667
for (unsigned int t = 0; t < 10; t++)
1669
for (unsigned int u = 0; u < 10; u++)
1671
for (unsigned int tu = 0; tu < 10; tu++)
1673
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1674
}// end loop over 'tu'
1675
}// end loop over 'u'
1676
}// end loop over 't'
1679
if (combinations[r][s] == 2)
1681
for (unsigned int t = 0; t < 10; t++)
1683
for (unsigned int u = 0; u < 10; u++)
1685
for (unsigned int tu = 0; tu < 10; tu++)
1687
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1688
}// end loop over 'tu'
1689
}// end loop over 'u'
1690
}// end loop over 't'
1693
}// end loop over 's'
1694
for (unsigned int s = 0; s < 10; s++)
1696
for (unsigned int t = 0; t < 10; t++)
1698
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1699
}// end loop over 't'
1700
}// end loop over 's'
1701
}// end loop over 'r'
1703
// Transform derivatives back to physical element
1704
for (unsigned int r = 0; r < num_derivatives; r++)
1706
for (unsigned int s = 0; s < num_derivatives; s++)
1708
values[r] += transform[r][s]*derivatives[s];
1709
}// end loop over 's'
1710
}// end loop over 'r'
1712
// Delete pointer to array of derivatives on FIAT element
1713
delete [] derivatives;
1715
// Delete pointer to array of combinations of derivatives and transform
1716
for (unsigned int r = 0; r < num_derivatives; r++)
1718
delete [] combinations[r];
1719
}// end loop over 'r'
1720
delete [] combinations;
1721
for (unsigned int r = 0; r < num_derivatives; r++)
1723
delete [] transform[r];
1724
}// end loop over 'r'
1725
delete [] transform;
1728
if (10 <= i && i <= 19)
1730
// Map degree of freedom to element degree of freedom
1731
const unsigned int dof = i - 10;
1733
// Array of basisvalues.
1734
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1736
// Declare helper variables.
1737
unsigned int rr = 0;
1738
unsigned int ss = 0;
1739
unsigned int tt = 0;
1740
double tmp5 = 0.00000000;
1741
double tmp6 = 0.00000000;
1742
double tmp7 = 0.00000000;
1743
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1744
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
1745
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
1746
double tmp3 = 0.50000000*(1.00000000 - Z);
1747
double tmp4 = tmp3*tmp3;
1749
// Compute basisvalues.
1750
basisvalues[0] = 1.00000000;
1751
basisvalues[1] = tmp0;
1752
for (unsigned int r = 1; r < 2; r++)
1754
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
1755
ss = r*(r + 1)*(r + 2)/6;
1756
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
1757
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
1758
}// end loop over 'r'
1759
for (unsigned int r = 0; r < 2; r++)
1761
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1762
ss = r*(r + 1)*(r + 2)/6;
1763
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1764
}// end loop over 'r'
1765
for (unsigned int r = 0; r < 1; r++)
1767
for (unsigned int s = 1; s < 2 - r; s++)
1769
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
1770
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1771
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
1772
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1773
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1774
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
1775
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
1776
}// end loop over 's'
1777
}// end loop over 'r'
1778
for (unsigned int r = 0; r < 2; r++)
1780
for (unsigned int s = 0; s < 2 - r; s++)
1782
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1783
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1784
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1785
}// end loop over 's'
1786
}// end loop over 'r'
1787
for (unsigned int r = 0; r < 1; r++)
1789
for (unsigned int s = 0; s < 1 - r; s++)
1791
for (unsigned int t = 1; t < 2 - r - s; t++)
1793
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
1794
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1795
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
1796
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1797
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1798
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
1799
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
1800
}// end loop over 't'
1801
}// end loop over 's'
1802
}// end loop over 'r'
1803
for (unsigned int r = 0; r < 3; r++)
1805
for (unsigned int s = 0; s < 3 - r; s++)
1807
for (unsigned int t = 0; t < 3 - r - s; t++)
1809
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1810
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1811
}// end loop over 't'
1812
}// end loop over 's'
1813
}// end loop over 'r'
1815
// Table(s) of coefficients.
1816
static const double coefficients0[10][10] = \
1817
{{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
1818
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
1819
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
1820
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
1821
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
1822
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
1823
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
1824
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
1825
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
1826
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
1828
// Tables of derivatives of the polynomial base (transpose).
1829
static const double dmats0[10][10] = \
1830
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1831
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1832
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1833
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1834
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1835
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1836
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1837
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1838
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1839
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1841
static const double dmats1[10][10] = \
1842
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1843
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1844
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1845
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1846
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1847
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1848
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1849
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1850
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1851
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1853
static const double dmats2[10][10] = \
1854
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1855
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1856
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1857
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1858
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1859
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1860
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1861
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1862
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1863
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1865
// Compute reference derivatives.
1866
// Declare pointer to array of derivatives on FIAT element.
1867
double *derivatives = new double[num_derivatives];
1868
for (unsigned int r = 0; r < num_derivatives; r++)
1870
derivatives[r] = 0.00000000;
1871
}// end loop over 'r'
1873
// Declare derivative matrix (of polynomial basis).
1874
double dmats[10][10] = \
1875
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1876
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1877
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1878
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1879
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1880
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1881
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1882
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1883
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1884
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1886
// Declare (auxiliary) derivative matrix (of polynomial basis).
1887
double dmats_old[10][10] = \
1888
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1889
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1890
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1891
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1892
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1893
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1894
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1895
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1896
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1897
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1899
// Loop possible derivatives.
1900
for (unsigned int r = 0; r < num_derivatives; r++)
1902
// Resetting dmats values to compute next derivative.
1903
for (unsigned int t = 0; t < 10; t++)
1905
for (unsigned int u = 0; u < 10; u++)
1907
dmats[t][u] = 0.00000000;
1910
dmats[t][u] = 1.00000000;
1913
}// end loop over 'u'
1914
}// end loop over 't'
1916
// Looping derivative order to generate dmats.
1917
for (unsigned int s = 0; s < n; s++)
1919
// Updating dmats_old with new values and resetting dmats.
1920
for (unsigned int t = 0; t < 10; t++)
1922
for (unsigned int u = 0; u < 10; u++)
1924
dmats_old[t][u] = dmats[t][u];
1925
dmats[t][u] = 0.00000000;
1926
}// end loop over 'u'
1927
}// end loop over 't'
1929
// Update dmats using an inner product.
1930
if (combinations[r][s] == 0)
1932
for (unsigned int t = 0; t < 10; t++)
1934
for (unsigned int u = 0; u < 10; u++)
1936
for (unsigned int tu = 0; tu < 10; tu++)
1938
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1939
}// end loop over 'tu'
1940
}// end loop over 'u'
1941
}// end loop over 't'
1944
if (combinations[r][s] == 1)
1946
for (unsigned int t = 0; t < 10; t++)
1948
for (unsigned int u = 0; u < 10; u++)
1950
for (unsigned int tu = 0; tu < 10; tu++)
1952
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1953
}// end loop over 'tu'
1954
}// end loop over 'u'
1955
}// end loop over 't'
1958
if (combinations[r][s] == 2)
1960
for (unsigned int t = 0; t < 10; t++)
1962
for (unsigned int u = 0; u < 10; u++)
1964
for (unsigned int tu = 0; tu < 10; tu++)
1966
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1967
}// end loop over 'tu'
1968
}// end loop over 'u'
1969
}// end loop over 't'
1972
}// end loop over 's'
1973
for (unsigned int s = 0; s < 10; s++)
1975
for (unsigned int t = 0; t < 10; t++)
1977
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1978
}// end loop over 't'
1979
}// end loop over 's'
1980
}// end loop over 'r'
1982
// Transform derivatives back to physical element
1983
for (unsigned int r = 0; r < num_derivatives; r++)
1985
for (unsigned int s = 0; s < num_derivatives; s++)
1987
values[num_derivatives + r] += transform[r][s]*derivatives[s];
1988
}// end loop over 's'
1989
}// end loop over 'r'
1991
// Delete pointer to array of derivatives on FIAT element
1992
delete [] derivatives;
1994
// Delete pointer to array of combinations of derivatives and transform
1995
for (unsigned int r = 0; r < num_derivatives; r++)
1997
delete [] combinations[r];
1998
}// end loop over 'r'
1999
delete [] combinations;
2000
for (unsigned int r = 0; r < num_derivatives; r++)
2002
delete [] transform[r];
2003
}// end loop over 'r'
2004
delete [] transform;
2007
if (20 <= i && i <= 29)
2009
// Map degree of freedom to element degree of freedom
2010
const unsigned int dof = i - 20;
2012
// Array of basisvalues.
2013
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2015
// Declare helper variables.
2016
unsigned int rr = 0;
2017
unsigned int ss = 0;
2018
unsigned int tt = 0;
2019
double tmp5 = 0.00000000;
2020
double tmp6 = 0.00000000;
2021
double tmp7 = 0.00000000;
2022
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
2023
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
2024
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
2025
double tmp3 = 0.50000000*(1.00000000 - Z);
2026
double tmp4 = tmp3*tmp3;
2028
// Compute basisvalues.
2029
basisvalues[0] = 1.00000000;
2030
basisvalues[1] = tmp0;
2031
for (unsigned int r = 1; r < 2; r++)
2033
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
2034
ss = r*(r + 1)*(r + 2)/6;
2035
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
2036
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
2037
}// end loop over 'r'
2038
for (unsigned int r = 0; r < 2; r++)
2040
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
2041
ss = r*(r + 1)*(r + 2)/6;
2042
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
2043
}// end loop over 'r'
2044
for (unsigned int r = 0; r < 1; r++)
2046
for (unsigned int s = 1; s < 2 - r; s++)
2048
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
2049
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2050
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
2051
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2052
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2053
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
2054
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
2055
}// end loop over 's'
2056
}// end loop over 'r'
2057
for (unsigned int r = 0; r < 2; r++)
2059
for (unsigned int s = 0; s < 2 - r; s++)
2061
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
2062
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
2063
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
2064
}// end loop over 's'
2065
}// end loop over 'r'
2066
for (unsigned int r = 0; r < 1; r++)
2068
for (unsigned int s = 0; s < 1 - r; s++)
2070
for (unsigned int t = 1; t < 2 - r - s; t++)
2072
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
2073
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2074
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
2075
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2076
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2077
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
2078
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
2079
}// end loop over 't'
2080
}// end loop over 's'
2081
}// end loop over 'r'
2082
for (unsigned int r = 0; r < 3; r++)
2084
for (unsigned int s = 0; s < 3 - r; s++)
2086
for (unsigned int t = 0; t < 3 - r - s; t++)
2088
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
2089
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
2090
}// end loop over 't'
2091
}// end loop over 's'
2092
}// end loop over 'r'
2094
// Table(s) of coefficients.
2095
static const double coefficients0[10][10] = \
2096
{{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842},
2097
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842},
2098
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842},
2099
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053},
2100
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368},
2101
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368},
2102
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842},
2103
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368},
2104
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842},
2105
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842}};
2107
// Tables of derivatives of the polynomial base (transpose).
2108
static const double dmats0[10][10] = \
2109
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2110
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2111
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2112
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2113
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2114
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2115
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2116
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2117
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2118
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2120
static const double dmats1[10][10] = \
2121
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2122
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2123
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2124
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2125
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2126
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2127
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2128
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2129
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2130
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2132
static const double dmats2[10][10] = \
2133
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2134
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2135
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2136
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2137
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2138
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2139
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2140
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2141
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2142
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2144
// Compute reference derivatives.
2145
// Declare pointer to array of derivatives on FIAT element.
2146
double *derivatives = new double[num_derivatives];
2147
for (unsigned int r = 0; r < num_derivatives; r++)
2149
derivatives[r] = 0.00000000;
2150
}// end loop over 'r'
2152
// Declare derivative matrix (of polynomial basis).
2153
double dmats[10][10] = \
2154
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2155
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2156
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2157
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2158
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2159
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2160
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2161
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2162
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2163
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2165
// Declare (auxiliary) derivative matrix (of polynomial basis).
2166
double dmats_old[10][10] = \
2167
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2168
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2169
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2170
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2171
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2172
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2173
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2174
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2175
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2176
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2178
// Loop possible derivatives.
2179
for (unsigned int r = 0; r < num_derivatives; r++)
2181
// Resetting dmats values to compute next derivative.
2182
for (unsigned int t = 0; t < 10; t++)
2184
for (unsigned int u = 0; u < 10; u++)
2186
dmats[t][u] = 0.00000000;
2189
dmats[t][u] = 1.00000000;
2192
}// end loop over 'u'
2193
}// end loop over 't'
2195
// Looping derivative order to generate dmats.
2196
for (unsigned int s = 0; s < n; s++)
2198
// Updating dmats_old with new values and resetting dmats.
2199
for (unsigned int t = 0; t < 10; t++)
2201
for (unsigned int u = 0; u < 10; u++)
2203
dmats_old[t][u] = dmats[t][u];
2204
dmats[t][u] = 0.00000000;
2205
}// end loop over 'u'
2206
}// end loop over 't'
2208
// Update dmats using an inner product.
2209
if (combinations[r][s] == 0)
2211
for (unsigned int t = 0; t < 10; t++)
2213
for (unsigned int u = 0; u < 10; u++)
2215
for (unsigned int tu = 0; tu < 10; tu++)
2217
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2218
}// end loop over 'tu'
2219
}// end loop over 'u'
2220
}// end loop over 't'
2223
if (combinations[r][s] == 1)
2225
for (unsigned int t = 0; t < 10; t++)
2227
for (unsigned int u = 0; u < 10; u++)
2229
for (unsigned int tu = 0; tu < 10; tu++)
2231
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2232
}// end loop over 'tu'
2233
}// end loop over 'u'
2234
}// end loop over 't'
2237
if (combinations[r][s] == 2)
2239
for (unsigned int t = 0; t < 10; t++)
2241
for (unsigned int u = 0; u < 10; u++)
2243
for (unsigned int tu = 0; tu < 10; tu++)
2245
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
2246
}// end loop over 'tu'
2247
}// end loop over 'u'
2248
}// end loop over 't'
2251
}// end loop over 's'
2252
for (unsigned int s = 0; s < 10; s++)
2254
for (unsigned int t = 0; t < 10; t++)
2256
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
2257
}// end loop over 't'
2258
}// end loop over 's'
2259
}// end loop over 'r'
2261
// Transform derivatives back to physical element
2262
for (unsigned int r = 0; r < num_derivatives; r++)
2264
for (unsigned int s = 0; s < num_derivatives; s++)
2266
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
2267
}// end loop over 's'
2268
}// end loop over 'r'
2270
// Delete pointer to array of derivatives on FIAT element
2271
delete [] derivatives;
2273
// Delete pointer to array of combinations of derivatives and transform
2274
for (unsigned int r = 0; r < num_derivatives; r++)
2276
delete [] combinations[r];
2277
}// end loop over 'r'
2278
delete [] combinations;
2279
for (unsigned int r = 0; r < num_derivatives; r++)
2281
delete [] transform[r];
2282
}// end loop over 'r'
2283
delete [] transform;
7286
// Array of basisvalues.
7287
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
7289
// Declare helper variables.
7290
unsigned int rr = 0;
7291
unsigned int ss = 0;
7292
unsigned int tt = 0;
7293
double tmp5 = 0.00000000;
7294
double tmp6 = 0.00000000;
7295
double tmp7 = 0.00000000;
7296
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
7297
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
7298
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
7299
double tmp3 = 0.50000000*(1.00000000 - Z);
7300
double tmp4 = tmp3*tmp3;
7302
// Compute basisvalues.
7303
basisvalues[0] = 1.00000000;
7304
basisvalues[1] = tmp0;
7305
for (unsigned int r = 1; r < 2; r++)
7307
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
7308
ss = r*(r + 1)*(r + 2)/6;
7309
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
7310
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
7311
}// end loop over 'r'
7312
for (unsigned int r = 0; r < 2; r++)
7314
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
7315
ss = r*(r + 1)*(r + 2)/6;
7316
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
7317
}// end loop over 'r'
7318
for (unsigned int r = 0; r < 1; r++)
7320
for (unsigned int s = 1; s < 2 - r; s++)
7322
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
7323
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
7324
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
7325
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7326
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7327
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7328
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
7329
}// end loop over 's'
7330
}// end loop over 'r'
7331
for (unsigned int r = 0; r < 2; r++)
7333
for (unsigned int s = 0; s < 2 - r; s++)
7335
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
7336
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
7337
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
7338
}// end loop over 's'
7339
}// end loop over 'r'
7340
for (unsigned int r = 0; r < 1; r++)
7342
for (unsigned int s = 0; s < 1 - r; s++)
7344
for (unsigned int t = 1; t < 2 - r - s; t++)
7346
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
7347
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
7348
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
7349
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7350
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7351
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7352
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
7353
}// end loop over 't'
7354
}// end loop over 's'
7355
}// end loop over 'r'
7356
for (unsigned int r = 0; r < 3; r++)
7358
for (unsigned int s = 0; s < 3 - r; s++)
7360
for (unsigned int t = 0; t < 3 - r - s; t++)
7362
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
7363
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
7364
}// end loop over 't'
7365
}// end loop over 's'
7366
}// end loop over 'r'
7368
// Table(s) of coefficients.
7369
static const double coefficients0[10] = \
7370
{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
7372
// Tables of derivatives of the polynomial base (transpose).
7373
static const double dmats0[10][10] = \
7374
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7375
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7376
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7377
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7378
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7379
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7380
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7381
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7382
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7383
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7385
static const double dmats1[10][10] = \
7386
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7387
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7388
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7389
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7390
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7391
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7392
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7393
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7394
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7395
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7397
static const double dmats2[10][10] = \
7398
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7399
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7400
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7401
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7402
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7403
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7404
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7405
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7406
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7407
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7409
// Compute reference derivatives.
7410
// Declare pointer to array of derivatives on FIAT element.
7411
double *derivatives = new double[num_derivatives];
7412
for (unsigned int r = 0; r < num_derivatives; r++)
7414
derivatives[r] = 0.00000000;
7415
}// end loop over 'r'
7417
// Declare derivative matrix (of polynomial basis).
7418
double dmats[10][10] = \
7419
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7420
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7421
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7422
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7423
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7424
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7425
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
7426
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
7427
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
7428
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
7430
// Declare (auxiliary) derivative matrix (of polynomial basis).
7431
double dmats_old[10][10] = \
7432
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7433
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7434
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7435
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7436
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7437
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7438
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
7439
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
7440
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
7441
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
7443
// Loop possible derivatives.
7444
for (unsigned int r = 0; r < num_derivatives; r++)
7446
// Resetting dmats values to compute next derivative.
7447
for (unsigned int t = 0; t < 10; t++)
7449
for (unsigned int u = 0; u < 10; u++)
7451
dmats[t][u] = 0.00000000;
7454
dmats[t][u] = 1.00000000;
7457
}// end loop over 'u'
7458
}// end loop over 't'
7460
// Looping derivative order to generate dmats.
7461
for (unsigned int s = 0; s < n; s++)
7463
// Updating dmats_old with new values and resetting dmats.
7464
for (unsigned int t = 0; t < 10; t++)
7466
for (unsigned int u = 0; u < 10; u++)
7468
dmats_old[t][u] = dmats[t][u];
7469
dmats[t][u] = 0.00000000;
7470
}// end loop over 'u'
7471
}// end loop over 't'
7473
// Update dmats using an inner product.
7474
if (combinations[r][s] == 0)
7476
for (unsigned int t = 0; t < 10; t++)
7478
for (unsigned int u = 0; u < 10; u++)
7480
for (unsigned int tu = 0; tu < 10; tu++)
7482
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
7483
}// end loop over 'tu'
7484
}// end loop over 'u'
7485
}// end loop over 't'
7488
if (combinations[r][s] == 1)
7490
for (unsigned int t = 0; t < 10; t++)
7492
for (unsigned int u = 0; u < 10; u++)
7494
for (unsigned int tu = 0; tu < 10; tu++)
7496
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
7497
}// end loop over 'tu'
7498
}// end loop over 'u'
7499
}// end loop over 't'
7502
if (combinations[r][s] == 2)
7504
for (unsigned int t = 0; t < 10; t++)
7506
for (unsigned int u = 0; u < 10; u++)
7508
for (unsigned int tu = 0; tu < 10; tu++)
7510
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
7511
}// end loop over 'tu'
7512
}// end loop over 'u'
7513
}// end loop over 't'
7516
}// end loop over 's'
7517
for (unsigned int s = 0; s < 10; s++)
7519
for (unsigned int t = 0; t < 10; t++)
7521
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
7522
}// end loop over 't'
7523
}// end loop over 's'
7524
}// end loop over 'r'
7526
// Transform derivatives back to physical element
7527
for (unsigned int r = 0; r < num_derivatives; r++)
7529
for (unsigned int s = 0; s < num_derivatives; s++)
7531
values[r] += transform[r][s]*derivatives[s];
7532
}// end loop over 's'
7533
}// end loop over 'r'
7535
// Delete pointer to array of derivatives on FIAT element
7536
delete [] derivatives;
7538
// Delete pointer to array of combinations of derivatives and transform
7539
for (unsigned int r = 0; r < num_derivatives; r++)
7541
delete [] combinations[r];
7542
}// end loop over 'r'
7543
delete [] combinations;
7544
for (unsigned int r = 0; r < num_derivatives; r++)
7546
delete [] transform[r];
7547
}// end loop over 'r'
7548
delete [] transform;
7554
// Array of basisvalues.
7555
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
7557
// Declare helper variables.
7558
unsigned int rr = 0;
7559
unsigned int ss = 0;
7560
unsigned int tt = 0;
7561
double tmp5 = 0.00000000;
7562
double tmp6 = 0.00000000;
7563
double tmp7 = 0.00000000;
7564
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
7565
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
7566
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
7567
double tmp3 = 0.50000000*(1.00000000 - Z);
7568
double tmp4 = tmp3*tmp3;
7570
// Compute basisvalues.
7571
basisvalues[0] = 1.00000000;
7572
basisvalues[1] = tmp0;
7573
for (unsigned int r = 1; r < 2; r++)
7575
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
7576
ss = r*(r + 1)*(r + 2)/6;
7577
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
7578
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
7579
}// end loop over 'r'
7580
for (unsigned int r = 0; r < 2; r++)
7582
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
7583
ss = r*(r + 1)*(r + 2)/6;
7584
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
7585
}// end loop over 'r'
7586
for (unsigned int r = 0; r < 1; r++)
7588
for (unsigned int s = 1; s < 2 - r; s++)
7590
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
7591
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
7592
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
7593
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7594
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7595
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7596
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
7597
}// end loop over 's'
7598
}// end loop over 'r'
7599
for (unsigned int r = 0; r < 2; r++)
7601
for (unsigned int s = 0; s < 2 - r; s++)
7603
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
7604
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
7605
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
7606
}// end loop over 's'
7607
}// end loop over 'r'
7608
for (unsigned int r = 0; r < 1; r++)
7610
for (unsigned int s = 0; s < 1 - r; s++)
7612
for (unsigned int t = 1; t < 2 - r - s; t++)
7614
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
7615
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
7616
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
7617
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7618
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7619
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7620
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
7621
}// end loop over 't'
7622
}// end loop over 's'
7623
}// end loop over 'r'
7624
for (unsigned int r = 0; r < 3; r++)
7626
for (unsigned int s = 0; s < 3 - r; s++)
7628
for (unsigned int t = 0; t < 3 - r - s; t++)
7630
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
7631
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
7632
}// end loop over 't'
7633
}// end loop over 's'
7634
}// end loop over 'r'
7636
// Table(s) of coefficients.
7637
static const double coefficients0[10] = \
7638
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
7640
// Tables of derivatives of the polynomial base (transpose).
7641
static const double dmats0[10][10] = \
7642
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7643
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7644
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7645
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7646
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7647
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7648
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7649
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7650
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7651
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7653
static const double dmats1[10][10] = \
7654
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7655
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7656
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7657
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7658
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7659
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7660
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7661
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7662
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7663
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7665
static const double dmats2[10][10] = \
7666
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7667
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7668
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7669
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7670
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7671
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7672
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7673
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7674
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7675
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7677
// Compute reference derivatives.
7678
// Declare pointer to array of derivatives on FIAT element.
7679
double *derivatives = new double[num_derivatives];
7680
for (unsigned int r = 0; r < num_derivatives; r++)
7682
derivatives[r] = 0.00000000;
7683
}// end loop over 'r'
7685
// Declare derivative matrix (of polynomial basis).
7686
double dmats[10][10] = \
7687
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7688
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7689
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7690
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7691
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7692
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7693
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
7694
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
7695
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
7696
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
7698
// Declare (auxiliary) derivative matrix (of polynomial basis).
7699
double dmats_old[10][10] = \
7700
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7701
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7702
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7703
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7704
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7705
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7706
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
7707
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
7708
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
7709
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
7711
// Loop possible derivatives.
7712
for (unsigned int r = 0; r < num_derivatives; r++)
7714
// Resetting dmats values to compute next derivative.
7715
for (unsigned int t = 0; t < 10; t++)
7717
for (unsigned int u = 0; u < 10; u++)
7719
dmats[t][u] = 0.00000000;
7722
dmats[t][u] = 1.00000000;
7725
}// end loop over 'u'
7726
}// end loop over 't'
7728
// Looping derivative order to generate dmats.
7729
for (unsigned int s = 0; s < n; s++)
7731
// Updating dmats_old with new values and resetting dmats.
7732
for (unsigned int t = 0; t < 10; t++)
7734
for (unsigned int u = 0; u < 10; u++)
7736
dmats_old[t][u] = dmats[t][u];
7737
dmats[t][u] = 0.00000000;
7738
}// end loop over 'u'
7739
}// end loop over 't'
7741
// Update dmats using an inner product.
7742
if (combinations[r][s] == 0)
7744
for (unsigned int t = 0; t < 10; t++)
7746
for (unsigned int u = 0; u < 10; u++)
7748
for (unsigned int tu = 0; tu < 10; tu++)
7750
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
7751
}// end loop over 'tu'
7752
}// end loop over 'u'
7753
}// end loop over 't'
7756
if (combinations[r][s] == 1)
7758
for (unsigned int t = 0; t < 10; t++)
7760
for (unsigned int u = 0; u < 10; u++)
7762
for (unsigned int tu = 0; tu < 10; tu++)
7764
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
7765
}// end loop over 'tu'
7766
}// end loop over 'u'
7767
}// end loop over 't'
7770
if (combinations[r][s] == 2)
7772
for (unsigned int t = 0; t < 10; t++)
7774
for (unsigned int u = 0; u < 10; u++)
7776
for (unsigned int tu = 0; tu < 10; tu++)
7778
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
7779
}// end loop over 'tu'
7780
}// end loop over 'u'
7781
}// end loop over 't'
7784
}// end loop over 's'
7785
for (unsigned int s = 0; s < 10; s++)
7787
for (unsigned int t = 0; t < 10; t++)
7789
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
7790
}// end loop over 't'
7791
}// end loop over 's'
7792
}// end loop over 'r'
7794
// Transform derivatives back to physical element
7795
for (unsigned int r = 0; r < num_derivatives; r++)
7797
for (unsigned int s = 0; s < num_derivatives; s++)
7799
values[r] += transform[r][s]*derivatives[s];
7800
}// end loop over 's'
7801
}// end loop over 'r'
7803
// Delete pointer to array of derivatives on FIAT element
7804
delete [] derivatives;
7806
// Delete pointer to array of combinations of derivatives and transform
7807
for (unsigned int r = 0; r < num_derivatives; r++)
7809
delete [] combinations[r];
7810
}// end loop over 'r'
7811
delete [] combinations;
7812
for (unsigned int r = 0; r < num_derivatives; r++)
7814
delete [] transform[r];
7815
}// end loop over 'r'
7816
delete [] transform;
7822
// Array of basisvalues.
7823
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
7825
// Declare helper variables.
7826
unsigned int rr = 0;
7827
unsigned int ss = 0;
7828
unsigned int tt = 0;
7829
double tmp5 = 0.00000000;
7830
double tmp6 = 0.00000000;
7831
double tmp7 = 0.00000000;
7832
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
7833
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
7834
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
7835
double tmp3 = 0.50000000*(1.00000000 - Z);
7836
double tmp4 = tmp3*tmp3;
7838
// Compute basisvalues.
7839
basisvalues[0] = 1.00000000;
7840
basisvalues[1] = tmp0;
7841
for (unsigned int r = 1; r < 2; r++)
7843
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
7844
ss = r*(r + 1)*(r + 2)/6;
7845
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
7846
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
7847
}// end loop over 'r'
7848
for (unsigned int r = 0; r < 2; r++)
7850
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
7851
ss = r*(r + 1)*(r + 2)/6;
7852
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
7853
}// end loop over 'r'
7854
for (unsigned int r = 0; r < 1; r++)
7856
for (unsigned int s = 1; s < 2 - r; s++)
7858
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
7859
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
7860
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
7861
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7862
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7863
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
7864
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
7865
}// end loop over 's'
7866
}// end loop over 'r'
7867
for (unsigned int r = 0; r < 2; r++)
7869
for (unsigned int s = 0; s < 2 - r; s++)
7871
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
7872
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
7873
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
7874
}// end loop over 's'
7875
}// end loop over 'r'
7876
for (unsigned int r = 0; r < 1; r++)
7878
for (unsigned int s = 0; s < 1 - r; s++)
7880
for (unsigned int t = 1; t < 2 - r - s; t++)
7882
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
7883
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
7884
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
7885
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7886
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7887
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
7888
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
7889
}// end loop over 't'
7890
}// end loop over 's'
7891
}// end loop over 'r'
7892
for (unsigned int r = 0; r < 3; r++)
7894
for (unsigned int s = 0; s < 3 - r; s++)
7896
for (unsigned int t = 0; t < 3 - r - s; t++)
7898
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
7899
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
7900
}// end loop over 't'
7901
}// end loop over 's'
7902
}// end loop over 'r'
7904
// Table(s) of coefficients.
7905
static const double coefficients0[10] = \
7906
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
7908
// Tables of derivatives of the polynomial base (transpose).
7909
static const double dmats0[10][10] = \
7910
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7911
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7912
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7913
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7914
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7915
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7916
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7917
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7918
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7919
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7921
static const double dmats1[10][10] = \
7922
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7923
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7924
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7925
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7926
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7927
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7928
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7929
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7930
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7931
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7933
static const double dmats2[10][10] = \
7934
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7935
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7936
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7937
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7938
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7939
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7940
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7941
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7942
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7943
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
7945
// Compute reference derivatives.
7946
// Declare pointer to array of derivatives on FIAT element.
7947
double *derivatives = new double[num_derivatives];
7948
for (unsigned int r = 0; r < num_derivatives; r++)
7950
derivatives[r] = 0.00000000;
7951
}// end loop over 'r'
7953
// Declare derivative matrix (of polynomial basis).
7954
double dmats[10][10] = \
7955
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7956
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7957
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7958
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7959
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7960
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7961
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
7962
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
7963
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
7964
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
7966
// Declare (auxiliary) derivative matrix (of polynomial basis).
7967
double dmats_old[10][10] = \
7968
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7969
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7970
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7971
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7972
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7973
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
7974
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
7975
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
7976
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
7977
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
7979
// Loop possible derivatives.
7980
for (unsigned int r = 0; r < num_derivatives; r++)
7982
// Resetting dmats values to compute next derivative.
7983
for (unsigned int t = 0; t < 10; t++)
7985
for (unsigned int u = 0; u < 10; u++)
7987
dmats[t][u] = 0.00000000;
7990
dmats[t][u] = 1.00000000;
7993
}// end loop over 'u'
7994
}// end loop over 't'
7996
// Looping derivative order to generate dmats.
7997
for (unsigned int s = 0; s < n; s++)
7999
// Updating dmats_old with new values and resetting dmats.
8000
for (unsigned int t = 0; t < 10; t++)
8002
for (unsigned int u = 0; u < 10; u++)
8004
dmats_old[t][u] = dmats[t][u];
8005
dmats[t][u] = 0.00000000;
8006
}// end loop over 'u'
8007
}// end loop over 't'
8009
// Update dmats using an inner product.
8010
if (combinations[r][s] == 0)
8012
for (unsigned int t = 0; t < 10; t++)
8014
for (unsigned int u = 0; u < 10; u++)
8016
for (unsigned int tu = 0; tu < 10; tu++)
8018
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
8019
}// end loop over 'tu'
8020
}// end loop over 'u'
8021
}// end loop over 't'
8024
if (combinations[r][s] == 1)
8026
for (unsigned int t = 0; t < 10; t++)
8028
for (unsigned int u = 0; u < 10; u++)
8030
for (unsigned int tu = 0; tu < 10; tu++)
8032
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
8033
}// end loop over 'tu'
8034
}// end loop over 'u'
8035
}// end loop over 't'
8038
if (combinations[r][s] == 2)
8040
for (unsigned int t = 0; t < 10; t++)
8042
for (unsigned int u = 0; u < 10; u++)
8044
for (unsigned int tu = 0; tu < 10; tu++)
8046
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
8047
}// end loop over 'tu'
8048
}// end loop over 'u'
8049
}// end loop over 't'
8052
}// end loop over 's'
8053
for (unsigned int s = 0; s < 10; s++)
8055
for (unsigned int t = 0; t < 10; t++)
8057
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
8058
}// end loop over 't'
8059
}// end loop over 's'
8060
}// end loop over 'r'
8062
// Transform derivatives back to physical element
8063
for (unsigned int r = 0; r < num_derivatives; r++)
8065
for (unsigned int s = 0; s < num_derivatives; s++)
8067
values[r] += transform[r][s]*derivatives[s];
8068
}// end loop over 's'
8069
}// end loop over 'r'
8071
// Delete pointer to array of derivatives on FIAT element
8072
delete [] derivatives;
8074
// Delete pointer to array of combinations of derivatives and transform
8075
for (unsigned int r = 0; r < num_derivatives; r++)
8077
delete [] combinations[r];
8078
}// end loop over 'r'
8079
delete [] combinations;
8080
for (unsigned int r = 0; r < num_derivatives; r++)
8082
delete [] transform[r];
8083
}// end loop over 'r'
8084
delete [] transform;
8090
// Array of basisvalues.
8091
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
8093
// Declare helper variables.
8094
unsigned int rr = 0;
8095
unsigned int ss = 0;
8096
unsigned int tt = 0;
8097
double tmp5 = 0.00000000;
8098
double tmp6 = 0.00000000;
8099
double tmp7 = 0.00000000;
8100
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
8101
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
8102
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
8103
double tmp3 = 0.50000000*(1.00000000 - Z);
8104
double tmp4 = tmp3*tmp3;
8106
// Compute basisvalues.
8107
basisvalues[0] = 1.00000000;
8108
basisvalues[1] = tmp0;
8109
for (unsigned int r = 1; r < 2; r++)
8111
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
8112
ss = r*(r + 1)*(r + 2)/6;
8113
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
8114
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
8115
}// end loop over 'r'
8116
for (unsigned int r = 0; r < 2; r++)
8118
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
8119
ss = r*(r + 1)*(r + 2)/6;
8120
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
8121
}// end loop over 'r'
8122
for (unsigned int r = 0; r < 1; r++)
8124
for (unsigned int s = 1; s < 2 - r; s++)
8126
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
8127
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8128
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
8129
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8130
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8131
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8132
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
8133
}// end loop over 's'
8134
}// end loop over 'r'
8135
for (unsigned int r = 0; r < 2; r++)
8137
for (unsigned int s = 0; s < 2 - r; s++)
8139
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
8140
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8141
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
8142
}// end loop over 's'
8143
}// end loop over 'r'
8144
for (unsigned int r = 0; r < 1; r++)
8146
for (unsigned int s = 0; s < 1 - r; s++)
8148
for (unsigned int t = 1; t < 2 - r - s; t++)
8150
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
8151
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8152
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
8153
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8154
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8155
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8156
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
8157
}// end loop over 't'
8158
}// end loop over 's'
8159
}// end loop over 'r'
8160
for (unsigned int r = 0; r < 3; r++)
8162
for (unsigned int s = 0; s < 3 - r; s++)
8164
for (unsigned int t = 0; t < 3 - r - s; t++)
8166
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8167
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
8168
}// end loop over 't'
8169
}// end loop over 's'
8170
}// end loop over 'r'
8172
// Table(s) of coefficients.
8173
static const double coefficients0[10] = \
8174
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
8176
// Tables of derivatives of the polynomial base (transpose).
8177
static const double dmats0[10][10] = \
8178
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8179
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8180
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8181
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8182
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8183
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8184
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8185
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8186
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8187
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8189
static const double dmats1[10][10] = \
8190
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8191
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8192
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8193
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8194
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8195
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8196
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8197
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8198
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8199
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8201
static const double dmats2[10][10] = \
8202
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8203
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8204
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8205
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8206
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8207
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8208
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8209
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8210
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8211
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8213
// Compute reference derivatives.
8214
// Declare pointer to array of derivatives on FIAT element.
8215
double *derivatives = new double[num_derivatives];
8216
for (unsigned int r = 0; r < num_derivatives; r++)
8218
derivatives[r] = 0.00000000;
8219
}// end loop over 'r'
8221
// Declare derivative matrix (of polynomial basis).
8222
double dmats[10][10] = \
8223
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8224
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8225
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8226
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8227
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8228
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8229
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
8230
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
8231
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
8232
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
8234
// Declare (auxiliary) derivative matrix (of polynomial basis).
8235
double dmats_old[10][10] = \
8236
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8237
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8238
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8239
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8240
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8241
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8242
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
8243
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
8244
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
8245
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
8247
// Loop possible derivatives.
8248
for (unsigned int r = 0; r < num_derivatives; r++)
8250
// Resetting dmats values to compute next derivative.
8251
for (unsigned int t = 0; t < 10; t++)
8253
for (unsigned int u = 0; u < 10; u++)
8255
dmats[t][u] = 0.00000000;
8258
dmats[t][u] = 1.00000000;
8261
}// end loop over 'u'
8262
}// end loop over 't'
8264
// Looping derivative order to generate dmats.
8265
for (unsigned int s = 0; s < n; s++)
8267
// Updating dmats_old with new values and resetting dmats.
8268
for (unsigned int t = 0; t < 10; t++)
8270
for (unsigned int u = 0; u < 10; u++)
8272
dmats_old[t][u] = dmats[t][u];
8273
dmats[t][u] = 0.00000000;
8274
}// end loop over 'u'
8275
}// end loop over 't'
8277
// Update dmats using an inner product.
8278
if (combinations[r][s] == 0)
8280
for (unsigned int t = 0; t < 10; t++)
8282
for (unsigned int u = 0; u < 10; u++)
8284
for (unsigned int tu = 0; tu < 10; tu++)
8286
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
8287
}// end loop over 'tu'
8288
}// end loop over 'u'
8289
}// end loop over 't'
8292
if (combinations[r][s] == 1)
8294
for (unsigned int t = 0; t < 10; t++)
8296
for (unsigned int u = 0; u < 10; u++)
8298
for (unsigned int tu = 0; tu < 10; tu++)
8300
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
8301
}// end loop over 'tu'
8302
}// end loop over 'u'
8303
}// end loop over 't'
8306
if (combinations[r][s] == 2)
8308
for (unsigned int t = 0; t < 10; t++)
8310
for (unsigned int u = 0; u < 10; u++)
8312
for (unsigned int tu = 0; tu < 10; tu++)
8314
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
8315
}// end loop over 'tu'
8316
}// end loop over 'u'
8317
}// end loop over 't'
8320
}// end loop over 's'
8321
for (unsigned int s = 0; s < 10; s++)
8323
for (unsigned int t = 0; t < 10; t++)
8325
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
8326
}// end loop over 't'
8327
}// end loop over 's'
8328
}// end loop over 'r'
8330
// Transform derivatives back to physical element
8331
for (unsigned int r = 0; r < num_derivatives; r++)
8333
for (unsigned int s = 0; s < num_derivatives; s++)
8335
values[r] += transform[r][s]*derivatives[s];
8336
}// end loop over 's'
8337
}// end loop over 'r'
8339
// Delete pointer to array of derivatives on FIAT element
8340
delete [] derivatives;
8342
// Delete pointer to array of combinations of derivatives and transform
8343
for (unsigned int r = 0; r < num_derivatives; r++)
8345
delete [] combinations[r];
8346
}// end loop over 'r'
8347
delete [] combinations;
8348
for (unsigned int r = 0; r < num_derivatives; r++)
8350
delete [] transform[r];
8351
}// end loop over 'r'
8352
delete [] transform;
8358
// Array of basisvalues.
8359
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
8361
// Declare helper variables.
8362
unsigned int rr = 0;
8363
unsigned int ss = 0;
8364
unsigned int tt = 0;
8365
double tmp5 = 0.00000000;
8366
double tmp6 = 0.00000000;
8367
double tmp7 = 0.00000000;
8368
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
8369
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
8370
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
8371
double tmp3 = 0.50000000*(1.00000000 - Z);
8372
double tmp4 = tmp3*tmp3;
8374
// Compute basisvalues.
8375
basisvalues[0] = 1.00000000;
8376
basisvalues[1] = tmp0;
8377
for (unsigned int r = 1; r < 2; r++)
8379
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
8380
ss = r*(r + 1)*(r + 2)/6;
8381
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
8382
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
8383
}// end loop over 'r'
8384
for (unsigned int r = 0; r < 2; r++)
8386
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
8387
ss = r*(r + 1)*(r + 2)/6;
8388
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
8389
}// end loop over 'r'
8390
for (unsigned int r = 0; r < 1; r++)
8392
for (unsigned int s = 1; s < 2 - r; s++)
8394
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
8395
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8396
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
8397
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8398
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8399
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8400
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
8401
}// end loop over 's'
8402
}// end loop over 'r'
8403
for (unsigned int r = 0; r < 2; r++)
8405
for (unsigned int s = 0; s < 2 - r; s++)
8407
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
8408
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8409
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
8410
}// end loop over 's'
8411
}// end loop over 'r'
8412
for (unsigned int r = 0; r < 1; r++)
8414
for (unsigned int s = 0; s < 1 - r; s++)
8416
for (unsigned int t = 1; t < 2 - r - s; t++)
8418
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
8419
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8420
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
8421
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8422
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8423
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8424
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
8425
}// end loop over 't'
8426
}// end loop over 's'
8427
}// end loop over 'r'
8428
for (unsigned int r = 0; r < 3; r++)
8430
for (unsigned int s = 0; s < 3 - r; s++)
8432
for (unsigned int t = 0; t < 3 - r - s; t++)
8434
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8435
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
8436
}// end loop over 't'
8437
}// end loop over 's'
8438
}// end loop over 'r'
8440
// Table(s) of coefficients.
8441
static const double coefficients0[10] = \
8442
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
8444
// Tables of derivatives of the polynomial base (transpose).
8445
static const double dmats0[10][10] = \
8446
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8447
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8448
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8449
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8450
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8451
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8452
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8453
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8454
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8455
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8457
static const double dmats1[10][10] = \
8458
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8459
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8460
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8461
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8462
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8463
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8464
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8465
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8466
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8467
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8469
static const double dmats2[10][10] = \
8470
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8471
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8472
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8473
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8474
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8475
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8476
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8477
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8478
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8479
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8481
// Compute reference derivatives.
8482
// Declare pointer to array of derivatives on FIAT element.
8483
double *derivatives = new double[num_derivatives];
8484
for (unsigned int r = 0; r < num_derivatives; r++)
8486
derivatives[r] = 0.00000000;
8487
}// end loop over 'r'
8489
// Declare derivative matrix (of polynomial basis).
8490
double dmats[10][10] = \
8491
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8492
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8493
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8494
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8495
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8496
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8497
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
8498
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
8499
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
8500
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
8502
// Declare (auxiliary) derivative matrix (of polynomial basis).
8503
double dmats_old[10][10] = \
8504
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8505
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8506
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8507
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8508
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8509
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8510
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
8511
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
8512
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
8513
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
8515
// Loop possible derivatives.
8516
for (unsigned int r = 0; r < num_derivatives; r++)
8518
// Resetting dmats values to compute next derivative.
8519
for (unsigned int t = 0; t < 10; t++)
8521
for (unsigned int u = 0; u < 10; u++)
8523
dmats[t][u] = 0.00000000;
8526
dmats[t][u] = 1.00000000;
8529
}// end loop over 'u'
8530
}// end loop over 't'
8532
// Looping derivative order to generate dmats.
8533
for (unsigned int s = 0; s < n; s++)
8535
// Updating dmats_old with new values and resetting dmats.
8536
for (unsigned int t = 0; t < 10; t++)
8538
for (unsigned int u = 0; u < 10; u++)
8540
dmats_old[t][u] = dmats[t][u];
8541
dmats[t][u] = 0.00000000;
8542
}// end loop over 'u'
8543
}// end loop over 't'
8545
// Update dmats using an inner product.
8546
if (combinations[r][s] == 0)
8548
for (unsigned int t = 0; t < 10; t++)
8550
for (unsigned int u = 0; u < 10; u++)
8552
for (unsigned int tu = 0; tu < 10; tu++)
8554
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
8555
}// end loop over 'tu'
8556
}// end loop over 'u'
8557
}// end loop over 't'
8560
if (combinations[r][s] == 1)
8562
for (unsigned int t = 0; t < 10; t++)
8564
for (unsigned int u = 0; u < 10; u++)
8566
for (unsigned int tu = 0; tu < 10; tu++)
8568
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
8569
}// end loop over 'tu'
8570
}// end loop over 'u'
8571
}// end loop over 't'
8574
if (combinations[r][s] == 2)
8576
for (unsigned int t = 0; t < 10; t++)
8578
for (unsigned int u = 0; u < 10; u++)
8580
for (unsigned int tu = 0; tu < 10; tu++)
8582
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
8583
}// end loop over 'tu'
8584
}// end loop over 'u'
8585
}// end loop over 't'
8588
}// end loop over 's'
8589
for (unsigned int s = 0; s < 10; s++)
8591
for (unsigned int t = 0; t < 10; t++)
8593
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
8594
}// end loop over 't'
8595
}// end loop over 's'
8596
}// end loop over 'r'
8598
// Transform derivatives back to physical element
8599
for (unsigned int r = 0; r < num_derivatives; r++)
8601
for (unsigned int s = 0; s < num_derivatives; s++)
8603
values[r] += transform[r][s]*derivatives[s];
8604
}// end loop over 's'
8605
}// end loop over 'r'
8607
// Delete pointer to array of derivatives on FIAT element
8608
delete [] derivatives;
8610
// Delete pointer to array of combinations of derivatives and transform
8611
for (unsigned int r = 0; r < num_derivatives; r++)
8613
delete [] combinations[r];
8614
}// end loop over 'r'
8615
delete [] combinations;
8616
for (unsigned int r = 0; r < num_derivatives; r++)
8618
delete [] transform[r];
8619
}// end loop over 'r'
8620
delete [] transform;
8626
// Array of basisvalues.
8627
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
8629
// Declare helper variables.
8630
unsigned int rr = 0;
8631
unsigned int ss = 0;
8632
unsigned int tt = 0;
8633
double tmp5 = 0.00000000;
8634
double tmp6 = 0.00000000;
8635
double tmp7 = 0.00000000;
8636
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
8637
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
8638
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
8639
double tmp3 = 0.50000000*(1.00000000 - Z);
8640
double tmp4 = tmp3*tmp3;
8642
// Compute basisvalues.
8643
basisvalues[0] = 1.00000000;
8644
basisvalues[1] = tmp0;
8645
for (unsigned int r = 1; r < 2; r++)
8647
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
8648
ss = r*(r + 1)*(r + 2)/6;
8649
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
8650
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
8651
}// end loop over 'r'
8652
for (unsigned int r = 0; r < 2; r++)
8654
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
8655
ss = r*(r + 1)*(r + 2)/6;
8656
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
8657
}// end loop over 'r'
8658
for (unsigned int r = 0; r < 1; r++)
8660
for (unsigned int s = 1; s < 2 - r; s++)
8662
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
8663
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8664
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
8665
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8666
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8667
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8668
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
8669
}// end loop over 's'
8670
}// end loop over 'r'
8671
for (unsigned int r = 0; r < 2; r++)
8673
for (unsigned int s = 0; s < 2 - r; s++)
8675
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
8676
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8677
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
8678
}// end loop over 's'
8679
}// end loop over 'r'
8680
for (unsigned int r = 0; r < 1; r++)
8682
for (unsigned int s = 0; s < 1 - r; s++)
8684
for (unsigned int t = 1; t < 2 - r - s; t++)
8686
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
8687
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8688
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
8689
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8690
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8691
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8692
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
8693
}// end loop over 't'
8694
}// end loop over 's'
8695
}// end loop over 'r'
8696
for (unsigned int r = 0; r < 3; r++)
8698
for (unsigned int s = 0; s < 3 - r; s++)
8700
for (unsigned int t = 0; t < 3 - r - s; t++)
8702
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8703
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
8704
}// end loop over 't'
8705
}// end loop over 's'
8706
}// end loop over 'r'
8708
// Table(s) of coefficients.
8709
static const double coefficients0[10] = \
8710
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
8712
// Tables of derivatives of the polynomial base (transpose).
8713
static const double dmats0[10][10] = \
8714
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8715
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8716
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8717
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8718
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8719
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8720
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8721
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8722
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8723
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8725
static const double dmats1[10][10] = \
8726
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8727
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8728
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8729
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8730
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8731
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8732
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8733
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8734
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8735
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8737
static const double dmats2[10][10] = \
8738
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8739
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8740
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8741
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8742
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8743
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8744
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8745
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8746
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8747
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8749
// Compute reference derivatives.
8750
// Declare pointer to array of derivatives on FIAT element.
8751
double *derivatives = new double[num_derivatives];
8752
for (unsigned int r = 0; r < num_derivatives; r++)
8754
derivatives[r] = 0.00000000;
8755
}// end loop over 'r'
8757
// Declare derivative matrix (of polynomial basis).
8758
double dmats[10][10] = \
8759
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8760
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8761
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8762
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8763
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8764
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8765
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
8766
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
8767
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
8768
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
8770
// Declare (auxiliary) derivative matrix (of polynomial basis).
8771
double dmats_old[10][10] = \
8772
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8773
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8774
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8775
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8776
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8777
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8778
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
8779
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
8780
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
8781
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
8783
// Loop possible derivatives.
8784
for (unsigned int r = 0; r < num_derivatives; r++)
8786
// Resetting dmats values to compute next derivative.
8787
for (unsigned int t = 0; t < 10; t++)
8789
for (unsigned int u = 0; u < 10; u++)
8791
dmats[t][u] = 0.00000000;
8794
dmats[t][u] = 1.00000000;
8797
}// end loop over 'u'
8798
}// end loop over 't'
8800
// Looping derivative order to generate dmats.
8801
for (unsigned int s = 0; s < n; s++)
8803
// Updating dmats_old with new values and resetting dmats.
8804
for (unsigned int t = 0; t < 10; t++)
8806
for (unsigned int u = 0; u < 10; u++)
8808
dmats_old[t][u] = dmats[t][u];
8809
dmats[t][u] = 0.00000000;
8810
}// end loop over 'u'
8811
}// end loop over 't'
8813
// Update dmats using an inner product.
8814
if (combinations[r][s] == 0)
8816
for (unsigned int t = 0; t < 10; t++)
8818
for (unsigned int u = 0; u < 10; u++)
8820
for (unsigned int tu = 0; tu < 10; tu++)
8822
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
8823
}// end loop over 'tu'
8824
}// end loop over 'u'
8825
}// end loop over 't'
8828
if (combinations[r][s] == 1)
8830
for (unsigned int t = 0; t < 10; t++)
8832
for (unsigned int u = 0; u < 10; u++)
8834
for (unsigned int tu = 0; tu < 10; tu++)
8836
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
8837
}// end loop over 'tu'
8838
}// end loop over 'u'
8839
}// end loop over 't'
8842
if (combinations[r][s] == 2)
8844
for (unsigned int t = 0; t < 10; t++)
8846
for (unsigned int u = 0; u < 10; u++)
8848
for (unsigned int tu = 0; tu < 10; tu++)
8850
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
8851
}// end loop over 'tu'
8852
}// end loop over 'u'
8853
}// end loop over 't'
8856
}// end loop over 's'
8857
for (unsigned int s = 0; s < 10; s++)
8859
for (unsigned int t = 0; t < 10; t++)
8861
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
8862
}// end loop over 't'
8863
}// end loop over 's'
8864
}// end loop over 'r'
8866
// Transform derivatives back to physical element
8867
for (unsigned int r = 0; r < num_derivatives; r++)
8869
for (unsigned int s = 0; s < num_derivatives; s++)
8871
values[r] += transform[r][s]*derivatives[s];
8872
}// end loop over 's'
8873
}// end loop over 'r'
8875
// Delete pointer to array of derivatives on FIAT element
8876
delete [] derivatives;
8878
// Delete pointer to array of combinations of derivatives and transform
8879
for (unsigned int r = 0; r < num_derivatives; r++)
8881
delete [] combinations[r];
8882
}// end loop over 'r'
8883
delete [] combinations;
8884
for (unsigned int r = 0; r < num_derivatives; r++)
8886
delete [] transform[r];
8887
}// end loop over 'r'
8888
delete [] transform;
8894
// Array of basisvalues.
8895
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
8897
// Declare helper variables.
8898
unsigned int rr = 0;
8899
unsigned int ss = 0;
8900
unsigned int tt = 0;
8901
double tmp5 = 0.00000000;
8902
double tmp6 = 0.00000000;
8903
double tmp7 = 0.00000000;
8904
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
8905
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
8906
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
8907
double tmp3 = 0.50000000*(1.00000000 - Z);
8908
double tmp4 = tmp3*tmp3;
8910
// Compute basisvalues.
8911
basisvalues[0] = 1.00000000;
8912
basisvalues[1] = tmp0;
8913
for (unsigned int r = 1; r < 2; r++)
8915
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
8916
ss = r*(r + 1)*(r + 2)/6;
8917
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
8918
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
8919
}// end loop over 'r'
8920
for (unsigned int r = 0; r < 2; r++)
8922
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
8923
ss = r*(r + 1)*(r + 2)/6;
8924
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
8925
}// end loop over 'r'
8926
for (unsigned int r = 0; r < 1; r++)
8928
for (unsigned int s = 1; s < 2 - r; s++)
8930
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
8931
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8932
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
8933
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8934
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8935
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
8936
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
8937
}// end loop over 's'
8938
}// end loop over 'r'
8939
for (unsigned int r = 0; r < 2; r++)
8941
for (unsigned int s = 0; s < 2 - r; s++)
8943
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
8944
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
8945
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
8946
}// end loop over 's'
8947
}// end loop over 'r'
8948
for (unsigned int r = 0; r < 1; r++)
8950
for (unsigned int s = 0; s < 1 - r; s++)
8952
for (unsigned int t = 1; t < 2 - r - s; t++)
8954
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
8955
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8956
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
8957
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8958
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8959
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
8960
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
8961
}// end loop over 't'
8962
}// end loop over 's'
8963
}// end loop over 'r'
8964
for (unsigned int r = 0; r < 3; r++)
8966
for (unsigned int s = 0; s < 3 - r; s++)
8968
for (unsigned int t = 0; t < 3 - r - s; t++)
8970
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
8971
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
8972
}// end loop over 't'
8973
}// end loop over 's'
8974
}// end loop over 'r'
8976
// Table(s) of coefficients.
8977
static const double coefficients0[10] = \
8978
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
8980
// Tables of derivatives of the polynomial base (transpose).
8981
static const double dmats0[10][10] = \
8982
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8983
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8984
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8985
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8986
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8987
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8988
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8989
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8990
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8991
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
8993
static const double dmats1[10][10] = \
8994
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8995
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8996
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8997
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8998
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
8999
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9000
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9001
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9002
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9003
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9005
static const double dmats2[10][10] = \
9006
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9007
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9008
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9009
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9010
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9011
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9012
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9013
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9014
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9015
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9017
// Compute reference derivatives.
9018
// Declare pointer to array of derivatives on FIAT element.
9019
double *derivatives = new double[num_derivatives];
9020
for (unsigned int r = 0; r < num_derivatives; r++)
9022
derivatives[r] = 0.00000000;
9023
}// end loop over 'r'
9025
// Declare derivative matrix (of polynomial basis).
9026
double dmats[10][10] = \
9027
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9028
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9029
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9030
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9031
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9032
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9033
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9034
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9035
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9036
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9038
// Declare (auxiliary) derivative matrix (of polynomial basis).
9039
double dmats_old[10][10] = \
9040
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9041
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9042
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9043
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9044
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9045
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9046
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9047
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9048
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9049
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9051
// Loop possible derivatives.
9052
for (unsigned int r = 0; r < num_derivatives; r++)
9054
// Resetting dmats values to compute next derivative.
9055
for (unsigned int t = 0; t < 10; t++)
9057
for (unsigned int u = 0; u < 10; u++)
9059
dmats[t][u] = 0.00000000;
9062
dmats[t][u] = 1.00000000;
9065
}// end loop over 'u'
9066
}// end loop over 't'
9068
// Looping derivative order to generate dmats.
9069
for (unsigned int s = 0; s < n; s++)
9071
// Updating dmats_old with new values and resetting dmats.
9072
for (unsigned int t = 0; t < 10; t++)
9074
for (unsigned int u = 0; u < 10; u++)
9076
dmats_old[t][u] = dmats[t][u];
9077
dmats[t][u] = 0.00000000;
9078
}// end loop over 'u'
9079
}// end loop over 't'
9081
// Update dmats using an inner product.
9082
if (combinations[r][s] == 0)
9084
for (unsigned int t = 0; t < 10; t++)
9086
for (unsigned int u = 0; u < 10; u++)
9088
for (unsigned int tu = 0; tu < 10; tu++)
9090
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
9091
}// end loop over 'tu'
9092
}// end loop over 'u'
9093
}// end loop over 't'
9096
if (combinations[r][s] == 1)
9098
for (unsigned int t = 0; t < 10; t++)
9100
for (unsigned int u = 0; u < 10; u++)
9102
for (unsigned int tu = 0; tu < 10; tu++)
9104
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
9105
}// end loop over 'tu'
9106
}// end loop over 'u'
9107
}// end loop over 't'
9110
if (combinations[r][s] == 2)
9112
for (unsigned int t = 0; t < 10; t++)
9114
for (unsigned int u = 0; u < 10; u++)
9116
for (unsigned int tu = 0; tu < 10; tu++)
9118
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
9119
}// end loop over 'tu'
9120
}// end loop over 'u'
9121
}// end loop over 't'
9124
}// end loop over 's'
9125
for (unsigned int s = 0; s < 10; s++)
9127
for (unsigned int t = 0; t < 10; t++)
9129
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
9130
}// end loop over 't'
9131
}// end loop over 's'
9132
}// end loop over 'r'
9134
// Transform derivatives back to physical element
9135
for (unsigned int r = 0; r < num_derivatives; r++)
9137
for (unsigned int s = 0; s < num_derivatives; s++)
9139
values[r] += transform[r][s]*derivatives[s];
9140
}// end loop over 's'
9141
}// end loop over 'r'
9143
// Delete pointer to array of derivatives on FIAT element
9144
delete [] derivatives;
9146
// Delete pointer to array of combinations of derivatives and transform
9147
for (unsigned int r = 0; r < num_derivatives; r++)
9149
delete [] combinations[r];
9150
}// end loop over 'r'
9151
delete [] combinations;
9152
for (unsigned int r = 0; r < num_derivatives; r++)
9154
delete [] transform[r];
9155
}// end loop over 'r'
9156
delete [] transform;
9162
// Array of basisvalues.
9163
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
9165
// Declare helper variables.
9166
unsigned int rr = 0;
9167
unsigned int ss = 0;
9168
unsigned int tt = 0;
9169
double tmp5 = 0.00000000;
9170
double tmp6 = 0.00000000;
9171
double tmp7 = 0.00000000;
9172
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
9173
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
9174
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
9175
double tmp3 = 0.50000000*(1.00000000 - Z);
9176
double tmp4 = tmp3*tmp3;
9178
// Compute basisvalues.
9179
basisvalues[0] = 1.00000000;
9180
basisvalues[1] = tmp0;
9181
for (unsigned int r = 1; r < 2; r++)
9183
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
9184
ss = r*(r + 1)*(r + 2)/6;
9185
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
9186
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
9187
}// end loop over 'r'
9188
for (unsigned int r = 0; r < 2; r++)
9190
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
9191
ss = r*(r + 1)*(r + 2)/6;
9192
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
9193
}// end loop over 'r'
9194
for (unsigned int r = 0; r < 1; r++)
9196
for (unsigned int s = 1; s < 2 - r; s++)
9198
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
9199
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
9200
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
9201
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9202
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9203
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9204
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
9205
}// end loop over 's'
9206
}// end loop over 'r'
9207
for (unsigned int r = 0; r < 2; r++)
9209
for (unsigned int s = 0; s < 2 - r; s++)
9211
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
9212
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
9213
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
9214
}// end loop over 's'
9215
}// end loop over 'r'
9216
for (unsigned int r = 0; r < 1; r++)
9218
for (unsigned int s = 0; s < 1 - r; s++)
9220
for (unsigned int t = 1; t < 2 - r - s; t++)
9222
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
9223
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
9224
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
9225
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9226
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9227
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9228
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
9229
}// end loop over 't'
9230
}// end loop over 's'
9231
}// end loop over 'r'
9232
for (unsigned int r = 0; r < 3; r++)
9234
for (unsigned int s = 0; s < 3 - r; s++)
9236
for (unsigned int t = 0; t < 3 - r - s; t++)
9238
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
9239
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
9240
}// end loop over 't'
9241
}// end loop over 's'
9242
}// end loop over 'r'
9244
// Table(s) of coefficients.
9245
static const double coefficients0[10] = \
9246
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
9248
// Tables of derivatives of the polynomial base (transpose).
9249
static const double dmats0[10][10] = \
9250
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9251
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9252
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9253
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9254
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9255
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9256
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9257
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9258
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9259
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9261
static const double dmats1[10][10] = \
9262
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9263
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9264
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9265
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9266
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9267
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9268
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9269
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9270
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9271
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9273
static const double dmats2[10][10] = \
9274
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9275
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9276
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9277
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9278
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9279
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9280
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9281
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9282
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9283
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9285
// Compute reference derivatives.
9286
// Declare pointer to array of derivatives on FIAT element.
9287
double *derivatives = new double[num_derivatives];
9288
for (unsigned int r = 0; r < num_derivatives; r++)
9290
derivatives[r] = 0.00000000;
9291
}// end loop over 'r'
9293
// Declare derivative matrix (of polynomial basis).
9294
double dmats[10][10] = \
9295
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9296
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9297
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9298
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9299
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9300
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9301
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9302
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9303
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9304
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9306
// Declare (auxiliary) derivative matrix (of polynomial basis).
9307
double dmats_old[10][10] = \
9308
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9309
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9310
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9311
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9312
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9313
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9314
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9315
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9316
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9317
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9319
// Loop possible derivatives.
9320
for (unsigned int r = 0; r < num_derivatives; r++)
9322
// Resetting dmats values to compute next derivative.
9323
for (unsigned int t = 0; t < 10; t++)
9325
for (unsigned int u = 0; u < 10; u++)
9327
dmats[t][u] = 0.00000000;
9330
dmats[t][u] = 1.00000000;
9333
}// end loop over 'u'
9334
}// end loop over 't'
9336
// Looping derivative order to generate dmats.
9337
for (unsigned int s = 0; s < n; s++)
9339
// Updating dmats_old with new values and resetting dmats.
9340
for (unsigned int t = 0; t < 10; t++)
9342
for (unsigned int u = 0; u < 10; u++)
9344
dmats_old[t][u] = dmats[t][u];
9345
dmats[t][u] = 0.00000000;
9346
}// end loop over 'u'
9347
}// end loop over 't'
9349
// Update dmats using an inner product.
9350
if (combinations[r][s] == 0)
9352
for (unsigned int t = 0; t < 10; t++)
9354
for (unsigned int u = 0; u < 10; u++)
9356
for (unsigned int tu = 0; tu < 10; tu++)
9358
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
9359
}// end loop over 'tu'
9360
}// end loop over 'u'
9361
}// end loop over 't'
9364
if (combinations[r][s] == 1)
9366
for (unsigned int t = 0; t < 10; t++)
9368
for (unsigned int u = 0; u < 10; u++)
9370
for (unsigned int tu = 0; tu < 10; tu++)
9372
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
9373
}// end loop over 'tu'
9374
}// end loop over 'u'
9375
}// end loop over 't'
9378
if (combinations[r][s] == 2)
9380
for (unsigned int t = 0; t < 10; t++)
9382
for (unsigned int u = 0; u < 10; u++)
9384
for (unsigned int tu = 0; tu < 10; tu++)
9386
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
9387
}// end loop over 'tu'
9388
}// end loop over 'u'
9389
}// end loop over 't'
9392
}// end loop over 's'
9393
for (unsigned int s = 0; s < 10; s++)
9395
for (unsigned int t = 0; t < 10; t++)
9397
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
9398
}// end loop over 't'
9399
}// end loop over 's'
9400
}// end loop over 'r'
9402
// Transform derivatives back to physical element
9403
for (unsigned int r = 0; r < num_derivatives; r++)
9405
for (unsigned int s = 0; s < num_derivatives; s++)
9407
values[r] += transform[r][s]*derivatives[s];
9408
}// end loop over 's'
9409
}// end loop over 'r'
9411
// Delete pointer to array of derivatives on FIAT element
9412
delete [] derivatives;
9414
// Delete pointer to array of combinations of derivatives and transform
9415
for (unsigned int r = 0; r < num_derivatives; r++)
9417
delete [] combinations[r];
9418
}// end loop over 'r'
9419
delete [] combinations;
9420
for (unsigned int r = 0; r < num_derivatives; r++)
9422
delete [] transform[r];
9423
}// end loop over 'r'
9424
delete [] transform;
9430
// Array of basisvalues.
9431
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
9433
// Declare helper variables.
9434
unsigned int rr = 0;
9435
unsigned int ss = 0;
9436
unsigned int tt = 0;
9437
double tmp5 = 0.00000000;
9438
double tmp6 = 0.00000000;
9439
double tmp7 = 0.00000000;
9440
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
9441
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
9442
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
9443
double tmp3 = 0.50000000*(1.00000000 - Z);
9444
double tmp4 = tmp3*tmp3;
9446
// Compute basisvalues.
9447
basisvalues[0] = 1.00000000;
9448
basisvalues[1] = tmp0;
9449
for (unsigned int r = 1; r < 2; r++)
9451
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
9452
ss = r*(r + 1)*(r + 2)/6;
9453
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
9454
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
9455
}// end loop over 'r'
9456
for (unsigned int r = 0; r < 2; r++)
9458
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
9459
ss = r*(r + 1)*(r + 2)/6;
9460
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
9461
}// end loop over 'r'
9462
for (unsigned int r = 0; r < 1; r++)
9464
for (unsigned int s = 1; s < 2 - r; s++)
9466
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
9467
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
9468
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
9469
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9470
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9471
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9472
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
9473
}// end loop over 's'
9474
}// end loop over 'r'
9475
for (unsigned int r = 0; r < 2; r++)
9477
for (unsigned int s = 0; s < 2 - r; s++)
9479
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
9480
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
9481
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
9482
}// end loop over 's'
9483
}// end loop over 'r'
9484
for (unsigned int r = 0; r < 1; r++)
9486
for (unsigned int s = 0; s < 1 - r; s++)
9488
for (unsigned int t = 1; t < 2 - r - s; t++)
9490
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
9491
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
9492
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
9493
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9494
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9495
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9496
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
9497
}// end loop over 't'
9498
}// end loop over 's'
9499
}// end loop over 'r'
9500
for (unsigned int r = 0; r < 3; r++)
9502
for (unsigned int s = 0; s < 3 - r; s++)
9504
for (unsigned int t = 0; t < 3 - r - s; t++)
9506
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
9507
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
9508
}// end loop over 't'
9509
}// end loop over 's'
9510
}// end loop over 'r'
9512
// Table(s) of coefficients.
9513
static const double coefficients0[10] = \
9514
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
9516
// Tables of derivatives of the polynomial base (transpose).
9517
static const double dmats0[10][10] = \
9518
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9519
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9520
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9521
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9522
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9523
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9524
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9525
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9526
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9527
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9529
static const double dmats1[10][10] = \
9530
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9531
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9532
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9533
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9534
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9535
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9536
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9537
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9538
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9539
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9541
static const double dmats2[10][10] = \
9542
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9543
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9544
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9545
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9546
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9547
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9548
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9549
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9550
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9551
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9553
// Compute reference derivatives.
9554
// Declare pointer to array of derivatives on FIAT element.
9555
double *derivatives = new double[num_derivatives];
9556
for (unsigned int r = 0; r < num_derivatives; r++)
9558
derivatives[r] = 0.00000000;
9559
}// end loop over 'r'
9561
// Declare derivative matrix (of polynomial basis).
9562
double dmats[10][10] = \
9563
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9564
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9565
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9566
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9567
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9568
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9569
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9570
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9571
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9572
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9574
// Declare (auxiliary) derivative matrix (of polynomial basis).
9575
double dmats_old[10][10] = \
9576
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9577
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9578
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9579
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9580
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9581
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9582
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9583
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9584
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9585
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9587
// Loop possible derivatives.
9588
for (unsigned int r = 0; r < num_derivatives; r++)
9590
// Resetting dmats values to compute next derivative.
9591
for (unsigned int t = 0; t < 10; t++)
9593
for (unsigned int u = 0; u < 10; u++)
9595
dmats[t][u] = 0.00000000;
9598
dmats[t][u] = 1.00000000;
9601
}// end loop over 'u'
9602
}// end loop over 't'
9604
// Looping derivative order to generate dmats.
9605
for (unsigned int s = 0; s < n; s++)
9607
// Updating dmats_old with new values and resetting dmats.
9608
for (unsigned int t = 0; t < 10; t++)
9610
for (unsigned int u = 0; u < 10; u++)
9612
dmats_old[t][u] = dmats[t][u];
9613
dmats[t][u] = 0.00000000;
9614
}// end loop over 'u'
9615
}// end loop over 't'
9617
// Update dmats using an inner product.
9618
if (combinations[r][s] == 0)
9620
for (unsigned int t = 0; t < 10; t++)
9622
for (unsigned int u = 0; u < 10; u++)
9624
for (unsigned int tu = 0; tu < 10; tu++)
9626
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
9627
}// end loop over 'tu'
9628
}// end loop over 'u'
9629
}// end loop over 't'
9632
if (combinations[r][s] == 1)
9634
for (unsigned int t = 0; t < 10; t++)
9636
for (unsigned int u = 0; u < 10; u++)
9638
for (unsigned int tu = 0; tu < 10; tu++)
9640
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
9641
}// end loop over 'tu'
9642
}// end loop over 'u'
9643
}// end loop over 't'
9646
if (combinations[r][s] == 2)
9648
for (unsigned int t = 0; t < 10; t++)
9650
for (unsigned int u = 0; u < 10; u++)
9652
for (unsigned int tu = 0; tu < 10; tu++)
9654
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
9655
}// end loop over 'tu'
9656
}// end loop over 'u'
9657
}// end loop over 't'
9660
}// end loop over 's'
9661
for (unsigned int s = 0; s < 10; s++)
9663
for (unsigned int t = 0; t < 10; t++)
9665
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
9666
}// end loop over 't'
9667
}// end loop over 's'
9668
}// end loop over 'r'
9670
// Transform derivatives back to physical element
9671
for (unsigned int r = 0; r < num_derivatives; r++)
9673
for (unsigned int s = 0; s < num_derivatives; s++)
9675
values[r] += transform[r][s]*derivatives[s];
9676
}// end loop over 's'
9677
}// end loop over 'r'
9679
// Delete pointer to array of derivatives on FIAT element
9680
delete [] derivatives;
9682
// Delete pointer to array of combinations of derivatives and transform
9683
for (unsigned int r = 0; r < num_derivatives; r++)
9685
delete [] combinations[r];
9686
}// end loop over 'r'
9687
delete [] combinations;
9688
for (unsigned int r = 0; r < num_derivatives; r++)
9690
delete [] transform[r];
9691
}// end loop over 'r'
9692
delete [] transform;
9698
// Array of basisvalues.
9699
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
9701
// Declare helper variables.
9702
unsigned int rr = 0;
9703
unsigned int ss = 0;
9704
unsigned int tt = 0;
9705
double tmp5 = 0.00000000;
9706
double tmp6 = 0.00000000;
9707
double tmp7 = 0.00000000;
9708
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
9709
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
9710
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
9711
double tmp3 = 0.50000000*(1.00000000 - Z);
9712
double tmp4 = tmp3*tmp3;
9714
// Compute basisvalues.
9715
basisvalues[0] = 1.00000000;
9716
basisvalues[1] = tmp0;
9717
for (unsigned int r = 1; r < 2; r++)
9719
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
9720
ss = r*(r + 1)*(r + 2)/6;
9721
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
9722
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
9723
}// end loop over 'r'
9724
for (unsigned int r = 0; r < 2; r++)
9726
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
9727
ss = r*(r + 1)*(r + 2)/6;
9728
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
9729
}// end loop over 'r'
9730
for (unsigned int r = 0; r < 1; r++)
9732
for (unsigned int s = 1; s < 2 - r; s++)
9734
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
9735
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
9736
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
9737
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9738
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9739
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
9740
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
9741
}// end loop over 's'
9742
}// end loop over 'r'
9743
for (unsigned int r = 0; r < 2; r++)
9745
for (unsigned int s = 0; s < 2 - r; s++)
9747
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
9748
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
9749
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
9750
}// end loop over 's'
9751
}// end loop over 'r'
9752
for (unsigned int r = 0; r < 1; r++)
9754
for (unsigned int s = 0; s < 1 - r; s++)
9756
for (unsigned int t = 1; t < 2 - r - s; t++)
9758
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
9759
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
9760
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
9761
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9762
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9763
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
9764
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
9765
}// end loop over 't'
9766
}// end loop over 's'
9767
}// end loop over 'r'
9768
for (unsigned int r = 0; r < 3; r++)
9770
for (unsigned int s = 0; s < 3 - r; s++)
9772
for (unsigned int t = 0; t < 3 - r - s; t++)
9774
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
9775
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
9776
}// end loop over 't'
9777
}// end loop over 's'
9778
}// end loop over 'r'
9780
// Table(s) of coefficients.
9781
static const double coefficients0[10] = \
9782
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
9784
// Tables of derivatives of the polynomial base (transpose).
9785
static const double dmats0[10][10] = \
9786
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9787
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9788
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9789
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9790
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9791
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9792
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9793
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9794
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9795
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9797
static const double dmats1[10][10] = \
9798
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9799
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9800
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9801
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9802
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9803
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9804
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9805
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9806
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9807
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9809
static const double dmats2[10][10] = \
9810
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9811
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9812
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9813
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9814
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9815
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9816
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9817
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9818
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9819
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
9821
// Compute reference derivatives.
9822
// Declare pointer to array of derivatives on FIAT element.
9823
double *derivatives = new double[num_derivatives];
9824
for (unsigned int r = 0; r < num_derivatives; r++)
9826
derivatives[r] = 0.00000000;
9827
}// end loop over 'r'
9829
// Declare derivative matrix (of polynomial basis).
9830
double dmats[10][10] = \
9831
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9832
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9833
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9834
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9835
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9836
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9837
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9838
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9839
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9840
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9842
// Declare (auxiliary) derivative matrix (of polynomial basis).
9843
double dmats_old[10][10] = \
9844
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9845
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9846
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9847
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9848
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9849
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
9850
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
9851
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
9852
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
9853
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
9855
// Loop possible derivatives.
9856
for (unsigned int r = 0; r < num_derivatives; r++)
9858
// Resetting dmats values to compute next derivative.
9859
for (unsigned int t = 0; t < 10; t++)
9861
for (unsigned int u = 0; u < 10; u++)
9863
dmats[t][u] = 0.00000000;
9866
dmats[t][u] = 1.00000000;
9869
}// end loop over 'u'
9870
}// end loop over 't'
9872
// Looping derivative order to generate dmats.
9873
for (unsigned int s = 0; s < n; s++)
9875
// Updating dmats_old with new values and resetting dmats.
9876
for (unsigned int t = 0; t < 10; t++)
9878
for (unsigned int u = 0; u < 10; u++)
9880
dmats_old[t][u] = dmats[t][u];
9881
dmats[t][u] = 0.00000000;
9882
}// end loop over 'u'
9883
}// end loop over 't'
9885
// Update dmats using an inner product.
9886
if (combinations[r][s] == 0)
9888
for (unsigned int t = 0; t < 10; t++)
9890
for (unsigned int u = 0; u < 10; u++)
9892
for (unsigned int tu = 0; tu < 10; tu++)
9894
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
9895
}// end loop over 'tu'
9896
}// end loop over 'u'
9897
}// end loop over 't'
9900
if (combinations[r][s] == 1)
9902
for (unsigned int t = 0; t < 10; t++)
9904
for (unsigned int u = 0; u < 10; u++)
9906
for (unsigned int tu = 0; tu < 10; tu++)
9908
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
9909
}// end loop over 'tu'
9910
}// end loop over 'u'
9911
}// end loop over 't'
9914
if (combinations[r][s] == 2)
9916
for (unsigned int t = 0; t < 10; t++)
9918
for (unsigned int u = 0; u < 10; u++)
9920
for (unsigned int tu = 0; tu < 10; tu++)
9922
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
9923
}// end loop over 'tu'
9924
}// end loop over 'u'
9925
}// end loop over 't'
9928
}// end loop over 's'
9929
for (unsigned int s = 0; s < 10; s++)
9931
for (unsigned int t = 0; t < 10; t++)
9933
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
9934
}// end loop over 't'
9935
}// end loop over 's'
9936
}// end loop over 'r'
9938
// Transform derivatives back to physical element
9939
for (unsigned int r = 0; r < num_derivatives; r++)
9941
for (unsigned int s = 0; s < num_derivatives; s++)
9943
values[r] += transform[r][s]*derivatives[s];
9944
}// end loop over 's'
9945
}// end loop over 'r'
9947
// Delete pointer to array of derivatives on FIAT element
9948
delete [] derivatives;
9950
// Delete pointer to array of combinations of derivatives and transform
9951
for (unsigned int r = 0; r < num_derivatives; r++)
9953
delete [] combinations[r];
9954
}// end loop over 'r'
9955
delete [] combinations;
9956
for (unsigned int r = 0; r < num_derivatives; r++)
9958
delete [] transform[r];
9959
}// end loop over 'r'
9960
delete [] transform;
9966
// Array of basisvalues.
9967
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
9969
// Declare helper variables.
9970
unsigned int rr = 0;
9971
unsigned int ss = 0;
9972
unsigned int tt = 0;
9973
double tmp5 = 0.00000000;
9974
double tmp6 = 0.00000000;
9975
double tmp7 = 0.00000000;
9976
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
9977
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
9978
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
9979
double tmp3 = 0.50000000*(1.00000000 - Z);
9980
double tmp4 = tmp3*tmp3;
9982
// Compute basisvalues.
9983
basisvalues[0] = 1.00000000;
9984
basisvalues[1] = tmp0;
9985
for (unsigned int r = 1; r < 2; r++)
9987
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
9988
ss = r*(r + 1)*(r + 2)/6;
9989
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
9990
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
9991
}// end loop over 'r'
9992
for (unsigned int r = 0; r < 2; r++)
9994
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
9995
ss = r*(r + 1)*(r + 2)/6;
9996
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
9997
}// end loop over 'r'
9998
for (unsigned int r = 0; r < 1; r++)
10000
for (unsigned int s = 1; s < 2 - r; s++)
10002
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
10003
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10004
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
10005
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10006
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10007
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10008
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
10009
}// end loop over 's'
10010
}// end loop over 'r'
10011
for (unsigned int r = 0; r < 2; r++)
10013
for (unsigned int s = 0; s < 2 - r; s++)
10015
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
10016
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10017
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
10018
}// end loop over 's'
10019
}// end loop over 'r'
10020
for (unsigned int r = 0; r < 1; r++)
10022
for (unsigned int s = 0; s < 1 - r; s++)
10024
for (unsigned int t = 1; t < 2 - r - s; t++)
10026
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
10027
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10028
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
10029
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10030
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10031
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10032
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
10033
}// end loop over 't'
10034
}// end loop over 's'
10035
}// end loop over 'r'
10036
for (unsigned int r = 0; r < 3; r++)
10038
for (unsigned int s = 0; s < 3 - r; s++)
10040
for (unsigned int t = 0; t < 3 - r - s; t++)
10042
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10043
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
10044
}// end loop over 't'
10045
}// end loop over 's'
10046
}// end loop over 'r'
10048
// Table(s) of coefficients.
10049
static const double coefficients0[10] = \
10050
{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
10052
// Tables of derivatives of the polynomial base (transpose).
10053
static const double dmats0[10][10] = \
10054
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10055
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10056
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10057
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10058
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10059
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10060
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10061
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10062
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10063
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10065
static const double dmats1[10][10] = \
10066
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10067
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10068
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10069
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10070
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10071
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10072
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10073
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10074
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10075
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10077
static const double dmats2[10][10] = \
10078
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10079
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10080
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10081
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10082
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10083
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10084
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10085
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10086
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10087
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10089
// Compute reference derivatives.
10090
// Declare pointer to array of derivatives on FIAT element.
10091
double *derivatives = new double[num_derivatives];
10092
for (unsigned int r = 0; r < num_derivatives; r++)
10094
derivatives[r] = 0.00000000;
10095
}// end loop over 'r'
10097
// Declare derivative matrix (of polynomial basis).
10098
double dmats[10][10] = \
10099
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10100
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10101
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10102
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10103
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10104
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10105
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10106
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10107
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10108
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10110
// Declare (auxiliary) derivative matrix (of polynomial basis).
10111
double dmats_old[10][10] = \
10112
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10113
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10114
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10115
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10116
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10117
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10118
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10119
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10120
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10121
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10123
// Loop possible derivatives.
10124
for (unsigned int r = 0; r < num_derivatives; r++)
10126
// Resetting dmats values to compute next derivative.
10127
for (unsigned int t = 0; t < 10; t++)
10129
for (unsigned int u = 0; u < 10; u++)
10131
dmats[t][u] = 0.00000000;
10134
dmats[t][u] = 1.00000000;
10137
}// end loop over 'u'
10138
}// end loop over 't'
10140
// Looping derivative order to generate dmats.
10141
for (unsigned int s = 0; s < n; s++)
10143
// Updating dmats_old with new values and resetting dmats.
10144
for (unsigned int t = 0; t < 10; t++)
10146
for (unsigned int u = 0; u < 10; u++)
10148
dmats_old[t][u] = dmats[t][u];
10149
dmats[t][u] = 0.00000000;
10150
}// end loop over 'u'
10151
}// end loop over 't'
10153
// Update dmats using an inner product.
10154
if (combinations[r][s] == 0)
10156
for (unsigned int t = 0; t < 10; t++)
10158
for (unsigned int u = 0; u < 10; u++)
10160
for (unsigned int tu = 0; tu < 10; tu++)
10162
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
10163
}// end loop over 'tu'
10164
}// end loop over 'u'
10165
}// end loop over 't'
10168
if (combinations[r][s] == 1)
10170
for (unsigned int t = 0; t < 10; t++)
10172
for (unsigned int u = 0; u < 10; u++)
10174
for (unsigned int tu = 0; tu < 10; tu++)
10176
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
10177
}// end loop over 'tu'
10178
}// end loop over 'u'
10179
}// end loop over 't'
10182
if (combinations[r][s] == 2)
10184
for (unsigned int t = 0; t < 10; t++)
10186
for (unsigned int u = 0; u < 10; u++)
10188
for (unsigned int tu = 0; tu < 10; tu++)
10190
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
10191
}// end loop over 'tu'
10192
}// end loop over 'u'
10193
}// end loop over 't'
10196
}// end loop over 's'
10197
for (unsigned int s = 0; s < 10; s++)
10199
for (unsigned int t = 0; t < 10; t++)
10201
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
10202
}// end loop over 't'
10203
}// end loop over 's'
10204
}// end loop over 'r'
10206
// Transform derivatives back to physical element
10207
for (unsigned int r = 0; r < num_derivatives; r++)
10209
for (unsigned int s = 0; s < num_derivatives; s++)
10211
values[num_derivatives + r] += transform[r][s]*derivatives[s];
10212
}// end loop over 's'
10213
}// end loop over 'r'
10215
// Delete pointer to array of derivatives on FIAT element
10216
delete [] derivatives;
10218
// Delete pointer to array of combinations of derivatives and transform
10219
for (unsigned int r = 0; r < num_derivatives; r++)
10221
delete [] combinations[r];
10222
}// end loop over 'r'
10223
delete [] combinations;
10224
for (unsigned int r = 0; r < num_derivatives; r++)
10226
delete [] transform[r];
10227
}// end loop over 'r'
10228
delete [] transform;
10234
// Array of basisvalues.
10235
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
10237
// Declare helper variables.
10238
unsigned int rr = 0;
10239
unsigned int ss = 0;
10240
unsigned int tt = 0;
10241
double tmp5 = 0.00000000;
10242
double tmp6 = 0.00000000;
10243
double tmp7 = 0.00000000;
10244
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
10245
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
10246
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
10247
double tmp3 = 0.50000000*(1.00000000 - Z);
10248
double tmp4 = tmp3*tmp3;
10250
// Compute basisvalues.
10251
basisvalues[0] = 1.00000000;
10252
basisvalues[1] = tmp0;
10253
for (unsigned int r = 1; r < 2; r++)
10255
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
10256
ss = r*(r + 1)*(r + 2)/6;
10257
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
10258
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
10259
}// end loop over 'r'
10260
for (unsigned int r = 0; r < 2; r++)
10262
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
10263
ss = r*(r + 1)*(r + 2)/6;
10264
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
10265
}// end loop over 'r'
10266
for (unsigned int r = 0; r < 1; r++)
10268
for (unsigned int s = 1; s < 2 - r; s++)
10270
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
10271
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10272
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
10273
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10274
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10275
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10276
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
10277
}// end loop over 's'
10278
}// end loop over 'r'
10279
for (unsigned int r = 0; r < 2; r++)
10281
for (unsigned int s = 0; s < 2 - r; s++)
10283
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
10284
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10285
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
10286
}// end loop over 's'
10287
}// end loop over 'r'
10288
for (unsigned int r = 0; r < 1; r++)
10290
for (unsigned int s = 0; s < 1 - r; s++)
10292
for (unsigned int t = 1; t < 2 - r - s; t++)
10294
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
10295
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10296
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
10297
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10298
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10299
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10300
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
10301
}// end loop over 't'
10302
}// end loop over 's'
10303
}// end loop over 'r'
10304
for (unsigned int r = 0; r < 3; r++)
10306
for (unsigned int s = 0; s < 3 - r; s++)
10308
for (unsigned int t = 0; t < 3 - r - s; t++)
10310
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10311
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
10312
}// end loop over 't'
10313
}// end loop over 's'
10314
}// end loop over 'r'
10316
// Table(s) of coefficients.
10317
static const double coefficients0[10] = \
10318
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
10320
// Tables of derivatives of the polynomial base (transpose).
10321
static const double dmats0[10][10] = \
10322
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10323
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10324
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10325
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10326
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10327
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10328
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10329
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10330
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10331
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10333
static const double dmats1[10][10] = \
10334
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10335
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10336
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10337
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10338
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10339
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10340
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10341
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10342
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10343
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10345
static const double dmats2[10][10] = \
10346
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10347
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10348
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10349
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10350
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10351
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10352
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10353
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10354
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10355
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10357
// Compute reference derivatives.
10358
// Declare pointer to array of derivatives on FIAT element.
10359
double *derivatives = new double[num_derivatives];
10360
for (unsigned int r = 0; r < num_derivatives; r++)
10362
derivatives[r] = 0.00000000;
10363
}// end loop over 'r'
10365
// Declare derivative matrix (of polynomial basis).
10366
double dmats[10][10] = \
10367
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10368
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10369
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10370
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10371
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10372
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10373
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10374
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10375
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10376
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10378
// Declare (auxiliary) derivative matrix (of polynomial basis).
10379
double dmats_old[10][10] = \
10380
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10381
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10382
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10383
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10384
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10385
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10386
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10387
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10388
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10389
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10391
// Loop possible derivatives.
10392
for (unsigned int r = 0; r < num_derivatives; r++)
10394
// Resetting dmats values to compute next derivative.
10395
for (unsigned int t = 0; t < 10; t++)
10397
for (unsigned int u = 0; u < 10; u++)
10399
dmats[t][u] = 0.00000000;
10402
dmats[t][u] = 1.00000000;
10405
}// end loop over 'u'
10406
}// end loop over 't'
10408
// Looping derivative order to generate dmats.
10409
for (unsigned int s = 0; s < n; s++)
10411
// Updating dmats_old with new values and resetting dmats.
10412
for (unsigned int t = 0; t < 10; t++)
10414
for (unsigned int u = 0; u < 10; u++)
10416
dmats_old[t][u] = dmats[t][u];
10417
dmats[t][u] = 0.00000000;
10418
}// end loop over 'u'
10419
}// end loop over 't'
10421
// Update dmats using an inner product.
10422
if (combinations[r][s] == 0)
10424
for (unsigned int t = 0; t < 10; t++)
10426
for (unsigned int u = 0; u < 10; u++)
10428
for (unsigned int tu = 0; tu < 10; tu++)
10430
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
10431
}// end loop over 'tu'
10432
}// end loop over 'u'
10433
}// end loop over 't'
10436
if (combinations[r][s] == 1)
10438
for (unsigned int t = 0; t < 10; t++)
10440
for (unsigned int u = 0; u < 10; u++)
10442
for (unsigned int tu = 0; tu < 10; tu++)
10444
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
10445
}// end loop over 'tu'
10446
}// end loop over 'u'
10447
}// end loop over 't'
10450
if (combinations[r][s] == 2)
10452
for (unsigned int t = 0; t < 10; t++)
10454
for (unsigned int u = 0; u < 10; u++)
10456
for (unsigned int tu = 0; tu < 10; tu++)
10458
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
10459
}// end loop over 'tu'
10460
}// end loop over 'u'
10461
}// end loop over 't'
10464
}// end loop over 's'
10465
for (unsigned int s = 0; s < 10; s++)
10467
for (unsigned int t = 0; t < 10; t++)
10469
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
10470
}// end loop over 't'
10471
}// end loop over 's'
10472
}// end loop over 'r'
10474
// Transform derivatives back to physical element
10475
for (unsigned int r = 0; r < num_derivatives; r++)
10477
for (unsigned int s = 0; s < num_derivatives; s++)
10479
values[num_derivatives + r] += transform[r][s]*derivatives[s];
10480
}// end loop over 's'
10481
}// end loop over 'r'
10483
// Delete pointer to array of derivatives on FIAT element
10484
delete [] derivatives;
10486
// Delete pointer to array of combinations of derivatives and transform
10487
for (unsigned int r = 0; r < num_derivatives; r++)
10489
delete [] combinations[r];
10490
}// end loop over 'r'
10491
delete [] combinations;
10492
for (unsigned int r = 0; r < num_derivatives; r++)
10494
delete [] transform[r];
10495
}// end loop over 'r'
10496
delete [] transform;
10502
// Array of basisvalues.
10503
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
10505
// Declare helper variables.
10506
unsigned int rr = 0;
10507
unsigned int ss = 0;
10508
unsigned int tt = 0;
10509
double tmp5 = 0.00000000;
10510
double tmp6 = 0.00000000;
10511
double tmp7 = 0.00000000;
10512
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
10513
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
10514
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
10515
double tmp3 = 0.50000000*(1.00000000 - Z);
10516
double tmp4 = tmp3*tmp3;
10518
// Compute basisvalues.
10519
basisvalues[0] = 1.00000000;
10520
basisvalues[1] = tmp0;
10521
for (unsigned int r = 1; r < 2; r++)
10523
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
10524
ss = r*(r + 1)*(r + 2)/6;
10525
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
10526
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
10527
}// end loop over 'r'
10528
for (unsigned int r = 0; r < 2; r++)
10530
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
10531
ss = r*(r + 1)*(r + 2)/6;
10532
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
10533
}// end loop over 'r'
10534
for (unsigned int r = 0; r < 1; r++)
10536
for (unsigned int s = 1; s < 2 - r; s++)
10538
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
10539
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10540
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
10541
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10542
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10543
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10544
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
10545
}// end loop over 's'
10546
}// end loop over 'r'
10547
for (unsigned int r = 0; r < 2; r++)
10549
for (unsigned int s = 0; s < 2 - r; s++)
10551
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
10552
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10553
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
10554
}// end loop over 's'
10555
}// end loop over 'r'
10556
for (unsigned int r = 0; r < 1; r++)
10558
for (unsigned int s = 0; s < 1 - r; s++)
10560
for (unsigned int t = 1; t < 2 - r - s; t++)
10562
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
10563
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10564
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
10565
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10566
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10567
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10568
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
10569
}// end loop over 't'
10570
}// end loop over 's'
10571
}// end loop over 'r'
10572
for (unsigned int r = 0; r < 3; r++)
10574
for (unsigned int s = 0; s < 3 - r; s++)
10576
for (unsigned int t = 0; t < 3 - r - s; t++)
10578
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10579
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
10580
}// end loop over 't'
10581
}// end loop over 's'
10582
}// end loop over 'r'
10584
// Table(s) of coefficients.
10585
static const double coefficients0[10] = \
10586
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
10588
// Tables of derivatives of the polynomial base (transpose).
10589
static const double dmats0[10][10] = \
10590
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10591
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10592
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10593
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10594
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10595
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10596
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10597
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10598
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10599
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10601
static const double dmats1[10][10] = \
10602
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10603
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10604
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10605
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10606
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10607
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10608
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10609
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10610
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10611
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10613
static const double dmats2[10][10] = \
10614
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10615
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10616
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10617
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10618
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10619
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10620
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10621
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10622
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10623
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10625
// Compute reference derivatives.
10626
// Declare pointer to array of derivatives on FIAT element.
10627
double *derivatives = new double[num_derivatives];
10628
for (unsigned int r = 0; r < num_derivatives; r++)
10630
derivatives[r] = 0.00000000;
10631
}// end loop over 'r'
10633
// Declare derivative matrix (of polynomial basis).
10634
double dmats[10][10] = \
10635
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10636
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10637
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10638
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10639
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10640
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10641
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10642
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10643
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10644
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10646
// Declare (auxiliary) derivative matrix (of polynomial basis).
10647
double dmats_old[10][10] = \
10648
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10649
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10650
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10651
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10652
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10653
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10654
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10655
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10656
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10657
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10659
// Loop possible derivatives.
10660
for (unsigned int r = 0; r < num_derivatives; r++)
10662
// Resetting dmats values to compute next derivative.
10663
for (unsigned int t = 0; t < 10; t++)
10665
for (unsigned int u = 0; u < 10; u++)
10667
dmats[t][u] = 0.00000000;
10670
dmats[t][u] = 1.00000000;
10673
}// end loop over 'u'
10674
}// end loop over 't'
10676
// Looping derivative order to generate dmats.
10677
for (unsigned int s = 0; s < n; s++)
10679
// Updating dmats_old with new values and resetting dmats.
10680
for (unsigned int t = 0; t < 10; t++)
10682
for (unsigned int u = 0; u < 10; u++)
10684
dmats_old[t][u] = dmats[t][u];
10685
dmats[t][u] = 0.00000000;
10686
}// end loop over 'u'
10687
}// end loop over 't'
10689
// Update dmats using an inner product.
10690
if (combinations[r][s] == 0)
10692
for (unsigned int t = 0; t < 10; t++)
10694
for (unsigned int u = 0; u < 10; u++)
10696
for (unsigned int tu = 0; tu < 10; tu++)
10698
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
10699
}// end loop over 'tu'
10700
}// end loop over 'u'
10701
}// end loop over 't'
10704
if (combinations[r][s] == 1)
10706
for (unsigned int t = 0; t < 10; t++)
10708
for (unsigned int u = 0; u < 10; u++)
10710
for (unsigned int tu = 0; tu < 10; tu++)
10712
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
10713
}// end loop over 'tu'
10714
}// end loop over 'u'
10715
}// end loop over 't'
10718
if (combinations[r][s] == 2)
10720
for (unsigned int t = 0; t < 10; t++)
10722
for (unsigned int u = 0; u < 10; u++)
10724
for (unsigned int tu = 0; tu < 10; tu++)
10726
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
10727
}// end loop over 'tu'
10728
}// end loop over 'u'
10729
}// end loop over 't'
10732
}// end loop over 's'
10733
for (unsigned int s = 0; s < 10; s++)
10735
for (unsigned int t = 0; t < 10; t++)
10737
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
10738
}// end loop over 't'
10739
}// end loop over 's'
10740
}// end loop over 'r'
10742
// Transform derivatives back to physical element
10743
for (unsigned int r = 0; r < num_derivatives; r++)
10745
for (unsigned int s = 0; s < num_derivatives; s++)
10747
values[num_derivatives + r] += transform[r][s]*derivatives[s];
10748
}// end loop over 's'
10749
}// end loop over 'r'
10751
// Delete pointer to array of derivatives on FIAT element
10752
delete [] derivatives;
10754
// Delete pointer to array of combinations of derivatives and transform
10755
for (unsigned int r = 0; r < num_derivatives; r++)
10757
delete [] combinations[r];
10758
}// end loop over 'r'
10759
delete [] combinations;
10760
for (unsigned int r = 0; r < num_derivatives; r++)
10762
delete [] transform[r];
10763
}// end loop over 'r'
10764
delete [] transform;
10770
// Array of basisvalues.
10771
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
10773
// Declare helper variables.
10774
unsigned int rr = 0;
10775
unsigned int ss = 0;
10776
unsigned int tt = 0;
10777
double tmp5 = 0.00000000;
10778
double tmp6 = 0.00000000;
10779
double tmp7 = 0.00000000;
10780
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
10781
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
10782
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
10783
double tmp3 = 0.50000000*(1.00000000 - Z);
10784
double tmp4 = tmp3*tmp3;
10786
// Compute basisvalues.
10787
basisvalues[0] = 1.00000000;
10788
basisvalues[1] = tmp0;
10789
for (unsigned int r = 1; r < 2; r++)
10791
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
10792
ss = r*(r + 1)*(r + 2)/6;
10793
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
10794
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
10795
}// end loop over 'r'
10796
for (unsigned int r = 0; r < 2; r++)
10798
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
10799
ss = r*(r + 1)*(r + 2)/6;
10800
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
10801
}// end loop over 'r'
10802
for (unsigned int r = 0; r < 1; r++)
10804
for (unsigned int s = 1; s < 2 - r; s++)
10806
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
10807
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10808
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
10809
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10810
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10811
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
10812
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
10813
}// end loop over 's'
10814
}// end loop over 'r'
10815
for (unsigned int r = 0; r < 2; r++)
10817
for (unsigned int s = 0; s < 2 - r; s++)
10819
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
10820
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
10821
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
10822
}// end loop over 's'
10823
}// end loop over 'r'
10824
for (unsigned int r = 0; r < 1; r++)
10826
for (unsigned int s = 0; s < 1 - r; s++)
10828
for (unsigned int t = 1; t < 2 - r - s; t++)
10830
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
10831
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10832
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
10833
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10834
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10835
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
10836
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
10837
}// end loop over 't'
10838
}// end loop over 's'
10839
}// end loop over 'r'
10840
for (unsigned int r = 0; r < 3; r++)
10842
for (unsigned int s = 0; s < 3 - r; s++)
10844
for (unsigned int t = 0; t < 3 - r - s; t++)
10846
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
10847
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
10848
}// end loop over 't'
10849
}// end loop over 's'
10850
}// end loop over 'r'
10852
// Table(s) of coefficients.
10853
static const double coefficients0[10] = \
10854
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
10856
// Tables of derivatives of the polynomial base (transpose).
10857
static const double dmats0[10][10] = \
10858
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10859
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10860
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10861
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10862
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10863
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10864
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10865
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10866
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10867
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10869
static const double dmats1[10][10] = \
10870
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10871
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10872
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10873
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10874
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10875
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10876
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10877
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10878
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10879
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10881
static const double dmats2[10][10] = \
10882
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10883
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10884
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10885
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10886
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10887
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10888
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10889
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10890
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10891
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
10893
// Compute reference derivatives.
10894
// Declare pointer to array of derivatives on FIAT element.
10895
double *derivatives = new double[num_derivatives];
10896
for (unsigned int r = 0; r < num_derivatives; r++)
10898
derivatives[r] = 0.00000000;
10899
}// end loop over 'r'
10901
// Declare derivative matrix (of polynomial basis).
10902
double dmats[10][10] = \
10903
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10904
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10905
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10906
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10907
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10908
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10909
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10910
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10911
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10912
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10914
// Declare (auxiliary) derivative matrix (of polynomial basis).
10915
double dmats_old[10][10] = \
10916
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10917
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10918
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10919
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10920
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10921
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
10922
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
10923
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
10924
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
10925
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
10927
// Loop possible derivatives.
10928
for (unsigned int r = 0; r < num_derivatives; r++)
10930
// Resetting dmats values to compute next derivative.
10931
for (unsigned int t = 0; t < 10; t++)
10933
for (unsigned int u = 0; u < 10; u++)
10935
dmats[t][u] = 0.00000000;
10938
dmats[t][u] = 1.00000000;
10941
}// end loop over 'u'
10942
}// end loop over 't'
10944
// Looping derivative order to generate dmats.
10945
for (unsigned int s = 0; s < n; s++)
10947
// Updating dmats_old with new values and resetting dmats.
10948
for (unsigned int t = 0; t < 10; t++)
10950
for (unsigned int u = 0; u < 10; u++)
10952
dmats_old[t][u] = dmats[t][u];
10953
dmats[t][u] = 0.00000000;
10954
}// end loop over 'u'
10955
}// end loop over 't'
10957
// Update dmats using an inner product.
10958
if (combinations[r][s] == 0)
10960
for (unsigned int t = 0; t < 10; t++)
10962
for (unsigned int u = 0; u < 10; u++)
10964
for (unsigned int tu = 0; tu < 10; tu++)
10966
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
10967
}// end loop over 'tu'
10968
}// end loop over 'u'
10969
}// end loop over 't'
10972
if (combinations[r][s] == 1)
10974
for (unsigned int t = 0; t < 10; t++)
10976
for (unsigned int u = 0; u < 10; u++)
10978
for (unsigned int tu = 0; tu < 10; tu++)
10980
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
10981
}// end loop over 'tu'
10982
}// end loop over 'u'
10983
}// end loop over 't'
10986
if (combinations[r][s] == 2)
10988
for (unsigned int t = 0; t < 10; t++)
10990
for (unsigned int u = 0; u < 10; u++)
10992
for (unsigned int tu = 0; tu < 10; tu++)
10994
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
10995
}// end loop over 'tu'
10996
}// end loop over 'u'
10997
}// end loop over 't'
11000
}// end loop over 's'
11001
for (unsigned int s = 0; s < 10; s++)
11003
for (unsigned int t = 0; t < 10; t++)
11005
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
11006
}// end loop over 't'
11007
}// end loop over 's'
11008
}// end loop over 'r'
11010
// Transform derivatives back to physical element
11011
for (unsigned int r = 0; r < num_derivatives; r++)
11013
for (unsigned int s = 0; s < num_derivatives; s++)
11015
values[num_derivatives + r] += transform[r][s]*derivatives[s];
11016
}// end loop over 's'
11017
}// end loop over 'r'
11019
// Delete pointer to array of derivatives on FIAT element
11020
delete [] derivatives;
11022
// Delete pointer to array of combinations of derivatives and transform
11023
for (unsigned int r = 0; r < num_derivatives; r++)
11025
delete [] combinations[r];
11026
}// end loop over 'r'
11027
delete [] combinations;
11028
for (unsigned int r = 0; r < num_derivatives; r++)
11030
delete [] transform[r];
11031
}// end loop over 'r'
11032
delete [] transform;
11038
// Array of basisvalues.
11039
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
11041
// Declare helper variables.
11042
unsigned int rr = 0;
11043
unsigned int ss = 0;
11044
unsigned int tt = 0;
11045
double tmp5 = 0.00000000;
11046
double tmp6 = 0.00000000;
11047
double tmp7 = 0.00000000;
11048
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
11049
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
11050
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
11051
double tmp3 = 0.50000000*(1.00000000 - Z);
11052
double tmp4 = tmp3*tmp3;
11054
// Compute basisvalues.
11055
basisvalues[0] = 1.00000000;
11056
basisvalues[1] = tmp0;
11057
for (unsigned int r = 1; r < 2; r++)
11059
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
11060
ss = r*(r + 1)*(r + 2)/6;
11061
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
11062
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
11063
}// end loop over 'r'
11064
for (unsigned int r = 0; r < 2; r++)
11066
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
11067
ss = r*(r + 1)*(r + 2)/6;
11068
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
11069
}// end loop over 'r'
11070
for (unsigned int r = 0; r < 1; r++)
11072
for (unsigned int s = 1; s < 2 - r; s++)
11074
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
11075
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11076
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
11077
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11078
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11079
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11080
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
11081
}// end loop over 's'
11082
}// end loop over 'r'
11083
for (unsigned int r = 0; r < 2; r++)
11085
for (unsigned int s = 0; s < 2 - r; s++)
11087
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
11088
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11089
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
11090
}// end loop over 's'
11091
}// end loop over 'r'
11092
for (unsigned int r = 0; r < 1; r++)
11094
for (unsigned int s = 0; s < 1 - r; s++)
11096
for (unsigned int t = 1; t < 2 - r - s; t++)
11098
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
11099
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11100
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
11101
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11102
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11103
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11104
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
11105
}// end loop over 't'
11106
}// end loop over 's'
11107
}// end loop over 'r'
11108
for (unsigned int r = 0; r < 3; r++)
11110
for (unsigned int s = 0; s < 3 - r; s++)
11112
for (unsigned int t = 0; t < 3 - r - s; t++)
11114
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11115
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
11116
}// end loop over 't'
11117
}// end loop over 's'
11118
}// end loop over 'r'
11120
// Table(s) of coefficients.
11121
static const double coefficients0[10] = \
11122
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
11124
// Tables of derivatives of the polynomial base (transpose).
11125
static const double dmats0[10][10] = \
11126
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11127
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11128
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11129
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11130
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11131
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11132
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11133
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11134
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11135
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11137
static const double dmats1[10][10] = \
11138
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11139
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11140
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11141
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11142
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11143
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11144
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11145
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11146
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11147
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11149
static const double dmats2[10][10] = \
11150
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11151
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11152
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11153
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11154
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11155
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11156
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11157
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11158
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11159
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11161
// Compute reference derivatives.
11162
// Declare pointer to array of derivatives on FIAT element.
11163
double *derivatives = new double[num_derivatives];
11164
for (unsigned int r = 0; r < num_derivatives; r++)
11166
derivatives[r] = 0.00000000;
11167
}// end loop over 'r'
11169
// Declare derivative matrix (of polynomial basis).
11170
double dmats[10][10] = \
11171
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11172
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11173
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11174
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11175
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11176
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11177
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11178
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11179
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11180
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11182
// Declare (auxiliary) derivative matrix (of polynomial basis).
11183
double dmats_old[10][10] = \
11184
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11185
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11186
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11187
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11188
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11189
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11190
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11191
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11192
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11193
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11195
// Loop possible derivatives.
11196
for (unsigned int r = 0; r < num_derivatives; r++)
11198
// Resetting dmats values to compute next derivative.
11199
for (unsigned int t = 0; t < 10; t++)
11201
for (unsigned int u = 0; u < 10; u++)
11203
dmats[t][u] = 0.00000000;
11206
dmats[t][u] = 1.00000000;
11209
}// end loop over 'u'
11210
}// end loop over 't'
11212
// Looping derivative order to generate dmats.
11213
for (unsigned int s = 0; s < n; s++)
11215
// Updating dmats_old with new values and resetting dmats.
11216
for (unsigned int t = 0; t < 10; t++)
11218
for (unsigned int u = 0; u < 10; u++)
11220
dmats_old[t][u] = dmats[t][u];
11221
dmats[t][u] = 0.00000000;
11222
}// end loop over 'u'
11223
}// end loop over 't'
11225
// Update dmats using an inner product.
11226
if (combinations[r][s] == 0)
11228
for (unsigned int t = 0; t < 10; t++)
11230
for (unsigned int u = 0; u < 10; u++)
11232
for (unsigned int tu = 0; tu < 10; tu++)
11234
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
11235
}// end loop over 'tu'
11236
}// end loop over 'u'
11237
}// end loop over 't'
11240
if (combinations[r][s] == 1)
11242
for (unsigned int t = 0; t < 10; t++)
11244
for (unsigned int u = 0; u < 10; u++)
11246
for (unsigned int tu = 0; tu < 10; tu++)
11248
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
11249
}// end loop over 'tu'
11250
}// end loop over 'u'
11251
}// end loop over 't'
11254
if (combinations[r][s] == 2)
11256
for (unsigned int t = 0; t < 10; t++)
11258
for (unsigned int u = 0; u < 10; u++)
11260
for (unsigned int tu = 0; tu < 10; tu++)
11262
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
11263
}// end loop over 'tu'
11264
}// end loop over 'u'
11265
}// end loop over 't'
11268
}// end loop over 's'
11269
for (unsigned int s = 0; s < 10; s++)
11271
for (unsigned int t = 0; t < 10; t++)
11273
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
11274
}// end loop over 't'
11275
}// end loop over 's'
11276
}// end loop over 'r'
11278
// Transform derivatives back to physical element
11279
for (unsigned int r = 0; r < num_derivatives; r++)
11281
for (unsigned int s = 0; s < num_derivatives; s++)
11283
values[num_derivatives + r] += transform[r][s]*derivatives[s];
11284
}// end loop over 's'
11285
}// end loop over 'r'
11287
// Delete pointer to array of derivatives on FIAT element
11288
delete [] derivatives;
11290
// Delete pointer to array of combinations of derivatives and transform
11291
for (unsigned int r = 0; r < num_derivatives; r++)
11293
delete [] combinations[r];
11294
}// end loop over 'r'
11295
delete [] combinations;
11296
for (unsigned int r = 0; r < num_derivatives; r++)
11298
delete [] transform[r];
11299
}// end loop over 'r'
11300
delete [] transform;
11306
// Array of basisvalues.
11307
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
11309
// Declare helper variables.
11310
unsigned int rr = 0;
11311
unsigned int ss = 0;
11312
unsigned int tt = 0;
11313
double tmp5 = 0.00000000;
11314
double tmp6 = 0.00000000;
11315
double tmp7 = 0.00000000;
11316
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
11317
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
11318
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
11319
double tmp3 = 0.50000000*(1.00000000 - Z);
11320
double tmp4 = tmp3*tmp3;
11322
// Compute basisvalues.
11323
basisvalues[0] = 1.00000000;
11324
basisvalues[1] = tmp0;
11325
for (unsigned int r = 1; r < 2; r++)
11327
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
11328
ss = r*(r + 1)*(r + 2)/6;
11329
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
11330
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
11331
}// end loop over 'r'
11332
for (unsigned int r = 0; r < 2; r++)
11334
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
11335
ss = r*(r + 1)*(r + 2)/6;
11336
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
11337
}// end loop over 'r'
11338
for (unsigned int r = 0; r < 1; r++)
11340
for (unsigned int s = 1; s < 2 - r; s++)
11342
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
11343
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11344
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
11345
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11346
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11347
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11348
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
11349
}// end loop over 's'
11350
}// end loop over 'r'
11351
for (unsigned int r = 0; r < 2; r++)
11353
for (unsigned int s = 0; s < 2 - r; s++)
11355
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
11356
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11357
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
11358
}// end loop over 's'
11359
}// end loop over 'r'
11360
for (unsigned int r = 0; r < 1; r++)
11362
for (unsigned int s = 0; s < 1 - r; s++)
11364
for (unsigned int t = 1; t < 2 - r - s; t++)
11366
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
11367
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11368
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
11369
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11370
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11371
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11372
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
11373
}// end loop over 't'
11374
}// end loop over 's'
11375
}// end loop over 'r'
11376
for (unsigned int r = 0; r < 3; r++)
11378
for (unsigned int s = 0; s < 3 - r; s++)
11380
for (unsigned int t = 0; t < 3 - r - s; t++)
11382
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11383
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
11384
}// end loop over 't'
11385
}// end loop over 's'
11386
}// end loop over 'r'
11388
// Table(s) of coefficients.
11389
static const double coefficients0[10] = \
11390
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
11392
// Tables of derivatives of the polynomial base (transpose).
11393
static const double dmats0[10][10] = \
11394
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11395
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11396
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11397
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11398
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11399
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11400
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11401
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11402
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11403
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11405
static const double dmats1[10][10] = \
11406
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11407
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11408
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11409
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11410
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11411
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11412
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11413
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11414
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11415
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11417
static const double dmats2[10][10] = \
11418
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11419
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11420
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11421
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11422
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11423
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11424
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11425
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11426
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11427
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11429
// Compute reference derivatives.
11430
// Declare pointer to array of derivatives on FIAT element.
11431
double *derivatives = new double[num_derivatives];
11432
for (unsigned int r = 0; r < num_derivatives; r++)
11434
derivatives[r] = 0.00000000;
11435
}// end loop over 'r'
11437
// Declare derivative matrix (of polynomial basis).
11438
double dmats[10][10] = \
11439
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11440
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11441
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11442
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11443
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11444
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11445
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11446
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11447
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11448
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11450
// Declare (auxiliary) derivative matrix (of polynomial basis).
11451
double dmats_old[10][10] = \
11452
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11453
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11454
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11455
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11456
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11457
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11458
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11459
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11460
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11461
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11463
// Loop possible derivatives.
11464
for (unsigned int r = 0; r < num_derivatives; r++)
11466
// Resetting dmats values to compute next derivative.
11467
for (unsigned int t = 0; t < 10; t++)
11469
for (unsigned int u = 0; u < 10; u++)
11471
dmats[t][u] = 0.00000000;
11474
dmats[t][u] = 1.00000000;
11477
}// end loop over 'u'
11478
}// end loop over 't'
11480
// Looping derivative order to generate dmats.
11481
for (unsigned int s = 0; s < n; s++)
11483
// Updating dmats_old with new values and resetting dmats.
11484
for (unsigned int t = 0; t < 10; t++)
11486
for (unsigned int u = 0; u < 10; u++)
11488
dmats_old[t][u] = dmats[t][u];
11489
dmats[t][u] = 0.00000000;
11490
}// end loop over 'u'
11491
}// end loop over 't'
11493
// Update dmats using an inner product.
11494
if (combinations[r][s] == 0)
11496
for (unsigned int t = 0; t < 10; t++)
11498
for (unsigned int u = 0; u < 10; u++)
11500
for (unsigned int tu = 0; tu < 10; tu++)
11502
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
11503
}// end loop over 'tu'
11504
}// end loop over 'u'
11505
}// end loop over 't'
11508
if (combinations[r][s] == 1)
11510
for (unsigned int t = 0; t < 10; t++)
11512
for (unsigned int u = 0; u < 10; u++)
11514
for (unsigned int tu = 0; tu < 10; tu++)
11516
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
11517
}// end loop over 'tu'
11518
}// end loop over 'u'
11519
}// end loop over 't'
11522
if (combinations[r][s] == 2)
11524
for (unsigned int t = 0; t < 10; t++)
11526
for (unsigned int u = 0; u < 10; u++)
11528
for (unsigned int tu = 0; tu < 10; tu++)
11530
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
11531
}// end loop over 'tu'
11532
}// end loop over 'u'
11533
}// end loop over 't'
11536
}// end loop over 's'
11537
for (unsigned int s = 0; s < 10; s++)
11539
for (unsigned int t = 0; t < 10; t++)
11541
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
11542
}// end loop over 't'
11543
}// end loop over 's'
11544
}// end loop over 'r'
11546
// Transform derivatives back to physical element
11547
for (unsigned int r = 0; r < num_derivatives; r++)
11549
for (unsigned int s = 0; s < num_derivatives; s++)
11551
values[num_derivatives + r] += transform[r][s]*derivatives[s];
11552
}// end loop over 's'
11553
}// end loop over 'r'
11555
// Delete pointer to array of derivatives on FIAT element
11556
delete [] derivatives;
11558
// Delete pointer to array of combinations of derivatives and transform
11559
for (unsigned int r = 0; r < num_derivatives; r++)
11561
delete [] combinations[r];
11562
}// end loop over 'r'
11563
delete [] combinations;
11564
for (unsigned int r = 0; r < num_derivatives; r++)
11566
delete [] transform[r];
11567
}// end loop over 'r'
11568
delete [] transform;
11574
// Array of basisvalues.
11575
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
11577
// Declare helper variables.
11578
unsigned int rr = 0;
11579
unsigned int ss = 0;
11580
unsigned int tt = 0;
11581
double tmp5 = 0.00000000;
11582
double tmp6 = 0.00000000;
11583
double tmp7 = 0.00000000;
11584
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
11585
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
11586
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
11587
double tmp3 = 0.50000000*(1.00000000 - Z);
11588
double tmp4 = tmp3*tmp3;
11590
// Compute basisvalues.
11591
basisvalues[0] = 1.00000000;
11592
basisvalues[1] = tmp0;
11593
for (unsigned int r = 1; r < 2; r++)
11595
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
11596
ss = r*(r + 1)*(r + 2)/6;
11597
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
11598
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
11599
}// end loop over 'r'
11600
for (unsigned int r = 0; r < 2; r++)
11602
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
11603
ss = r*(r + 1)*(r + 2)/6;
11604
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
11605
}// end loop over 'r'
11606
for (unsigned int r = 0; r < 1; r++)
11608
for (unsigned int s = 1; s < 2 - r; s++)
11610
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
11611
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11612
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
11613
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11614
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11615
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11616
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
11617
}// end loop over 's'
11618
}// end loop over 'r'
11619
for (unsigned int r = 0; r < 2; r++)
11621
for (unsigned int s = 0; s < 2 - r; s++)
11623
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
11624
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11625
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
11626
}// end loop over 's'
11627
}// end loop over 'r'
11628
for (unsigned int r = 0; r < 1; r++)
11630
for (unsigned int s = 0; s < 1 - r; s++)
11632
for (unsigned int t = 1; t < 2 - r - s; t++)
11634
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
11635
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11636
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
11637
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11638
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11639
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11640
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
11641
}// end loop over 't'
11642
}// end loop over 's'
11643
}// end loop over 'r'
11644
for (unsigned int r = 0; r < 3; r++)
11646
for (unsigned int s = 0; s < 3 - r; s++)
11648
for (unsigned int t = 0; t < 3 - r - s; t++)
11650
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11651
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
11652
}// end loop over 't'
11653
}// end loop over 's'
11654
}// end loop over 'r'
11656
// Table(s) of coefficients.
11657
static const double coefficients0[10] = \
11658
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
11660
// Tables of derivatives of the polynomial base (transpose).
11661
static const double dmats0[10][10] = \
11662
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11663
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11664
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11665
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11666
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11667
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11668
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11669
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11670
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11671
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11673
static const double dmats1[10][10] = \
11674
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11675
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11676
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11677
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11678
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11679
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11680
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11681
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11682
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11683
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11685
static const double dmats2[10][10] = \
11686
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11687
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11688
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11689
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11690
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11691
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11692
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11693
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11694
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11695
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11697
// Compute reference derivatives.
11698
// Declare pointer to array of derivatives on FIAT element.
11699
double *derivatives = new double[num_derivatives];
11700
for (unsigned int r = 0; r < num_derivatives; r++)
11702
derivatives[r] = 0.00000000;
11703
}// end loop over 'r'
11705
// Declare derivative matrix (of polynomial basis).
11706
double dmats[10][10] = \
11707
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11708
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11709
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11710
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11711
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11712
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11713
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11714
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11715
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11716
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11718
// Declare (auxiliary) derivative matrix (of polynomial basis).
11719
double dmats_old[10][10] = \
11720
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11721
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11722
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11723
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11724
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11725
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11726
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11727
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11728
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11729
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11731
// Loop possible derivatives.
11732
for (unsigned int r = 0; r < num_derivatives; r++)
11734
// Resetting dmats values to compute next derivative.
11735
for (unsigned int t = 0; t < 10; t++)
11737
for (unsigned int u = 0; u < 10; u++)
11739
dmats[t][u] = 0.00000000;
11742
dmats[t][u] = 1.00000000;
11745
}// end loop over 'u'
11746
}// end loop over 't'
11748
// Looping derivative order to generate dmats.
11749
for (unsigned int s = 0; s < n; s++)
11751
// Updating dmats_old with new values and resetting dmats.
11752
for (unsigned int t = 0; t < 10; t++)
11754
for (unsigned int u = 0; u < 10; u++)
11756
dmats_old[t][u] = dmats[t][u];
11757
dmats[t][u] = 0.00000000;
11758
}// end loop over 'u'
11759
}// end loop over 't'
11761
// Update dmats using an inner product.
11762
if (combinations[r][s] == 0)
11764
for (unsigned int t = 0; t < 10; t++)
11766
for (unsigned int u = 0; u < 10; u++)
11768
for (unsigned int tu = 0; tu < 10; tu++)
11770
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
11771
}// end loop over 'tu'
11772
}// end loop over 'u'
11773
}// end loop over 't'
11776
if (combinations[r][s] == 1)
11778
for (unsigned int t = 0; t < 10; t++)
11780
for (unsigned int u = 0; u < 10; u++)
11782
for (unsigned int tu = 0; tu < 10; tu++)
11784
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
11785
}// end loop over 'tu'
11786
}// end loop over 'u'
11787
}// end loop over 't'
11790
if (combinations[r][s] == 2)
11792
for (unsigned int t = 0; t < 10; t++)
11794
for (unsigned int u = 0; u < 10; u++)
11796
for (unsigned int tu = 0; tu < 10; tu++)
11798
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
11799
}// end loop over 'tu'
11800
}// end loop over 'u'
11801
}// end loop over 't'
11804
}// end loop over 's'
11805
for (unsigned int s = 0; s < 10; s++)
11807
for (unsigned int t = 0; t < 10; t++)
11809
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
11810
}// end loop over 't'
11811
}// end loop over 's'
11812
}// end loop over 'r'
11814
// Transform derivatives back to physical element
11815
for (unsigned int r = 0; r < num_derivatives; r++)
11817
for (unsigned int s = 0; s < num_derivatives; s++)
11819
values[num_derivatives + r] += transform[r][s]*derivatives[s];
11820
}// end loop over 's'
11821
}// end loop over 'r'
11823
// Delete pointer to array of derivatives on FIAT element
11824
delete [] derivatives;
11826
// Delete pointer to array of combinations of derivatives and transform
11827
for (unsigned int r = 0; r < num_derivatives; r++)
11829
delete [] combinations[r];
11830
}// end loop over 'r'
11831
delete [] combinations;
11832
for (unsigned int r = 0; r < num_derivatives; r++)
11834
delete [] transform[r];
11835
}// end loop over 'r'
11836
delete [] transform;
11842
// Array of basisvalues.
11843
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
11845
// Declare helper variables.
11846
unsigned int rr = 0;
11847
unsigned int ss = 0;
11848
unsigned int tt = 0;
11849
double tmp5 = 0.00000000;
11850
double tmp6 = 0.00000000;
11851
double tmp7 = 0.00000000;
11852
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
11853
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
11854
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
11855
double tmp3 = 0.50000000*(1.00000000 - Z);
11856
double tmp4 = tmp3*tmp3;
11858
// Compute basisvalues.
11859
basisvalues[0] = 1.00000000;
11860
basisvalues[1] = tmp0;
11861
for (unsigned int r = 1; r < 2; r++)
11863
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
11864
ss = r*(r + 1)*(r + 2)/6;
11865
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
11866
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
11867
}// end loop over 'r'
11868
for (unsigned int r = 0; r < 2; r++)
11870
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
11871
ss = r*(r + 1)*(r + 2)/6;
11872
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
11873
}// end loop over 'r'
11874
for (unsigned int r = 0; r < 1; r++)
11876
for (unsigned int s = 1; s < 2 - r; s++)
11878
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
11879
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11880
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
11881
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11882
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11883
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
11884
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
11885
}// end loop over 's'
11886
}// end loop over 'r'
11887
for (unsigned int r = 0; r < 2; r++)
11889
for (unsigned int s = 0; s < 2 - r; s++)
11891
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
11892
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
11893
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
11894
}// end loop over 's'
11895
}// end loop over 'r'
11896
for (unsigned int r = 0; r < 1; r++)
11898
for (unsigned int s = 0; s < 1 - r; s++)
11900
for (unsigned int t = 1; t < 2 - r - s; t++)
11902
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
11903
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11904
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
11905
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11906
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11907
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
11908
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
11909
}// end loop over 't'
11910
}// end loop over 's'
11911
}// end loop over 'r'
11912
for (unsigned int r = 0; r < 3; r++)
11914
for (unsigned int s = 0; s < 3 - r; s++)
11916
for (unsigned int t = 0; t < 3 - r - s; t++)
11918
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
11919
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
11920
}// end loop over 't'
11921
}// end loop over 's'
11922
}// end loop over 'r'
11924
// Table(s) of coefficients.
11925
static const double coefficients0[10] = \
11926
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
11928
// Tables of derivatives of the polynomial base (transpose).
11929
static const double dmats0[10][10] = \
11930
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11931
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11932
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11933
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11934
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11935
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11936
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11937
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11938
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11939
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11941
static const double dmats1[10][10] = \
11942
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11943
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11944
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11945
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11946
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11947
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11948
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11949
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11950
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11951
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11953
static const double dmats2[10][10] = \
11954
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11955
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11956
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11957
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11958
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11959
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11960
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11961
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11962
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11963
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
11965
// Compute reference derivatives.
11966
// Declare pointer to array of derivatives on FIAT element.
11967
double *derivatives = new double[num_derivatives];
11968
for (unsigned int r = 0; r < num_derivatives; r++)
11970
derivatives[r] = 0.00000000;
11971
}// end loop over 'r'
11973
// Declare derivative matrix (of polynomial basis).
11974
double dmats[10][10] = \
11975
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11976
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11977
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11978
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11979
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11980
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11981
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11982
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11983
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11984
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11986
// Declare (auxiliary) derivative matrix (of polynomial basis).
11987
double dmats_old[10][10] = \
11988
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11989
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11990
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11991
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11992
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11993
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
11994
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
11995
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
11996
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
11997
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
11999
// Loop possible derivatives.
12000
for (unsigned int r = 0; r < num_derivatives; r++)
12002
// Resetting dmats values to compute next derivative.
12003
for (unsigned int t = 0; t < 10; t++)
12005
for (unsigned int u = 0; u < 10; u++)
12007
dmats[t][u] = 0.00000000;
12010
dmats[t][u] = 1.00000000;
12013
}// end loop over 'u'
12014
}// end loop over 't'
12016
// Looping derivative order to generate dmats.
12017
for (unsigned int s = 0; s < n; s++)
12019
// Updating dmats_old with new values and resetting dmats.
12020
for (unsigned int t = 0; t < 10; t++)
12022
for (unsigned int u = 0; u < 10; u++)
12024
dmats_old[t][u] = dmats[t][u];
12025
dmats[t][u] = 0.00000000;
12026
}// end loop over 'u'
12027
}// end loop over 't'
12029
// Update dmats using an inner product.
12030
if (combinations[r][s] == 0)
12032
for (unsigned int t = 0; t < 10; t++)
12034
for (unsigned int u = 0; u < 10; u++)
12036
for (unsigned int tu = 0; tu < 10; tu++)
12038
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
12039
}// end loop over 'tu'
12040
}// end loop over 'u'
12041
}// end loop over 't'
12044
if (combinations[r][s] == 1)
12046
for (unsigned int t = 0; t < 10; t++)
12048
for (unsigned int u = 0; u < 10; u++)
12050
for (unsigned int tu = 0; tu < 10; tu++)
12052
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
12053
}// end loop over 'tu'
12054
}// end loop over 'u'
12055
}// end loop over 't'
12058
if (combinations[r][s] == 2)
12060
for (unsigned int t = 0; t < 10; t++)
12062
for (unsigned int u = 0; u < 10; u++)
12064
for (unsigned int tu = 0; tu < 10; tu++)
12066
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
12067
}// end loop over 'tu'
12068
}// end loop over 'u'
12069
}// end loop over 't'
12072
}// end loop over 's'
12073
for (unsigned int s = 0; s < 10; s++)
12075
for (unsigned int t = 0; t < 10; t++)
12077
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
12078
}// end loop over 't'
12079
}// end loop over 's'
12080
}// end loop over 'r'
12082
// Transform derivatives back to physical element
12083
for (unsigned int r = 0; r < num_derivatives; r++)
12085
for (unsigned int s = 0; s < num_derivatives; s++)
12087
values[num_derivatives + r] += transform[r][s]*derivatives[s];
12088
}// end loop over 's'
12089
}// end loop over 'r'
12091
// Delete pointer to array of derivatives on FIAT element
12092
delete [] derivatives;
12094
// Delete pointer to array of combinations of derivatives and transform
12095
for (unsigned int r = 0; r < num_derivatives; r++)
12097
delete [] combinations[r];
12098
}// end loop over 'r'
12099
delete [] combinations;
12100
for (unsigned int r = 0; r < num_derivatives; r++)
12102
delete [] transform[r];
12103
}// end loop over 'r'
12104
delete [] transform;
12110
// Array of basisvalues.
12111
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
12113
// Declare helper variables.
12114
unsigned int rr = 0;
12115
unsigned int ss = 0;
12116
unsigned int tt = 0;
12117
double tmp5 = 0.00000000;
12118
double tmp6 = 0.00000000;
12119
double tmp7 = 0.00000000;
12120
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
12121
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
12122
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
12123
double tmp3 = 0.50000000*(1.00000000 - Z);
12124
double tmp4 = tmp3*tmp3;
12126
// Compute basisvalues.
12127
basisvalues[0] = 1.00000000;
12128
basisvalues[1] = tmp0;
12129
for (unsigned int r = 1; r < 2; r++)
12131
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
12132
ss = r*(r + 1)*(r + 2)/6;
12133
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
12134
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
12135
}// end loop over 'r'
12136
for (unsigned int r = 0; r < 2; r++)
12138
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
12139
ss = r*(r + 1)*(r + 2)/6;
12140
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
12141
}// end loop over 'r'
12142
for (unsigned int r = 0; r < 1; r++)
12144
for (unsigned int s = 1; s < 2 - r; s++)
12146
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
12147
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12148
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
12149
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12150
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12151
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12152
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
12153
}// end loop over 's'
12154
}// end loop over 'r'
12155
for (unsigned int r = 0; r < 2; r++)
12157
for (unsigned int s = 0; s < 2 - r; s++)
12159
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
12160
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12161
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
12162
}// end loop over 's'
12163
}// end loop over 'r'
12164
for (unsigned int r = 0; r < 1; r++)
12166
for (unsigned int s = 0; s < 1 - r; s++)
12168
for (unsigned int t = 1; t < 2 - r - s; t++)
12170
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
12171
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12172
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
12173
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12174
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12175
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12176
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
12177
}// end loop over 't'
12178
}// end loop over 's'
12179
}// end loop over 'r'
12180
for (unsigned int r = 0; r < 3; r++)
12182
for (unsigned int s = 0; s < 3 - r; s++)
12184
for (unsigned int t = 0; t < 3 - r - s; t++)
12186
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12187
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
12188
}// end loop over 't'
12189
}// end loop over 's'
12190
}// end loop over 'r'
12192
// Table(s) of coefficients.
12193
static const double coefficients0[10] = \
12194
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
12196
// Tables of derivatives of the polynomial base (transpose).
12197
static const double dmats0[10][10] = \
12198
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12199
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12200
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12201
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12202
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12203
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12204
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12205
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12206
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12207
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12209
static const double dmats1[10][10] = \
12210
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12211
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12212
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12213
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12214
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12215
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12216
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12217
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12218
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12219
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12221
static const double dmats2[10][10] = \
12222
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12223
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12224
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12225
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12226
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12227
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12228
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12229
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12230
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12231
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12233
// Compute reference derivatives.
12234
// Declare pointer to array of derivatives on FIAT element.
12235
double *derivatives = new double[num_derivatives];
12236
for (unsigned int r = 0; r < num_derivatives; r++)
12238
derivatives[r] = 0.00000000;
12239
}// end loop over 'r'
12241
// Declare derivative matrix (of polynomial basis).
12242
double dmats[10][10] = \
12243
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12244
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12245
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12246
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12247
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12248
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12249
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
12250
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
12251
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
12252
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
12254
// Declare (auxiliary) derivative matrix (of polynomial basis).
12255
double dmats_old[10][10] = \
12256
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12257
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12258
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12259
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12260
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12261
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12262
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
12263
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
12264
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
12265
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
12267
// Loop possible derivatives.
12268
for (unsigned int r = 0; r < num_derivatives; r++)
12270
// Resetting dmats values to compute next derivative.
12271
for (unsigned int t = 0; t < 10; t++)
12273
for (unsigned int u = 0; u < 10; u++)
12275
dmats[t][u] = 0.00000000;
12278
dmats[t][u] = 1.00000000;
12281
}// end loop over 'u'
12282
}// end loop over 't'
12284
// Looping derivative order to generate dmats.
12285
for (unsigned int s = 0; s < n; s++)
12287
// Updating dmats_old with new values and resetting dmats.
12288
for (unsigned int t = 0; t < 10; t++)
12290
for (unsigned int u = 0; u < 10; u++)
12292
dmats_old[t][u] = dmats[t][u];
12293
dmats[t][u] = 0.00000000;
12294
}// end loop over 'u'
12295
}// end loop over 't'
12297
// Update dmats using an inner product.
12298
if (combinations[r][s] == 0)
12300
for (unsigned int t = 0; t < 10; t++)
12302
for (unsigned int u = 0; u < 10; u++)
12304
for (unsigned int tu = 0; tu < 10; tu++)
12306
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
12307
}// end loop over 'tu'
12308
}// end loop over 'u'
12309
}// end loop over 't'
12312
if (combinations[r][s] == 1)
12314
for (unsigned int t = 0; t < 10; t++)
12316
for (unsigned int u = 0; u < 10; u++)
12318
for (unsigned int tu = 0; tu < 10; tu++)
12320
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
12321
}// end loop over 'tu'
12322
}// end loop over 'u'
12323
}// end loop over 't'
12326
if (combinations[r][s] == 2)
12328
for (unsigned int t = 0; t < 10; t++)
12330
for (unsigned int u = 0; u < 10; u++)
12332
for (unsigned int tu = 0; tu < 10; tu++)
12334
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
12335
}// end loop over 'tu'
12336
}// end loop over 'u'
12337
}// end loop over 't'
12340
}// end loop over 's'
12341
for (unsigned int s = 0; s < 10; s++)
12343
for (unsigned int t = 0; t < 10; t++)
12345
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
12346
}// end loop over 't'
12347
}// end loop over 's'
12348
}// end loop over 'r'
12350
// Transform derivatives back to physical element
12351
for (unsigned int r = 0; r < num_derivatives; r++)
12353
for (unsigned int s = 0; s < num_derivatives; s++)
12355
values[num_derivatives + r] += transform[r][s]*derivatives[s];
12356
}// end loop over 's'
12357
}// end loop over 'r'
12359
// Delete pointer to array of derivatives on FIAT element
12360
delete [] derivatives;
12362
// Delete pointer to array of combinations of derivatives and transform
12363
for (unsigned int r = 0; r < num_derivatives; r++)
12365
delete [] combinations[r];
12366
}// end loop over 'r'
12367
delete [] combinations;
12368
for (unsigned int r = 0; r < num_derivatives; r++)
12370
delete [] transform[r];
12371
}// end loop over 'r'
12372
delete [] transform;
12378
// Array of basisvalues.
12379
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
12381
// Declare helper variables.
12382
unsigned int rr = 0;
12383
unsigned int ss = 0;
12384
unsigned int tt = 0;
12385
double tmp5 = 0.00000000;
12386
double tmp6 = 0.00000000;
12387
double tmp7 = 0.00000000;
12388
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
12389
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
12390
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
12391
double tmp3 = 0.50000000*(1.00000000 - Z);
12392
double tmp4 = tmp3*tmp3;
12394
// Compute basisvalues.
12395
basisvalues[0] = 1.00000000;
12396
basisvalues[1] = tmp0;
12397
for (unsigned int r = 1; r < 2; r++)
12399
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
12400
ss = r*(r + 1)*(r + 2)/6;
12401
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
12402
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
12403
}// end loop over 'r'
12404
for (unsigned int r = 0; r < 2; r++)
12406
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
12407
ss = r*(r + 1)*(r + 2)/6;
12408
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
12409
}// end loop over 'r'
12410
for (unsigned int r = 0; r < 1; r++)
12412
for (unsigned int s = 1; s < 2 - r; s++)
12414
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
12415
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12416
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
12417
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12418
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12419
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12420
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
12421
}// end loop over 's'
12422
}// end loop over 'r'
12423
for (unsigned int r = 0; r < 2; r++)
12425
for (unsigned int s = 0; s < 2 - r; s++)
12427
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
12428
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12429
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
12430
}// end loop over 's'
12431
}// end loop over 'r'
12432
for (unsigned int r = 0; r < 1; r++)
12434
for (unsigned int s = 0; s < 1 - r; s++)
12436
for (unsigned int t = 1; t < 2 - r - s; t++)
12438
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
12439
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12440
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
12441
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12442
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12443
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12444
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
12445
}// end loop over 't'
12446
}// end loop over 's'
12447
}// end loop over 'r'
12448
for (unsigned int r = 0; r < 3; r++)
12450
for (unsigned int s = 0; s < 3 - r; s++)
12452
for (unsigned int t = 0; t < 3 - r - s; t++)
12454
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12455
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
12456
}// end loop over 't'
12457
}// end loop over 's'
12458
}// end loop over 'r'
12460
// Table(s) of coefficients.
12461
static const double coefficients0[10] = \
12462
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
12464
// Tables of derivatives of the polynomial base (transpose).
12465
static const double dmats0[10][10] = \
12466
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12467
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12468
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12469
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12470
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12471
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12472
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12473
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12474
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12475
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12477
static const double dmats1[10][10] = \
12478
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12479
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12480
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12481
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12482
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12483
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12484
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12485
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12486
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12487
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12489
static const double dmats2[10][10] = \
12490
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12491
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12492
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12493
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12494
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12495
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12496
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12497
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12498
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12499
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12501
// Compute reference derivatives.
12502
// Declare pointer to array of derivatives on FIAT element.
12503
double *derivatives = new double[num_derivatives];
12504
for (unsigned int r = 0; r < num_derivatives; r++)
12506
derivatives[r] = 0.00000000;
12507
}// end loop over 'r'
12509
// Declare derivative matrix (of polynomial basis).
12510
double dmats[10][10] = \
12511
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12512
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12513
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12514
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12515
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12516
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12517
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
12518
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
12519
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
12520
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
12522
// Declare (auxiliary) derivative matrix (of polynomial basis).
12523
double dmats_old[10][10] = \
12524
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12525
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12526
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12527
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12528
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12529
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12530
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
12531
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
12532
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
12533
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
12535
// Loop possible derivatives.
12536
for (unsigned int r = 0; r < num_derivatives; r++)
12538
// Resetting dmats values to compute next derivative.
12539
for (unsigned int t = 0; t < 10; t++)
12541
for (unsigned int u = 0; u < 10; u++)
12543
dmats[t][u] = 0.00000000;
12546
dmats[t][u] = 1.00000000;
12549
}// end loop over 'u'
12550
}// end loop over 't'
12552
// Looping derivative order to generate dmats.
12553
for (unsigned int s = 0; s < n; s++)
12555
// Updating dmats_old with new values and resetting dmats.
12556
for (unsigned int t = 0; t < 10; t++)
12558
for (unsigned int u = 0; u < 10; u++)
12560
dmats_old[t][u] = dmats[t][u];
12561
dmats[t][u] = 0.00000000;
12562
}// end loop over 'u'
12563
}// end loop over 't'
12565
// Update dmats using an inner product.
12566
if (combinations[r][s] == 0)
12568
for (unsigned int t = 0; t < 10; t++)
12570
for (unsigned int u = 0; u < 10; u++)
12572
for (unsigned int tu = 0; tu < 10; tu++)
12574
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
12575
}// end loop over 'tu'
12576
}// end loop over 'u'
12577
}// end loop over 't'
12580
if (combinations[r][s] == 1)
12582
for (unsigned int t = 0; t < 10; t++)
12584
for (unsigned int u = 0; u < 10; u++)
12586
for (unsigned int tu = 0; tu < 10; tu++)
12588
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
12589
}// end loop over 'tu'
12590
}// end loop over 'u'
12591
}// end loop over 't'
12594
if (combinations[r][s] == 2)
12596
for (unsigned int t = 0; t < 10; t++)
12598
for (unsigned int u = 0; u < 10; u++)
12600
for (unsigned int tu = 0; tu < 10; tu++)
12602
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
12603
}// end loop over 'tu'
12604
}// end loop over 'u'
12605
}// end loop over 't'
12608
}// end loop over 's'
12609
for (unsigned int s = 0; s < 10; s++)
12611
for (unsigned int t = 0; t < 10; t++)
12613
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
12614
}// end loop over 't'
12615
}// end loop over 's'
12616
}// end loop over 'r'
12618
// Transform derivatives back to physical element
12619
for (unsigned int r = 0; r < num_derivatives; r++)
12621
for (unsigned int s = 0; s < num_derivatives; s++)
12623
values[num_derivatives + r] += transform[r][s]*derivatives[s];
12624
}// end loop over 's'
12625
}// end loop over 'r'
12627
// Delete pointer to array of derivatives on FIAT element
12628
delete [] derivatives;
12630
// Delete pointer to array of combinations of derivatives and transform
12631
for (unsigned int r = 0; r < num_derivatives; r++)
12633
delete [] combinations[r];
12634
}// end loop over 'r'
12635
delete [] combinations;
12636
for (unsigned int r = 0; r < num_derivatives; r++)
12638
delete [] transform[r];
12639
}// end loop over 'r'
12640
delete [] transform;
12646
// Array of basisvalues.
12647
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
12649
// Declare helper variables.
12650
unsigned int rr = 0;
12651
unsigned int ss = 0;
12652
unsigned int tt = 0;
12653
double tmp5 = 0.00000000;
12654
double tmp6 = 0.00000000;
12655
double tmp7 = 0.00000000;
12656
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
12657
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
12658
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
12659
double tmp3 = 0.50000000*(1.00000000 - Z);
12660
double tmp4 = tmp3*tmp3;
12662
// Compute basisvalues.
12663
basisvalues[0] = 1.00000000;
12664
basisvalues[1] = tmp0;
12665
for (unsigned int r = 1; r < 2; r++)
12667
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
12668
ss = r*(r + 1)*(r + 2)/6;
12669
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
12670
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
12671
}// end loop over 'r'
12672
for (unsigned int r = 0; r < 2; r++)
12674
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
12675
ss = r*(r + 1)*(r + 2)/6;
12676
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
12677
}// end loop over 'r'
12678
for (unsigned int r = 0; r < 1; r++)
12680
for (unsigned int s = 1; s < 2 - r; s++)
12682
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
12683
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12684
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
12685
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12686
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12687
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12688
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
12689
}// end loop over 's'
12690
}// end loop over 'r'
12691
for (unsigned int r = 0; r < 2; r++)
12693
for (unsigned int s = 0; s < 2 - r; s++)
12695
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
12696
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12697
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
12698
}// end loop over 's'
12699
}// end loop over 'r'
12700
for (unsigned int r = 0; r < 1; r++)
12702
for (unsigned int s = 0; s < 1 - r; s++)
12704
for (unsigned int t = 1; t < 2 - r - s; t++)
12706
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
12707
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12708
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
12709
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12710
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12711
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12712
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
12713
}// end loop over 't'
12714
}// end loop over 's'
12715
}// end loop over 'r'
12716
for (unsigned int r = 0; r < 3; r++)
12718
for (unsigned int s = 0; s < 3 - r; s++)
12720
for (unsigned int t = 0; t < 3 - r - s; t++)
12722
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12723
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
12724
}// end loop over 't'
12725
}// end loop over 's'
12726
}// end loop over 'r'
12728
// Table(s) of coefficients.
12729
static const double coefficients0[10] = \
12730
{-0.05773503, -0.06085806, -0.03513642, -0.02484520, 0.06506000, 0.05039526, 0.04114756, 0.02909572, 0.02375655, 0.01679842};
12732
// Tables of derivatives of the polynomial base (transpose).
12733
static const double dmats0[10][10] = \
12734
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12735
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12736
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12737
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12738
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12739
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12740
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12741
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12742
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12743
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12745
static const double dmats1[10][10] = \
12746
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12747
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12748
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12749
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12750
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12751
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12752
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12753
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12754
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12755
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12757
static const double dmats2[10][10] = \
12758
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12759
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12760
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12761
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12762
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12763
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12764
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12765
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12766
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12767
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
12769
// Compute reference derivatives.
12770
// Declare pointer to array of derivatives on FIAT element.
12771
double *derivatives = new double[num_derivatives];
12772
for (unsigned int r = 0; r < num_derivatives; r++)
12774
derivatives[r] = 0.00000000;
12775
}// end loop over 'r'
12777
// Declare derivative matrix (of polynomial basis).
12778
double dmats[10][10] = \
12779
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12780
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12781
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12782
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12783
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12784
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12785
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
12786
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
12787
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
12788
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
12790
// Declare (auxiliary) derivative matrix (of polynomial basis).
12791
double dmats_old[10][10] = \
12792
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12793
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12794
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12795
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12796
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12797
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
12798
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
12799
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
12800
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
12801
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
12803
// Loop possible derivatives.
12804
for (unsigned int r = 0; r < num_derivatives; r++)
12806
// Resetting dmats values to compute next derivative.
12807
for (unsigned int t = 0; t < 10; t++)
12809
for (unsigned int u = 0; u < 10; u++)
12811
dmats[t][u] = 0.00000000;
12814
dmats[t][u] = 1.00000000;
12817
}// end loop over 'u'
12818
}// end loop over 't'
12820
// Looping derivative order to generate dmats.
12821
for (unsigned int s = 0; s < n; s++)
12823
// Updating dmats_old with new values and resetting dmats.
12824
for (unsigned int t = 0; t < 10; t++)
12826
for (unsigned int u = 0; u < 10; u++)
12828
dmats_old[t][u] = dmats[t][u];
12829
dmats[t][u] = 0.00000000;
12830
}// end loop over 'u'
12831
}// end loop over 't'
12833
// Update dmats using an inner product.
12834
if (combinations[r][s] == 0)
12836
for (unsigned int t = 0; t < 10; t++)
12838
for (unsigned int u = 0; u < 10; u++)
12840
for (unsigned int tu = 0; tu < 10; tu++)
12842
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
12843
}// end loop over 'tu'
12844
}// end loop over 'u'
12845
}// end loop over 't'
12848
if (combinations[r][s] == 1)
12850
for (unsigned int t = 0; t < 10; t++)
12852
for (unsigned int u = 0; u < 10; u++)
12854
for (unsigned int tu = 0; tu < 10; tu++)
12856
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
12857
}// end loop over 'tu'
12858
}// end loop over 'u'
12859
}// end loop over 't'
12862
if (combinations[r][s] == 2)
12864
for (unsigned int t = 0; t < 10; t++)
12866
for (unsigned int u = 0; u < 10; u++)
12868
for (unsigned int tu = 0; tu < 10; tu++)
12870
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
12871
}// end loop over 'tu'
12872
}// end loop over 'u'
12873
}// end loop over 't'
12876
}// end loop over 's'
12877
for (unsigned int s = 0; s < 10; s++)
12879
for (unsigned int t = 0; t < 10; t++)
12881
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
12882
}// end loop over 't'
12883
}// end loop over 's'
12884
}// end loop over 'r'
12886
// Transform derivatives back to physical element
12887
for (unsigned int r = 0; r < num_derivatives; r++)
12889
for (unsigned int s = 0; s < num_derivatives; s++)
12891
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
12892
}// end loop over 's'
12893
}// end loop over 'r'
12895
// Delete pointer to array of derivatives on FIAT element
12896
delete [] derivatives;
12898
// Delete pointer to array of combinations of derivatives and transform
12899
for (unsigned int r = 0; r < num_derivatives; r++)
12901
delete [] combinations[r];
12902
}// end loop over 'r'
12903
delete [] combinations;
12904
for (unsigned int r = 0; r < num_derivatives; r++)
12906
delete [] transform[r];
12907
}// end loop over 'r'
12908
delete [] transform;
12914
// Array of basisvalues.
12915
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
12917
// Declare helper variables.
12918
unsigned int rr = 0;
12919
unsigned int ss = 0;
12920
unsigned int tt = 0;
12921
double tmp5 = 0.00000000;
12922
double tmp6 = 0.00000000;
12923
double tmp7 = 0.00000000;
12924
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
12925
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
12926
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
12927
double tmp3 = 0.50000000*(1.00000000 - Z);
12928
double tmp4 = tmp3*tmp3;
12930
// Compute basisvalues.
12931
basisvalues[0] = 1.00000000;
12932
basisvalues[1] = tmp0;
12933
for (unsigned int r = 1; r < 2; r++)
12935
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
12936
ss = r*(r + 1)*(r + 2)/6;
12937
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
12938
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
12939
}// end loop over 'r'
12940
for (unsigned int r = 0; r < 2; r++)
12942
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
12943
ss = r*(r + 1)*(r + 2)/6;
12944
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
12945
}// end loop over 'r'
12946
for (unsigned int r = 0; r < 1; r++)
12948
for (unsigned int s = 1; s < 2 - r; s++)
12950
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
12951
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12952
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
12953
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12954
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12955
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
12956
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
12957
}// end loop over 's'
12958
}// end loop over 'r'
12959
for (unsigned int r = 0; r < 2; r++)
12961
for (unsigned int s = 0; s < 2 - r; s++)
12963
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
12964
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
12965
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
12966
}// end loop over 's'
12967
}// end loop over 'r'
12968
for (unsigned int r = 0; r < 1; r++)
12970
for (unsigned int s = 0; s < 1 - r; s++)
12972
for (unsigned int t = 1; t < 2 - r - s; t++)
12974
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
12975
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12976
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
12977
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12978
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12979
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
12980
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
12981
}// end loop over 't'
12982
}// end loop over 's'
12983
}// end loop over 'r'
12984
for (unsigned int r = 0; r < 3; r++)
12986
for (unsigned int s = 0; s < 3 - r; s++)
12988
for (unsigned int t = 0; t < 3 - r - s; t++)
12990
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
12991
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
12992
}// end loop over 't'
12993
}// end loop over 's'
12994
}// end loop over 'r'
12996
// Table(s) of coefficients.
12997
static const double coefficients0[10] = \
12998
{-0.05773503, 0.06085806, -0.03513642, -0.02484520, 0.06506000, -0.05039526, -0.04114756, 0.02909572, 0.02375655, 0.01679842};
13000
// Tables of derivatives of the polynomial base (transpose).
13001
static const double dmats0[10][10] = \
13002
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13003
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13004
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13005
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13006
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13007
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13008
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13009
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13010
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13011
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13013
static const double dmats1[10][10] = \
13014
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13015
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13016
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13017
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13018
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13019
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13020
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13021
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13022
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13023
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13025
static const double dmats2[10][10] = \
13026
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13027
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13028
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13029
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13030
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13031
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13032
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13033
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13034
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13035
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13037
// Compute reference derivatives.
13038
// Declare pointer to array of derivatives on FIAT element.
13039
double *derivatives = new double[num_derivatives];
13040
for (unsigned int r = 0; r < num_derivatives; r++)
13042
derivatives[r] = 0.00000000;
13043
}// end loop over 'r'
13045
// Declare derivative matrix (of polynomial basis).
13046
double dmats[10][10] = \
13047
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13048
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13049
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13050
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13051
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13052
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13053
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13054
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13055
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13056
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13058
// Declare (auxiliary) derivative matrix (of polynomial basis).
13059
double dmats_old[10][10] = \
13060
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13061
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13062
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13063
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13064
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13065
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13066
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13067
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13068
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13069
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13071
// Loop possible derivatives.
13072
for (unsigned int r = 0; r < num_derivatives; r++)
13074
// Resetting dmats values to compute next derivative.
13075
for (unsigned int t = 0; t < 10; t++)
13077
for (unsigned int u = 0; u < 10; u++)
13079
dmats[t][u] = 0.00000000;
13082
dmats[t][u] = 1.00000000;
13085
}// end loop over 'u'
13086
}// end loop over 't'
13088
// Looping derivative order to generate dmats.
13089
for (unsigned int s = 0; s < n; s++)
13091
// Updating dmats_old with new values and resetting dmats.
13092
for (unsigned int t = 0; t < 10; t++)
13094
for (unsigned int u = 0; u < 10; u++)
13096
dmats_old[t][u] = dmats[t][u];
13097
dmats[t][u] = 0.00000000;
13098
}// end loop over 'u'
13099
}// end loop over 't'
13101
// Update dmats using an inner product.
13102
if (combinations[r][s] == 0)
13104
for (unsigned int t = 0; t < 10; t++)
13106
for (unsigned int u = 0; u < 10; u++)
13108
for (unsigned int tu = 0; tu < 10; tu++)
13110
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
13111
}// end loop over 'tu'
13112
}// end loop over 'u'
13113
}// end loop over 't'
13116
if (combinations[r][s] == 1)
13118
for (unsigned int t = 0; t < 10; t++)
13120
for (unsigned int u = 0; u < 10; u++)
13122
for (unsigned int tu = 0; tu < 10; tu++)
13124
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
13125
}// end loop over 'tu'
13126
}// end loop over 'u'
13127
}// end loop over 't'
13130
if (combinations[r][s] == 2)
13132
for (unsigned int t = 0; t < 10; t++)
13134
for (unsigned int u = 0; u < 10; u++)
13136
for (unsigned int tu = 0; tu < 10; tu++)
13138
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
13139
}// end loop over 'tu'
13140
}// end loop over 'u'
13141
}// end loop over 't'
13144
}// end loop over 's'
13145
for (unsigned int s = 0; s < 10; s++)
13147
for (unsigned int t = 0; t < 10; t++)
13149
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
13150
}// end loop over 't'
13151
}// end loop over 's'
13152
}// end loop over 'r'
13154
// Transform derivatives back to physical element
13155
for (unsigned int r = 0; r < num_derivatives; r++)
13157
for (unsigned int s = 0; s < num_derivatives; s++)
13159
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
13160
}// end loop over 's'
13161
}// end loop over 'r'
13163
// Delete pointer to array of derivatives on FIAT element
13164
delete [] derivatives;
13166
// Delete pointer to array of combinations of derivatives and transform
13167
for (unsigned int r = 0; r < num_derivatives; r++)
13169
delete [] combinations[r];
13170
}// end loop over 'r'
13171
delete [] combinations;
13172
for (unsigned int r = 0; r < num_derivatives; r++)
13174
delete [] transform[r];
13175
}// end loop over 'r'
13176
delete [] transform;
13182
// Array of basisvalues.
13183
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
13185
// Declare helper variables.
13186
unsigned int rr = 0;
13187
unsigned int ss = 0;
13188
unsigned int tt = 0;
13189
double tmp5 = 0.00000000;
13190
double tmp6 = 0.00000000;
13191
double tmp7 = 0.00000000;
13192
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
13193
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
13194
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
13195
double tmp3 = 0.50000000*(1.00000000 - Z);
13196
double tmp4 = tmp3*tmp3;
13198
// Compute basisvalues.
13199
basisvalues[0] = 1.00000000;
13200
basisvalues[1] = tmp0;
13201
for (unsigned int r = 1; r < 2; r++)
13203
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
13204
ss = r*(r + 1)*(r + 2)/6;
13205
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
13206
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
13207
}// end loop over 'r'
13208
for (unsigned int r = 0; r < 2; r++)
13210
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
13211
ss = r*(r + 1)*(r + 2)/6;
13212
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
13213
}// end loop over 'r'
13214
for (unsigned int r = 0; r < 1; r++)
13216
for (unsigned int s = 1; s < 2 - r; s++)
13218
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
13219
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
13220
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
13221
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13222
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13223
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13224
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
13225
}// end loop over 's'
13226
}// end loop over 'r'
13227
for (unsigned int r = 0; r < 2; r++)
13229
for (unsigned int s = 0; s < 2 - r; s++)
13231
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
13232
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
13233
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
13234
}// end loop over 's'
13235
}// end loop over 'r'
13236
for (unsigned int r = 0; r < 1; r++)
13238
for (unsigned int s = 0; s < 1 - r; s++)
13240
for (unsigned int t = 1; t < 2 - r - s; t++)
13242
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
13243
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
13244
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
13245
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13246
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13247
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13248
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
13249
}// end loop over 't'
13250
}// end loop over 's'
13251
}// end loop over 'r'
13252
for (unsigned int r = 0; r < 3; r++)
13254
for (unsigned int s = 0; s < 3 - r; s++)
13256
for (unsigned int t = 0; t < 3 - r - s; t++)
13258
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
13259
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
13260
}// end loop over 't'
13261
}// end loop over 's'
13262
}// end loop over 'r'
13264
// Table(s) of coefficients.
13265
static const double coefficients0[10] = \
13266
{-0.05773503, 0.00000000, 0.07027284, -0.02484520, 0.00000000, 0.00000000, 0.00000000, 0.08728716, -0.04751311, 0.01679842};
13268
// Tables of derivatives of the polynomial base (transpose).
13269
static const double dmats0[10][10] = \
13270
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13271
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13272
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13273
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13274
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13275
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13276
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13277
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13278
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13279
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13281
static const double dmats1[10][10] = \
13282
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13283
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13284
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13285
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13286
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13287
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13288
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13289
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13290
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13291
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13293
static const double dmats2[10][10] = \
13294
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13295
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13296
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13297
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13298
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13299
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13300
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13301
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13302
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13303
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13305
// Compute reference derivatives.
13306
// Declare pointer to array of derivatives on FIAT element.
13307
double *derivatives = new double[num_derivatives];
13308
for (unsigned int r = 0; r < num_derivatives; r++)
13310
derivatives[r] = 0.00000000;
13311
}// end loop over 'r'
13313
// Declare derivative matrix (of polynomial basis).
13314
double dmats[10][10] = \
13315
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13316
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13317
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13318
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13319
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13320
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13321
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13322
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13323
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13324
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13326
// Declare (auxiliary) derivative matrix (of polynomial basis).
13327
double dmats_old[10][10] = \
13328
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13329
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13330
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13331
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13332
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13333
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13334
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13335
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13336
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13337
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13339
// Loop possible derivatives.
13340
for (unsigned int r = 0; r < num_derivatives; r++)
13342
// Resetting dmats values to compute next derivative.
13343
for (unsigned int t = 0; t < 10; t++)
13345
for (unsigned int u = 0; u < 10; u++)
13347
dmats[t][u] = 0.00000000;
13350
dmats[t][u] = 1.00000000;
13353
}// end loop over 'u'
13354
}// end loop over 't'
13356
// Looping derivative order to generate dmats.
13357
for (unsigned int s = 0; s < n; s++)
13359
// Updating dmats_old with new values and resetting dmats.
13360
for (unsigned int t = 0; t < 10; t++)
13362
for (unsigned int u = 0; u < 10; u++)
13364
dmats_old[t][u] = dmats[t][u];
13365
dmats[t][u] = 0.00000000;
13366
}// end loop over 'u'
13367
}// end loop over 't'
13369
// Update dmats using an inner product.
13370
if (combinations[r][s] == 0)
13372
for (unsigned int t = 0; t < 10; t++)
13374
for (unsigned int u = 0; u < 10; u++)
13376
for (unsigned int tu = 0; tu < 10; tu++)
13378
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
13379
}// end loop over 'tu'
13380
}// end loop over 'u'
13381
}// end loop over 't'
13384
if (combinations[r][s] == 1)
13386
for (unsigned int t = 0; t < 10; t++)
13388
for (unsigned int u = 0; u < 10; u++)
13390
for (unsigned int tu = 0; tu < 10; tu++)
13392
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
13393
}// end loop over 'tu'
13394
}// end loop over 'u'
13395
}// end loop over 't'
13398
if (combinations[r][s] == 2)
13400
for (unsigned int t = 0; t < 10; t++)
13402
for (unsigned int u = 0; u < 10; u++)
13404
for (unsigned int tu = 0; tu < 10; tu++)
13406
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
13407
}// end loop over 'tu'
13408
}// end loop over 'u'
13409
}// end loop over 't'
13412
}// end loop over 's'
13413
for (unsigned int s = 0; s < 10; s++)
13415
for (unsigned int t = 0; t < 10; t++)
13417
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
13418
}// end loop over 't'
13419
}// end loop over 's'
13420
}// end loop over 'r'
13422
// Transform derivatives back to physical element
13423
for (unsigned int r = 0; r < num_derivatives; r++)
13425
for (unsigned int s = 0; s < num_derivatives; s++)
13427
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
13428
}// end loop over 's'
13429
}// end loop over 'r'
13431
// Delete pointer to array of derivatives on FIAT element
13432
delete [] derivatives;
13434
// Delete pointer to array of combinations of derivatives and transform
13435
for (unsigned int r = 0; r < num_derivatives; r++)
13437
delete [] combinations[r];
13438
}// end loop over 'r'
13439
delete [] combinations;
13440
for (unsigned int r = 0; r < num_derivatives; r++)
13442
delete [] transform[r];
13443
}// end loop over 'r'
13444
delete [] transform;
13450
// Array of basisvalues.
13451
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
13453
// Declare helper variables.
13454
unsigned int rr = 0;
13455
unsigned int ss = 0;
13456
unsigned int tt = 0;
13457
double tmp5 = 0.00000000;
13458
double tmp6 = 0.00000000;
13459
double tmp7 = 0.00000000;
13460
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
13461
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
13462
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
13463
double tmp3 = 0.50000000*(1.00000000 - Z);
13464
double tmp4 = tmp3*tmp3;
13466
// Compute basisvalues.
13467
basisvalues[0] = 1.00000000;
13468
basisvalues[1] = tmp0;
13469
for (unsigned int r = 1; r < 2; r++)
13471
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
13472
ss = r*(r + 1)*(r + 2)/6;
13473
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
13474
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
13475
}// end loop over 'r'
13476
for (unsigned int r = 0; r < 2; r++)
13478
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
13479
ss = r*(r + 1)*(r + 2)/6;
13480
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
13481
}// end loop over 'r'
13482
for (unsigned int r = 0; r < 1; r++)
13484
for (unsigned int s = 1; s < 2 - r; s++)
13486
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
13487
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
13488
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
13489
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13490
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13491
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13492
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
13493
}// end loop over 's'
13494
}// end loop over 'r'
13495
for (unsigned int r = 0; r < 2; r++)
13497
for (unsigned int s = 0; s < 2 - r; s++)
13499
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
13500
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
13501
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
13502
}// end loop over 's'
13503
}// end loop over 'r'
13504
for (unsigned int r = 0; r < 1; r++)
13506
for (unsigned int s = 0; s < 1 - r; s++)
13508
for (unsigned int t = 1; t < 2 - r - s; t++)
13510
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
13511
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
13512
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
13513
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13514
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13515
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13516
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
13517
}// end loop over 't'
13518
}// end loop over 's'
13519
}// end loop over 'r'
13520
for (unsigned int r = 0; r < 3; r++)
13522
for (unsigned int s = 0; s < 3 - r; s++)
13524
for (unsigned int t = 0; t < 3 - r - s; t++)
13526
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
13527
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
13528
}// end loop over 't'
13529
}// end loop over 's'
13530
}// end loop over 'r'
13532
// Table(s) of coefficients.
13533
static const double coefficients0[10] = \
13534
{-0.05773503, 0.00000000, 0.00000000, 0.07453560, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.10079053};
13536
// Tables of derivatives of the polynomial base (transpose).
13537
static const double dmats0[10][10] = \
13538
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13539
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13540
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13541
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13542
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13543
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13544
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13545
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13546
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13547
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13549
static const double dmats1[10][10] = \
13550
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13551
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13552
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13553
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13554
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13555
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13556
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13557
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13558
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13559
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13561
static const double dmats2[10][10] = \
13562
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13563
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13564
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13565
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13566
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13567
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13568
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13569
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13570
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13571
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13573
// Compute reference derivatives.
13574
// Declare pointer to array of derivatives on FIAT element.
13575
double *derivatives = new double[num_derivatives];
13576
for (unsigned int r = 0; r < num_derivatives; r++)
13578
derivatives[r] = 0.00000000;
13579
}// end loop over 'r'
13581
// Declare derivative matrix (of polynomial basis).
13582
double dmats[10][10] = \
13583
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13584
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13585
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13586
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13587
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13588
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13589
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13590
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13591
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13592
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13594
// Declare (auxiliary) derivative matrix (of polynomial basis).
13595
double dmats_old[10][10] = \
13596
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13597
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13598
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13599
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13600
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13601
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13602
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13603
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13604
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13605
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13607
// Loop possible derivatives.
13608
for (unsigned int r = 0; r < num_derivatives; r++)
13610
// Resetting dmats values to compute next derivative.
13611
for (unsigned int t = 0; t < 10; t++)
13613
for (unsigned int u = 0; u < 10; u++)
13615
dmats[t][u] = 0.00000000;
13618
dmats[t][u] = 1.00000000;
13621
}// end loop over 'u'
13622
}// end loop over 't'
13624
// Looping derivative order to generate dmats.
13625
for (unsigned int s = 0; s < n; s++)
13627
// Updating dmats_old with new values and resetting dmats.
13628
for (unsigned int t = 0; t < 10; t++)
13630
for (unsigned int u = 0; u < 10; u++)
13632
dmats_old[t][u] = dmats[t][u];
13633
dmats[t][u] = 0.00000000;
13634
}// end loop over 'u'
13635
}// end loop over 't'
13637
// Update dmats using an inner product.
13638
if (combinations[r][s] == 0)
13640
for (unsigned int t = 0; t < 10; t++)
13642
for (unsigned int u = 0; u < 10; u++)
13644
for (unsigned int tu = 0; tu < 10; tu++)
13646
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
13647
}// end loop over 'tu'
13648
}// end loop over 'u'
13649
}// end loop over 't'
13652
if (combinations[r][s] == 1)
13654
for (unsigned int t = 0; t < 10; t++)
13656
for (unsigned int u = 0; u < 10; u++)
13658
for (unsigned int tu = 0; tu < 10; tu++)
13660
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
13661
}// end loop over 'tu'
13662
}// end loop over 'u'
13663
}// end loop over 't'
13666
if (combinations[r][s] == 2)
13668
for (unsigned int t = 0; t < 10; t++)
13670
for (unsigned int u = 0; u < 10; u++)
13672
for (unsigned int tu = 0; tu < 10; tu++)
13674
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
13675
}// end loop over 'tu'
13676
}// end loop over 'u'
13677
}// end loop over 't'
13680
}// end loop over 's'
13681
for (unsigned int s = 0; s < 10; s++)
13683
for (unsigned int t = 0; t < 10; t++)
13685
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
13686
}// end loop over 't'
13687
}// end loop over 's'
13688
}// end loop over 'r'
13690
// Transform derivatives back to physical element
13691
for (unsigned int r = 0; r < num_derivatives; r++)
13693
for (unsigned int s = 0; s < num_derivatives; s++)
13695
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
13696
}// end loop over 's'
13697
}// end loop over 'r'
13699
// Delete pointer to array of derivatives on FIAT element
13700
delete [] derivatives;
13702
// Delete pointer to array of combinations of derivatives and transform
13703
for (unsigned int r = 0; r < num_derivatives; r++)
13705
delete [] combinations[r];
13706
}// end loop over 'r'
13707
delete [] combinations;
13708
for (unsigned int r = 0; r < num_derivatives; r++)
13710
delete [] transform[r];
13711
}// end loop over 'r'
13712
delete [] transform;
13718
// Array of basisvalues.
13719
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
13721
// Declare helper variables.
13722
unsigned int rr = 0;
13723
unsigned int ss = 0;
13724
unsigned int tt = 0;
13725
double tmp5 = 0.00000000;
13726
double tmp6 = 0.00000000;
13727
double tmp7 = 0.00000000;
13728
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
13729
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
13730
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
13731
double tmp3 = 0.50000000*(1.00000000 - Z);
13732
double tmp4 = tmp3*tmp3;
13734
// Compute basisvalues.
13735
basisvalues[0] = 1.00000000;
13736
basisvalues[1] = tmp0;
13737
for (unsigned int r = 1; r < 2; r++)
13739
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
13740
ss = r*(r + 1)*(r + 2)/6;
13741
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
13742
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
13743
}// end loop over 'r'
13744
for (unsigned int r = 0; r < 2; r++)
13746
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
13747
ss = r*(r + 1)*(r + 2)/6;
13748
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
13749
}// end loop over 'r'
13750
for (unsigned int r = 0; r < 1; r++)
13752
for (unsigned int s = 1; s < 2 - r; s++)
13754
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
13755
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
13756
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
13757
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13758
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13759
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
13760
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
13761
}// end loop over 's'
13762
}// end loop over 'r'
13763
for (unsigned int r = 0; r < 2; r++)
13765
for (unsigned int s = 0; s < 2 - r; s++)
13767
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
13768
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
13769
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
13770
}// end loop over 's'
13771
}// end loop over 'r'
13772
for (unsigned int r = 0; r < 1; r++)
13774
for (unsigned int s = 0; s < 1 - r; s++)
13776
for (unsigned int t = 1; t < 2 - r - s; t++)
13778
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
13779
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
13780
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
13781
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13782
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13783
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
13784
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
13785
}// end loop over 't'
13786
}// end loop over 's'
13787
}// end loop over 'r'
13788
for (unsigned int r = 0; r < 3; r++)
13790
for (unsigned int s = 0; s < 3 - r; s++)
13792
for (unsigned int t = 0; t < 3 - r - s; t++)
13794
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
13795
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
13796
}// end loop over 't'
13797
}// end loop over 's'
13798
}// end loop over 'r'
13800
// Table(s) of coefficients.
13801
static const double coefficients0[10] = \
13802
{0.23094011, 0.00000000, 0.14054567, 0.09938080, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.11878277, -0.06719368};
13804
// Tables of derivatives of the polynomial base (transpose).
13805
static const double dmats0[10][10] = \
13806
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13807
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13808
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13809
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13810
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13811
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13812
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13813
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13814
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13815
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13817
static const double dmats1[10][10] = \
13818
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13819
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13820
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13821
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13822
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13823
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13824
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13825
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13826
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13827
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13829
static const double dmats2[10][10] = \
13830
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13831
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13832
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13833
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13834
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13835
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13836
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13837
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13838
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13839
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
13841
// Compute reference derivatives.
13842
// Declare pointer to array of derivatives on FIAT element.
13843
double *derivatives = new double[num_derivatives];
13844
for (unsigned int r = 0; r < num_derivatives; r++)
13846
derivatives[r] = 0.00000000;
13847
}// end loop over 'r'
13849
// Declare derivative matrix (of polynomial basis).
13850
double dmats[10][10] = \
13851
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13852
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13853
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13854
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13855
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13856
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13857
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13858
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13859
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13860
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13862
// Declare (auxiliary) derivative matrix (of polynomial basis).
13863
double dmats_old[10][10] = \
13864
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13865
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13866
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13867
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13868
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13869
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
13870
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
13871
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
13872
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
13873
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
13875
// Loop possible derivatives.
13876
for (unsigned int r = 0; r < num_derivatives; r++)
13878
// Resetting dmats values to compute next derivative.
13879
for (unsigned int t = 0; t < 10; t++)
13881
for (unsigned int u = 0; u < 10; u++)
13883
dmats[t][u] = 0.00000000;
13886
dmats[t][u] = 1.00000000;
13889
}// end loop over 'u'
13890
}// end loop over 't'
13892
// Looping derivative order to generate dmats.
13893
for (unsigned int s = 0; s < n; s++)
13895
// Updating dmats_old with new values and resetting dmats.
13896
for (unsigned int t = 0; t < 10; t++)
13898
for (unsigned int u = 0; u < 10; u++)
13900
dmats_old[t][u] = dmats[t][u];
13901
dmats[t][u] = 0.00000000;
13902
}// end loop over 'u'
13903
}// end loop over 't'
13905
// Update dmats using an inner product.
13906
if (combinations[r][s] == 0)
13908
for (unsigned int t = 0; t < 10; t++)
13910
for (unsigned int u = 0; u < 10; u++)
13912
for (unsigned int tu = 0; tu < 10; tu++)
13914
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
13915
}// end loop over 'tu'
13916
}// end loop over 'u'
13917
}// end loop over 't'
13920
if (combinations[r][s] == 1)
13922
for (unsigned int t = 0; t < 10; t++)
13924
for (unsigned int u = 0; u < 10; u++)
13926
for (unsigned int tu = 0; tu < 10; tu++)
13928
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
13929
}// end loop over 'tu'
13930
}// end loop over 'u'
13931
}// end loop over 't'
13934
if (combinations[r][s] == 2)
13936
for (unsigned int t = 0; t < 10; t++)
13938
for (unsigned int u = 0; u < 10; u++)
13940
for (unsigned int tu = 0; tu < 10; tu++)
13942
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
13943
}// end loop over 'tu'
13944
}// end loop over 'u'
13945
}// end loop over 't'
13948
}// end loop over 's'
13949
for (unsigned int s = 0; s < 10; s++)
13951
for (unsigned int t = 0; t < 10; t++)
13953
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
13954
}// end loop over 't'
13955
}// end loop over 's'
13956
}// end loop over 'r'
13958
// Transform derivatives back to physical element
13959
for (unsigned int r = 0; r < num_derivatives; r++)
13961
for (unsigned int s = 0; s < num_derivatives; s++)
13963
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
13964
}// end loop over 's'
13965
}// end loop over 'r'
13967
// Delete pointer to array of derivatives on FIAT element
13968
delete [] derivatives;
13970
// Delete pointer to array of combinations of derivatives and transform
13971
for (unsigned int r = 0; r < num_derivatives; r++)
13973
delete [] combinations[r];
13974
}// end loop over 'r'
13975
delete [] combinations;
13976
for (unsigned int r = 0; r < num_derivatives; r++)
13978
delete [] transform[r];
13979
}// end loop over 'r'
13980
delete [] transform;
13986
// Array of basisvalues.
13987
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
13989
// Declare helper variables.
13990
unsigned int rr = 0;
13991
unsigned int ss = 0;
13992
unsigned int tt = 0;
13993
double tmp5 = 0.00000000;
13994
double tmp6 = 0.00000000;
13995
double tmp7 = 0.00000000;
13996
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
13997
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
13998
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
13999
double tmp3 = 0.50000000*(1.00000000 - Z);
14000
double tmp4 = tmp3*tmp3;
14002
// Compute basisvalues.
14003
basisvalues[0] = 1.00000000;
14004
basisvalues[1] = tmp0;
14005
for (unsigned int r = 1; r < 2; r++)
14007
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
14008
ss = r*(r + 1)*(r + 2)/6;
14009
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
14010
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
14011
}// end loop over 'r'
14012
for (unsigned int r = 0; r < 2; r++)
14014
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
14015
ss = r*(r + 1)*(r + 2)/6;
14016
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
14017
}// end loop over 'r'
14018
for (unsigned int r = 0; r < 1; r++)
14020
for (unsigned int s = 1; s < 2 - r; s++)
14022
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
14023
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14024
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
14025
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14026
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14027
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14028
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
14029
}// end loop over 's'
14030
}// end loop over 'r'
14031
for (unsigned int r = 0; r < 2; r++)
14033
for (unsigned int s = 0; s < 2 - r; s++)
14035
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
14036
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14037
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
14038
}// end loop over 's'
14039
}// end loop over 'r'
14040
for (unsigned int r = 0; r < 1; r++)
14042
for (unsigned int s = 0; s < 1 - r; s++)
14044
for (unsigned int t = 1; t < 2 - r - s; t++)
14046
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
14047
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14048
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
14049
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14050
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14051
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14052
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
14053
}// end loop over 't'
14054
}// end loop over 's'
14055
}// end loop over 'r'
14056
for (unsigned int r = 0; r < 3; r++)
14058
for (unsigned int s = 0; s < 3 - r; s++)
14060
for (unsigned int t = 0; t < 3 - r - s; t++)
14062
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14063
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
14064
}// end loop over 't'
14065
}// end loop over 's'
14066
}// end loop over 'r'
14068
// Table(s) of coefficients.
14069
static const double coefficients0[10] = \
14070
{0.23094011, 0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, 0.10286890, 0.00000000, -0.05939139, -0.06719368};
14072
// Tables of derivatives of the polynomial base (transpose).
14073
static const double dmats0[10][10] = \
14074
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14075
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14076
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14077
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14078
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14079
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14080
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14081
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14082
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14083
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14085
static const double dmats1[10][10] = \
14086
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14087
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14088
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14089
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14090
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14091
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14092
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14093
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14094
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14095
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14097
static const double dmats2[10][10] = \
14098
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14099
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14100
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14101
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14102
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14103
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14104
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14105
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14106
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14107
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14109
// Compute reference derivatives.
14110
// Declare pointer to array of derivatives on FIAT element.
14111
double *derivatives = new double[num_derivatives];
14112
for (unsigned int r = 0; r < num_derivatives; r++)
14114
derivatives[r] = 0.00000000;
14115
}// end loop over 'r'
14117
// Declare derivative matrix (of polynomial basis).
14118
double dmats[10][10] = \
14119
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14120
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14121
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14122
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14123
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14124
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14125
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14126
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14127
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14128
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14130
// Declare (auxiliary) derivative matrix (of polynomial basis).
14131
double dmats_old[10][10] = \
14132
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14133
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14134
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14135
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14136
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14137
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14138
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14139
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14140
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14141
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14143
// Loop possible derivatives.
14144
for (unsigned int r = 0; r < num_derivatives; r++)
14146
// Resetting dmats values to compute next derivative.
14147
for (unsigned int t = 0; t < 10; t++)
14149
for (unsigned int u = 0; u < 10; u++)
14151
dmats[t][u] = 0.00000000;
14154
dmats[t][u] = 1.00000000;
14157
}// end loop over 'u'
14158
}// end loop over 't'
14160
// Looping derivative order to generate dmats.
14161
for (unsigned int s = 0; s < n; s++)
14163
// Updating dmats_old with new values and resetting dmats.
14164
for (unsigned int t = 0; t < 10; t++)
14166
for (unsigned int u = 0; u < 10; u++)
14168
dmats_old[t][u] = dmats[t][u];
14169
dmats[t][u] = 0.00000000;
14170
}// end loop over 'u'
14171
}// end loop over 't'
14173
// Update dmats using an inner product.
14174
if (combinations[r][s] == 0)
14176
for (unsigned int t = 0; t < 10; t++)
14178
for (unsigned int u = 0; u < 10; u++)
14180
for (unsigned int tu = 0; tu < 10; tu++)
14182
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
14183
}// end loop over 'tu'
14184
}// end loop over 'u'
14185
}// end loop over 't'
14188
if (combinations[r][s] == 1)
14190
for (unsigned int t = 0; t < 10; t++)
14192
for (unsigned int u = 0; u < 10; u++)
14194
for (unsigned int tu = 0; tu < 10; tu++)
14196
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
14197
}// end loop over 'tu'
14198
}// end loop over 'u'
14199
}// end loop over 't'
14202
if (combinations[r][s] == 2)
14204
for (unsigned int t = 0; t < 10; t++)
14206
for (unsigned int u = 0; u < 10; u++)
14208
for (unsigned int tu = 0; tu < 10; tu++)
14210
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
14211
}// end loop over 'tu'
14212
}// end loop over 'u'
14213
}// end loop over 't'
14216
}// end loop over 's'
14217
for (unsigned int s = 0; s < 10; s++)
14219
for (unsigned int t = 0; t < 10; t++)
14221
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
14222
}// end loop over 't'
14223
}// end loop over 's'
14224
}// end loop over 'r'
14226
// Transform derivatives back to physical element
14227
for (unsigned int r = 0; r < num_derivatives; r++)
14229
for (unsigned int s = 0; s < num_derivatives; s++)
14231
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
14232
}// end loop over 's'
14233
}// end loop over 'r'
14235
// Delete pointer to array of derivatives on FIAT element
14236
delete [] derivatives;
14238
// Delete pointer to array of combinations of derivatives and transform
14239
for (unsigned int r = 0; r < num_derivatives; r++)
14241
delete [] combinations[r];
14242
}// end loop over 'r'
14243
delete [] combinations;
14244
for (unsigned int r = 0; r < num_derivatives; r++)
14246
delete [] transform[r];
14247
}// end loop over 'r'
14248
delete [] transform;
14254
// Array of basisvalues.
14255
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
14257
// Declare helper variables.
14258
unsigned int rr = 0;
14259
unsigned int ss = 0;
14260
unsigned int tt = 0;
14261
double tmp5 = 0.00000000;
14262
double tmp6 = 0.00000000;
14263
double tmp7 = 0.00000000;
14264
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
14265
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
14266
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
14267
double tmp3 = 0.50000000*(1.00000000 - Z);
14268
double tmp4 = tmp3*tmp3;
14270
// Compute basisvalues.
14271
basisvalues[0] = 1.00000000;
14272
basisvalues[1] = tmp0;
14273
for (unsigned int r = 1; r < 2; r++)
14275
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
14276
ss = r*(r + 1)*(r + 2)/6;
14277
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
14278
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
14279
}// end loop over 'r'
14280
for (unsigned int r = 0; r < 2; r++)
14282
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
14283
ss = r*(r + 1)*(r + 2)/6;
14284
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
14285
}// end loop over 'r'
14286
for (unsigned int r = 0; r < 1; r++)
14288
for (unsigned int s = 1; s < 2 - r; s++)
14290
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
14291
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14292
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
14293
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14294
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14295
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14296
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
14297
}// end loop over 's'
14298
}// end loop over 'r'
14299
for (unsigned int r = 0; r < 2; r++)
14301
for (unsigned int s = 0; s < 2 - r; s++)
14303
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
14304
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14305
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
14306
}// end loop over 's'
14307
}// end loop over 'r'
14308
for (unsigned int r = 0; r < 1; r++)
14310
for (unsigned int s = 0; s < 1 - r; s++)
14312
for (unsigned int t = 1; t < 2 - r - s; t++)
14314
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
14315
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14316
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
14317
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14318
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14319
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14320
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
14321
}// end loop over 't'
14322
}// end loop over 's'
14323
}// end loop over 'r'
14324
for (unsigned int r = 0; r < 3; r++)
14326
for (unsigned int s = 0; s < 3 - r; s++)
14328
for (unsigned int t = 0; t < 3 - r - s; t++)
14330
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14331
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
14332
}// end loop over 't'
14333
}// end loop over 's'
14334
}// end loop over 'r'
14336
// Table(s) of coefficients.
14337
static const double coefficients0[10] = \
14338
{0.23094011, 0.12171612, 0.07027284, -0.09938080, 0.00000000, 0.10079053, -0.02057378, -0.08728716, -0.01187828, 0.01679842};
14340
// Tables of derivatives of the polynomial base (transpose).
14341
static const double dmats0[10][10] = \
14342
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14343
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14344
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14345
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14346
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14347
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14348
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14349
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14350
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14351
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14353
static const double dmats1[10][10] = \
14354
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14355
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14356
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14357
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14358
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14359
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14360
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14361
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14362
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14363
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14365
static const double dmats2[10][10] = \
14366
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14367
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14368
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14369
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14370
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14371
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14372
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14373
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14374
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14375
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14377
// Compute reference derivatives.
14378
// Declare pointer to array of derivatives on FIAT element.
14379
double *derivatives = new double[num_derivatives];
14380
for (unsigned int r = 0; r < num_derivatives; r++)
14382
derivatives[r] = 0.00000000;
14383
}// end loop over 'r'
14385
// Declare derivative matrix (of polynomial basis).
14386
double dmats[10][10] = \
14387
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14388
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14389
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14390
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14391
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14392
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14393
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14394
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14395
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14396
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14398
// Declare (auxiliary) derivative matrix (of polynomial basis).
14399
double dmats_old[10][10] = \
14400
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14401
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14402
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14403
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14404
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14405
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14406
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14407
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14408
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14409
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14411
// Loop possible derivatives.
14412
for (unsigned int r = 0; r < num_derivatives; r++)
14414
// Resetting dmats values to compute next derivative.
14415
for (unsigned int t = 0; t < 10; t++)
14417
for (unsigned int u = 0; u < 10; u++)
14419
dmats[t][u] = 0.00000000;
14422
dmats[t][u] = 1.00000000;
14425
}// end loop over 'u'
14426
}// end loop over 't'
14428
// Looping derivative order to generate dmats.
14429
for (unsigned int s = 0; s < n; s++)
14431
// Updating dmats_old with new values and resetting dmats.
14432
for (unsigned int t = 0; t < 10; t++)
14434
for (unsigned int u = 0; u < 10; u++)
14436
dmats_old[t][u] = dmats[t][u];
14437
dmats[t][u] = 0.00000000;
14438
}// end loop over 'u'
14439
}// end loop over 't'
14441
// Update dmats using an inner product.
14442
if (combinations[r][s] == 0)
14444
for (unsigned int t = 0; t < 10; t++)
14446
for (unsigned int u = 0; u < 10; u++)
14448
for (unsigned int tu = 0; tu < 10; tu++)
14450
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
14451
}// end loop over 'tu'
14452
}// end loop over 'u'
14453
}// end loop over 't'
14456
if (combinations[r][s] == 1)
14458
for (unsigned int t = 0; t < 10; t++)
14460
for (unsigned int u = 0; u < 10; u++)
14462
for (unsigned int tu = 0; tu < 10; tu++)
14464
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
14465
}// end loop over 'tu'
14466
}// end loop over 'u'
14467
}// end loop over 't'
14470
if (combinations[r][s] == 2)
14472
for (unsigned int t = 0; t < 10; t++)
14474
for (unsigned int u = 0; u < 10; u++)
14476
for (unsigned int tu = 0; tu < 10; tu++)
14478
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
14479
}// end loop over 'tu'
14480
}// end loop over 'u'
14481
}// end loop over 't'
14484
}// end loop over 's'
14485
for (unsigned int s = 0; s < 10; s++)
14487
for (unsigned int t = 0; t < 10; t++)
14489
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
14490
}// end loop over 't'
14491
}// end loop over 's'
14492
}// end loop over 'r'
14494
// Transform derivatives back to physical element
14495
for (unsigned int r = 0; r < num_derivatives; r++)
14497
for (unsigned int s = 0; s < num_derivatives; s++)
14499
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
14500
}// end loop over 's'
14501
}// end loop over 'r'
14503
// Delete pointer to array of derivatives on FIAT element
14504
delete [] derivatives;
14506
// Delete pointer to array of combinations of derivatives and transform
14507
for (unsigned int r = 0; r < num_derivatives; r++)
14509
delete [] combinations[r];
14510
}// end loop over 'r'
14511
delete [] combinations;
14512
for (unsigned int r = 0; r < num_derivatives; r++)
14514
delete [] transform[r];
14515
}// end loop over 'r'
14516
delete [] transform;
14522
// Array of basisvalues.
14523
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
14525
// Declare helper variables.
14526
unsigned int rr = 0;
14527
unsigned int ss = 0;
14528
unsigned int tt = 0;
14529
double tmp5 = 0.00000000;
14530
double tmp6 = 0.00000000;
14531
double tmp7 = 0.00000000;
14532
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
14533
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
14534
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
14535
double tmp3 = 0.50000000*(1.00000000 - Z);
14536
double tmp4 = tmp3*tmp3;
14538
// Compute basisvalues.
14539
basisvalues[0] = 1.00000000;
14540
basisvalues[1] = tmp0;
14541
for (unsigned int r = 1; r < 2; r++)
14543
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
14544
ss = r*(r + 1)*(r + 2)/6;
14545
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
14546
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
14547
}// end loop over 'r'
14548
for (unsigned int r = 0; r < 2; r++)
14550
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
14551
ss = r*(r + 1)*(r + 2)/6;
14552
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
14553
}// end loop over 'r'
14554
for (unsigned int r = 0; r < 1; r++)
14556
for (unsigned int s = 1; s < 2 - r; s++)
14558
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
14559
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14560
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
14561
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14562
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14563
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14564
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
14565
}// end loop over 's'
14566
}// end loop over 'r'
14567
for (unsigned int r = 0; r < 2; r++)
14569
for (unsigned int s = 0; s < 2 - r; s++)
14571
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
14572
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14573
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
14574
}// end loop over 's'
14575
}// end loop over 'r'
14576
for (unsigned int r = 0; r < 1; r++)
14578
for (unsigned int s = 0; s < 1 - r; s++)
14580
for (unsigned int t = 1; t < 2 - r - s; t++)
14582
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
14583
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14584
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
14585
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14586
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14587
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14588
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
14589
}// end loop over 't'
14590
}// end loop over 's'
14591
}// end loop over 'r'
14592
for (unsigned int r = 0; r < 3; r++)
14594
for (unsigned int s = 0; s < 3 - r; s++)
14596
for (unsigned int t = 0; t < 3 - r - s; t++)
14598
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14599
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
14600
}// end loop over 't'
14601
}// end loop over 's'
14602
}// end loop over 'r'
14604
// Table(s) of coefficients.
14605
static const double coefficients0[10] = \
14606
{0.23094011, -0.12171612, -0.07027284, 0.09938080, 0.00000000, 0.00000000, -0.10286890, 0.00000000, -0.05939139, -0.06719368};
14608
// Tables of derivatives of the polynomial base (transpose).
14609
static const double dmats0[10][10] = \
14610
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14611
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14612
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14613
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14614
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14615
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14616
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14617
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14618
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14619
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14621
static const double dmats1[10][10] = \
14622
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14623
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14624
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14625
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14626
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14627
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14628
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14629
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14630
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14631
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14633
static const double dmats2[10][10] = \
14634
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14635
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14636
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14637
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14638
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14639
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14640
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14641
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14642
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14643
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14645
// Compute reference derivatives.
14646
// Declare pointer to array of derivatives on FIAT element.
14647
double *derivatives = new double[num_derivatives];
14648
for (unsigned int r = 0; r < num_derivatives; r++)
14650
derivatives[r] = 0.00000000;
14651
}// end loop over 'r'
14653
// Declare derivative matrix (of polynomial basis).
14654
double dmats[10][10] = \
14655
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14656
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14657
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14658
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14659
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14660
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14661
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14662
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14663
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14664
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14666
// Declare (auxiliary) derivative matrix (of polynomial basis).
14667
double dmats_old[10][10] = \
14668
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14669
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14670
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14671
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14672
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14673
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14674
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14675
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14676
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14677
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14679
// Loop possible derivatives.
14680
for (unsigned int r = 0; r < num_derivatives; r++)
14682
// Resetting dmats values to compute next derivative.
14683
for (unsigned int t = 0; t < 10; t++)
14685
for (unsigned int u = 0; u < 10; u++)
14687
dmats[t][u] = 0.00000000;
14690
dmats[t][u] = 1.00000000;
14693
}// end loop over 'u'
14694
}// end loop over 't'
14696
// Looping derivative order to generate dmats.
14697
for (unsigned int s = 0; s < n; s++)
14699
// Updating dmats_old with new values and resetting dmats.
14700
for (unsigned int t = 0; t < 10; t++)
14702
for (unsigned int u = 0; u < 10; u++)
14704
dmats_old[t][u] = dmats[t][u];
14705
dmats[t][u] = 0.00000000;
14706
}// end loop over 'u'
14707
}// end loop over 't'
14709
// Update dmats using an inner product.
14710
if (combinations[r][s] == 0)
14712
for (unsigned int t = 0; t < 10; t++)
14714
for (unsigned int u = 0; u < 10; u++)
14716
for (unsigned int tu = 0; tu < 10; tu++)
14718
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
14719
}// end loop over 'tu'
14720
}// end loop over 'u'
14721
}// end loop over 't'
14724
if (combinations[r][s] == 1)
14726
for (unsigned int t = 0; t < 10; t++)
14728
for (unsigned int u = 0; u < 10; u++)
14730
for (unsigned int tu = 0; tu < 10; tu++)
14732
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
14733
}// end loop over 'tu'
14734
}// end loop over 'u'
14735
}// end loop over 't'
14738
if (combinations[r][s] == 2)
14740
for (unsigned int t = 0; t < 10; t++)
14742
for (unsigned int u = 0; u < 10; u++)
14744
for (unsigned int tu = 0; tu < 10; tu++)
14746
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
14747
}// end loop over 'tu'
14748
}// end loop over 'u'
14749
}// end loop over 't'
14752
}// end loop over 's'
14753
for (unsigned int s = 0; s < 10; s++)
14755
for (unsigned int t = 0; t < 10; t++)
14757
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
14758
}// end loop over 't'
14759
}// end loop over 's'
14760
}// end loop over 'r'
14762
// Transform derivatives back to physical element
14763
for (unsigned int r = 0; r < num_derivatives; r++)
14765
for (unsigned int s = 0; s < num_derivatives; s++)
14767
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
14768
}// end loop over 's'
14769
}// end loop over 'r'
14771
// Delete pointer to array of derivatives on FIAT element
14772
delete [] derivatives;
14774
// Delete pointer to array of combinations of derivatives and transform
14775
for (unsigned int r = 0; r < num_derivatives; r++)
14777
delete [] combinations[r];
14778
}// end loop over 'r'
14779
delete [] combinations;
14780
for (unsigned int r = 0; r < num_derivatives; r++)
14782
delete [] transform[r];
14783
}// end loop over 'r'
14784
delete [] transform;
14790
// Array of basisvalues.
14791
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
14793
// Declare helper variables.
14794
unsigned int rr = 0;
14795
unsigned int ss = 0;
14796
unsigned int tt = 0;
14797
double tmp5 = 0.00000000;
14798
double tmp6 = 0.00000000;
14799
double tmp7 = 0.00000000;
14800
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
14801
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
14802
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
14803
double tmp3 = 0.50000000*(1.00000000 - Z);
14804
double tmp4 = tmp3*tmp3;
14806
// Compute basisvalues.
14807
basisvalues[0] = 1.00000000;
14808
basisvalues[1] = tmp0;
14809
for (unsigned int r = 1; r < 2; r++)
14811
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
14812
ss = r*(r + 1)*(r + 2)/6;
14813
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
14814
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
14815
}// end loop over 'r'
14816
for (unsigned int r = 0; r < 2; r++)
14818
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
14819
ss = r*(r + 1)*(r + 2)/6;
14820
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
14821
}// end loop over 'r'
14822
for (unsigned int r = 0; r < 1; r++)
14824
for (unsigned int s = 1; s < 2 - r; s++)
14826
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
14827
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14828
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
14829
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14830
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14831
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
14832
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
14833
}// end loop over 's'
14834
}// end loop over 'r'
14835
for (unsigned int r = 0; r < 2; r++)
14837
for (unsigned int s = 0; s < 2 - r; s++)
14839
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
14840
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
14841
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
14842
}// end loop over 's'
14843
}// end loop over 'r'
14844
for (unsigned int r = 0; r < 1; r++)
14846
for (unsigned int s = 0; s < 1 - r; s++)
14848
for (unsigned int t = 1; t < 2 - r - s; t++)
14850
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
14851
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14852
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
14853
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14854
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14855
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
14856
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
14857
}// end loop over 't'
14858
}// end loop over 's'
14859
}// end loop over 'r'
14860
for (unsigned int r = 0; r < 3; r++)
14862
for (unsigned int s = 0; s < 3 - r; s++)
14864
for (unsigned int t = 0; t < 3 - r - s; t++)
14866
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
14867
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
14868
}// end loop over 't'
14869
}// end loop over 's'
14870
}// end loop over 'r'
14872
// Table(s) of coefficients.
14873
static const double coefficients0[10] = \
14874
{0.23094011, -0.12171612, 0.07027284, -0.09938080, 0.00000000, -0.10079053, 0.02057378, -0.08728716, -0.01187828, 0.01679842};
14876
// Tables of derivatives of the polynomial base (transpose).
14877
static const double dmats0[10][10] = \
14878
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14879
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14880
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14881
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14882
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14883
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14884
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14885
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14886
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14887
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14889
static const double dmats1[10][10] = \
14890
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14891
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14892
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14893
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14894
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14895
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14896
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14897
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14898
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14899
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14901
static const double dmats2[10][10] = \
14902
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14903
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14904
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14905
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14906
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14907
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14908
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14909
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14910
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14911
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
14913
// Compute reference derivatives.
14914
// Declare pointer to array of derivatives on FIAT element.
14915
double *derivatives = new double[num_derivatives];
14916
for (unsigned int r = 0; r < num_derivatives; r++)
14918
derivatives[r] = 0.00000000;
14919
}// end loop over 'r'
14921
// Declare derivative matrix (of polynomial basis).
14922
double dmats[10][10] = \
14923
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14924
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14925
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14926
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14927
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14928
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14929
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14930
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14931
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14932
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14934
// Declare (auxiliary) derivative matrix (of polynomial basis).
14935
double dmats_old[10][10] = \
14936
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14937
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14938
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14939
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14940
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14941
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
14942
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
14943
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
14944
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
14945
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
14947
// Loop possible derivatives.
14948
for (unsigned int r = 0; r < num_derivatives; r++)
14950
// Resetting dmats values to compute next derivative.
14951
for (unsigned int t = 0; t < 10; t++)
14953
for (unsigned int u = 0; u < 10; u++)
14955
dmats[t][u] = 0.00000000;
14958
dmats[t][u] = 1.00000000;
14961
}// end loop over 'u'
14962
}// end loop over 't'
14964
// Looping derivative order to generate dmats.
14965
for (unsigned int s = 0; s < n; s++)
14967
// Updating dmats_old with new values and resetting dmats.
14968
for (unsigned int t = 0; t < 10; t++)
14970
for (unsigned int u = 0; u < 10; u++)
14972
dmats_old[t][u] = dmats[t][u];
14973
dmats[t][u] = 0.00000000;
14974
}// end loop over 'u'
14975
}// end loop over 't'
14977
// Update dmats using an inner product.
14978
if (combinations[r][s] == 0)
14980
for (unsigned int t = 0; t < 10; t++)
14982
for (unsigned int u = 0; u < 10; u++)
14984
for (unsigned int tu = 0; tu < 10; tu++)
14986
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
14987
}// end loop over 'tu'
14988
}// end loop over 'u'
14989
}// end loop over 't'
14992
if (combinations[r][s] == 1)
14994
for (unsigned int t = 0; t < 10; t++)
14996
for (unsigned int u = 0; u < 10; u++)
14998
for (unsigned int tu = 0; tu < 10; tu++)
15000
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
15001
}// end loop over 'tu'
15002
}// end loop over 'u'
15003
}// end loop over 't'
15006
if (combinations[r][s] == 2)
15008
for (unsigned int t = 0; t < 10; t++)
15010
for (unsigned int u = 0; u < 10; u++)
15012
for (unsigned int tu = 0; tu < 10; tu++)
15014
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
15015
}// end loop over 'tu'
15016
}// end loop over 'u'
15017
}// end loop over 't'
15020
}// end loop over 's'
15021
for (unsigned int s = 0; s < 10; s++)
15023
for (unsigned int t = 0; t < 10; t++)
15025
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
15026
}// end loop over 't'
15027
}// end loop over 's'
15028
}// end loop over 'r'
15030
// Transform derivatives back to physical element
15031
for (unsigned int r = 0; r < num_derivatives; r++)
15033
for (unsigned int s = 0; s < num_derivatives; s++)
15035
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
15036
}// end loop over 's'
15037
}// end loop over 'r'
15039
// Delete pointer to array of derivatives on FIAT element
15040
delete [] derivatives;
15042
// Delete pointer to array of combinations of derivatives and transform
15043
for (unsigned int r = 0; r < num_derivatives; r++)
15045
delete [] combinations[r];
15046
}// end loop over 'r'
15047
delete [] combinations;
15048
for (unsigned int r = 0; r < num_derivatives; r++)
15050
delete [] transform[r];
15051
}// end loop over 'r'
15052
delete [] transform;
15058
// Array of basisvalues.
15059
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
15061
// Declare helper variables.
15062
unsigned int rr = 0;
15063
unsigned int ss = 0;
15064
unsigned int tt = 0;
15065
double tmp5 = 0.00000000;
15066
double tmp6 = 0.00000000;
15067
double tmp7 = 0.00000000;
15068
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
15069
double tmp1 = 0.25000000*(Y + Z)*(Y + Z);
15070
double tmp2 = 0.50000000*(1.00000000 + Z + 2.00000000*Y);
15071
double tmp3 = 0.50000000*(1.00000000 - Z);
15072
double tmp4 = tmp3*tmp3;
15074
// Compute basisvalues.
15075
basisvalues[0] = 1.00000000;
15076
basisvalues[1] = tmp0;
15077
for (unsigned int r = 1; r < 2; r++)
15079
rr = (r + 1)*((r + 1) + 1)*((r + 1) + 2)/6;
15080
ss = r*(r + 1)*(r + 2)/6;
15081
tt = (r - 1)*((r - 1) + 1)*((r - 1) + 2)/6;
15082
basisvalues[rr] = (basisvalues[ss]*tmp0*(1.00000000 + 2.00000000*r)/(1.00000000 + r) - basisvalues[tt]*tmp1*r/(1.00000000 + r));
15083
}// end loop over 'r'
15084
for (unsigned int r = 0; r < 2; r++)
15086
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
15087
ss = r*(r + 1)*(r + 2)/6;
15088
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
15089
}// end loop over 'r'
15090
for (unsigned int r = 0; r < 1; r++)
15092
for (unsigned int s = 1; s < 2 - r; s++)
15094
rr = (r + (s + 1))*(r + (s + 1) + 1)*(r + (s + 1) + 2)/6 + (s + 1)*((s + 1) + 1)/2;
15095
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
15096
tt = (r + (s - 1))*(r + (s - 1) + 1)*(r + (s - 1) + 2)/6 + (s - 1)*((s - 1) + 1)/2;
15097
tmp5 = (2.00000000 + 2.00000000*r + 2.00000000*s)*(3.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
15098
tmp6 = (1.00000000 + 4.00000000*r*r + 4.00000000*r)*(2.00000000 + 2.00000000*r + 2.00000000*s)/(2.00000000*(1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
15099
tmp7 = (1.00000000 + s + 2.00000000*r)*(3.00000000 + 2.00000000*r + 2.00000000*s)*s/((1.00000000 + 2.00000000*r + 2.00000000*s)*(1.00000000 + s)*(2.00000000 + s + 2.00000000*r));
15100
basisvalues[rr] = (basisvalues[ss]*(tmp2*tmp5 + tmp3*tmp6) - basisvalues[tt]*tmp4*tmp7);
15101
}// end loop over 's'
15102
}// end loop over 'r'
15103
for (unsigned int r = 0; r < 2; r++)
15105
for (unsigned int s = 0; s < 2 - r; s++)
15107
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
15108
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
15109
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
15110
}// end loop over 's'
15111
}// end loop over 'r'
15112
for (unsigned int r = 0; r < 1; r++)
15114
for (unsigned int s = 0; s < 1 - r; s++)
15116
for (unsigned int t = 1; t < 2 - r - s; t++)
15118
rr = (r + s + t + 1)*(r + s + t + 1 + 1)*(r + s + t + 1 + 2)/6 + (s + t + 1)*(s + t + 1 + 1)/2 + t + 1;
15119
ss = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
15120
tt = (r + s + t - 1)*(r + s + t - 1 + 1)*(r + s + t - 1 + 2)/6 + (s + t - 1)*(s + t - 1 + 1)/2 + t - 1;
15121
tmp5 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)/(2.00000000*(1.00000000 + t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
15122
tmp6 = (3.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(4.00000000 + 4.00000000*r*r + 4.00000000*s*s + 8.00000000*r*s + 8.00000000*r + 8.00000000*s)/(2.00000000*(1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
15123
tmp7 = (2.00000000 + t + 2.00000000*r + 2.00000000*s)*(4.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*t/((1.00000000 + t)*(2.00000000 + 2.00000000*r + 2.00000000*s + 2.00000000*t)*(3.00000000 + t + 2.00000000*r + 2.00000000*s));
15124
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Z*tmp5) - basisvalues[tt]*tmp7);
15125
}// end loop over 't'
15126
}// end loop over 's'
15127
}// end loop over 'r'
15128
for (unsigned int r = 0; r < 3; r++)
15130
for (unsigned int s = 0; s < 3 - r; s++)
15132
for (unsigned int t = 0; t < 3 - r - s; t++)
15134
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
15135
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
15136
}// end loop over 't'
15137
}// end loop over 's'
15138
}// end loop over 'r'
15140
// Table(s) of coefficients.
15141
static const double coefficients0[10] = \
15142
{0.23094011, 0.00000000, -0.14054567, -0.09938080, -0.13012001, 0.00000000, 0.00000000, 0.02909572, 0.02375655, 0.01679842};
15144
// Tables of derivatives of the polynomial base (transpose).
15145
static const double dmats0[10][10] = \
15146
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15147
{6.32455532, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15148
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15149
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15150
{0.00000000, 11.22497216, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15151
{4.58257569, 0.00000000, 8.36660027, -1.18321596, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15152
{3.74165739, 0.00000000, 0.00000000, 8.69482605, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15153
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15154
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15155
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
15157
static const double dmats1[10][10] = \
15158
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15159
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15160
{5.47722558, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15161
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15162
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15163
{2.29128785, 7.24568837, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15164
{1.87082869, 0.00000000, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15165
{-2.64575131, 0.00000000, 9.66091783, 0.68313005, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15166
{3.24037035, 0.00000000, 0.00000000, 7.52994024, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15167
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
15169
static const double dmats2[10][10] = \
15170
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15171
{3.16227766, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15172
{1.82574186, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15173
{5.16397779, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15174
{2.95803989, 5.61248608, -1.08012345, -0.76376262, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15175
{2.29128785, 1.44913767, 4.18330013, -0.59160798, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15176
{1.87082869, 7.09929574, 0.00000000, 4.34741302, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15177
{1.32287566, 0.00000000, 3.86436713, -0.34156503, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15178
{1.08012345, 0.00000000, 7.09929574, 2.50998008, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15179
{-3.81881308, 0.00000000, 0.00000000, 8.87411967, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
15181
// Compute reference derivatives.
15182
// Declare pointer to array of derivatives on FIAT element.
15183
double *derivatives = new double[num_derivatives];
15184
for (unsigned int r = 0; r < num_derivatives; r++)
15186
derivatives[r] = 0.00000000;
15187
}// end loop over 'r'
15189
// Declare derivative matrix (of polynomial basis).
15190
double dmats[10][10] = \
15191
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15192
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15193
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15194
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15195
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15196
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15197
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
15198
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
15199
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
15200
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
15202
// Declare (auxiliary) derivative matrix (of polynomial basis).
15203
double dmats_old[10][10] = \
15204
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15205
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15206
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15207
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15208
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15209
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
15210
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
15211
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
15212
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
15213
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
15215
// Loop possible derivatives.
15216
for (unsigned int r = 0; r < num_derivatives; r++)
15218
// Resetting dmats values to compute next derivative.
15219
for (unsigned int t = 0; t < 10; t++)
15221
for (unsigned int u = 0; u < 10; u++)
15223
dmats[t][u] = 0.00000000;
15226
dmats[t][u] = 1.00000000;
15229
}// end loop over 'u'
15230
}// end loop over 't'
15232
// Looping derivative order to generate dmats.
15233
for (unsigned int s = 0; s < n; s++)
15235
// Updating dmats_old with new values and resetting dmats.
15236
for (unsigned int t = 0; t < 10; t++)
15238
for (unsigned int u = 0; u < 10; u++)
15240
dmats_old[t][u] = dmats[t][u];
15241
dmats[t][u] = 0.00000000;
15242
}// end loop over 'u'
15243
}// end loop over 't'
15245
// Update dmats using an inner product.
15246
if (combinations[r][s] == 0)
15248
for (unsigned int t = 0; t < 10; t++)
15250
for (unsigned int u = 0; u < 10; u++)
15252
for (unsigned int tu = 0; tu < 10; tu++)
15254
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
15255
}// end loop over 'tu'
15256
}// end loop over 'u'
15257
}// end loop over 't'
15260
if (combinations[r][s] == 1)
15262
for (unsigned int t = 0; t < 10; t++)
15264
for (unsigned int u = 0; u < 10; u++)
15266
for (unsigned int tu = 0; tu < 10; tu++)
15268
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
15269
}// end loop over 'tu'
15270
}// end loop over 'u'
15271
}// end loop over 't'
15274
if (combinations[r][s] == 2)
15276
for (unsigned int t = 0; t < 10; t++)
15278
for (unsigned int u = 0; u < 10; u++)
15280
for (unsigned int tu = 0; tu < 10; tu++)
15282
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
15283
}// end loop over 'tu'
15284
}// end loop over 'u'
15285
}// end loop over 't'
15288
}// end loop over 's'
15289
for (unsigned int s = 0; s < 10; s++)
15291
for (unsigned int t = 0; t < 10; t++)
15293
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
15294
}// end loop over 't'
15295
}// end loop over 's'
15296
}// end loop over 'r'
15298
// Transform derivatives back to physical element
15299
for (unsigned int r = 0; r < num_derivatives; r++)
15301
for (unsigned int s = 0; s < num_derivatives; s++)
15303
values[2*num_derivatives + r] += transform[r][s]*derivatives[s];
15304
}// end loop over 's'
15305
}// end loop over 'r'
15307
// Delete pointer to array of derivatives on FIAT element
15308
delete [] derivatives;
15310
// Delete pointer to array of combinations of derivatives and transform
15311
for (unsigned int r = 0; r < num_derivatives; r++)
15313
delete [] combinations[r];
15314
}// end loop over 'r'
15315
delete [] combinations;
15316
for (unsigned int r = 0; r < num_derivatives; r++)
15318
delete [] transform[r];
15319
}// end loop over 'r'
15320
delete [] transform;