295
894
values[r] = 0.00000000;
296
895
}// end loop over 'r'
298
// Map degree of freedom to element degree of freedom
299
const unsigned int dof = i;
301
// Array of basisvalues.
302
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
304
// Declare helper variables.
308
double tmp5 = 0.00000000;
309
double tmp6 = 0.00000000;
310
double tmp7 = 0.00000000;
311
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
312
double tmp1 = (1.00000000 - Y)/2.00000000;
313
double tmp2 = tmp1*tmp1;
315
// Compute basisvalues.
316
basisvalues[0] = 1.00000000;
317
basisvalues[1] = tmp0;
318
for (unsigned int r = 1; r < 3; r++)
320
rr = (r + 1)*((r + 1) + 1)/2;
322
tt = (r - 1)*((r - 1) + 1)/2;
323
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
324
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
325
}// end loop over 'r'
326
for (unsigned int r = 0; r < 3; r++)
328
rr = (r + 1)*(r + 1 + 1)/2 + 1;
330
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
331
}// end loop over 'r'
332
for (unsigned int r = 0; r < 2; r++)
334
for (unsigned int s = 1; s < 3 - r; s++)
336
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
337
ss = (r + s)*(r + s + 1)/2 + s;
338
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
339
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));
340
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));
341
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));
342
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
343
}// end loop over 's'
344
}// end loop over 'r'
345
for (unsigned int r = 0; r < 4; r++)
347
for (unsigned int s = 0; s < 4 - r; s++)
349
rr = (r + s)*(r + s + 1)/2 + s;
350
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
351
}// end loop over 's'
352
}// end loop over 'r'
354
// Table(s) of coefficients.
355
static const double coefficients0[10][10] = \
356
{{0.04714045, -0.02886751, -0.01666667, 0.07824608, 0.06060915, 0.03499271, -0.06013378, -0.05082232, -0.03936680, -0.02272843},
357
{0.04714045, 0.02886751, -0.01666667, 0.07824608, -0.06060915, 0.03499271, 0.06013378, -0.05082232, 0.03936680, -0.02272843},
358
{0.04714045, 0.00000000, 0.03333333, 0.00000000, 0.00000000, 0.10497813, 0.00000000, 0.00000000, 0.00000000, 0.09091373},
359
{0.10606602, 0.25980762, -0.15000000, 0.11736912, 0.06060915, -0.07873360, 0.00000000, 0.10164464, -0.13122266, 0.09091373},
360
{0.10606602, 0.00000000, 0.30000000, 0.00000000, 0.15152288, 0.02624453, 0.00000000, 0.00000000, 0.13122266, -0.13637059},
361
{0.10606602, -0.25980762, -0.15000000, 0.11736912, -0.06060915, -0.07873360, 0.00000000, 0.10164464, 0.13122266, 0.09091373},
362
{0.10606602, 0.00000000, 0.30000000, 0.00000000, -0.15152288, 0.02624453, 0.00000000, 0.00000000, -0.13122266, -0.13637059},
363
{0.10606602, -0.25980762, -0.15000000, -0.07824608, 0.09091373, 0.09622995, 0.18040134, 0.05082232, -0.01312227, -0.02272843},
364
{0.10606602, 0.25980762, -0.15000000, -0.07824608, -0.09091373, 0.09622995, -0.18040134, 0.05082232, 0.01312227, -0.02272843},
365
{0.63639610, 0.00000000, 0.00000000, -0.23473824, 0.00000000, -0.26244533, 0.00000000, -0.20328928, 0.00000000, 0.09091373}};
367
// Tables of derivatives of the polynomial base (transpose).
368
static const double dmats0[10][10] = \
369
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
370
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
371
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
372
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
373
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
374
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
375
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
376
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
377
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
378
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
380
static const double dmats1[10][10] = \
381
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
382
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
383
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
384
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
385
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
386
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
387
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
388
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
389
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
390
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
392
// Compute reference derivatives.
393
// Declare pointer to array of derivatives on FIAT element.
394
double *derivatives = new double[num_derivatives];
395
for (unsigned int r = 0; r < num_derivatives; r++)
397
derivatives[r] = 0.00000000;
398
}// end loop over 'r'
400
// Declare derivative matrix (of polynomial basis).
401
double dmats[10][10] = \
402
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
403
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
404
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
405
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
406
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
407
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
408
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
409
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
410
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
411
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
413
// Declare (auxiliary) derivative matrix (of polynomial basis).
414
double dmats_old[10][10] = \
415
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
416
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
417
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
418
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
419
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
420
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
421
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
422
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
423
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
424
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
426
// Loop possible derivatives.
427
for (unsigned int r = 0; r < num_derivatives; r++)
429
// Resetting dmats values to compute next derivative.
430
for (unsigned int t = 0; t < 10; t++)
432
for (unsigned int u = 0; u < 10; u++)
434
dmats[t][u] = 0.00000000;
437
dmats[t][u] = 1.00000000;
440
}// end loop over 'u'
441
}// end loop over 't'
443
// Looping derivative order to generate dmats.
444
for (unsigned int s = 0; s < n; s++)
446
// Updating dmats_old with new values and resetting dmats.
447
for (unsigned int t = 0; t < 10; t++)
449
for (unsigned int u = 0; u < 10; u++)
451
dmats_old[t][u] = dmats[t][u];
452
dmats[t][u] = 0.00000000;
453
}// end loop over 'u'
454
}// end loop over 't'
456
// Update dmats using an inner product.
457
if (combinations[r][s] == 0)
459
for (unsigned int t = 0; t < 10; t++)
461
for (unsigned int u = 0; u < 10; u++)
463
for (unsigned int tu = 0; tu < 10; tu++)
465
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
466
}// end loop over 'tu'
467
}// end loop over 'u'
468
}// end loop over 't'
471
if (combinations[r][s] == 1)
473
for (unsigned int t = 0; t < 10; t++)
475
for (unsigned int u = 0; u < 10; u++)
477
for (unsigned int tu = 0; tu < 10; tu++)
479
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
480
}// end loop over 'tu'
481
}// end loop over 'u'
482
}// end loop over 't'
485
}// end loop over 's'
486
for (unsigned int s = 0; s < 10; s++)
488
for (unsigned int t = 0; t < 10; t++)
490
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
491
}// end loop over 't'
492
}// end loop over 's'
493
}// end loop over 'r'
495
// Transform derivatives back to physical element
496
for (unsigned int r = 0; r < num_derivatives; r++)
498
for (unsigned int s = 0; s < num_derivatives; s++)
500
values[r] += transform[r][s]*derivatives[s];
501
}// end loop over 's'
502
}// end loop over 'r'
504
// Delete pointer to array of derivatives on FIAT element
505
delete [] derivatives;
507
// Delete pointer to array of combinations of derivatives and transform
508
for (unsigned int r = 0; r < num_derivatives; r++)
510
delete [] combinations[r];
511
}// end loop over 'r'
512
delete [] combinations;
513
for (unsigned int r = 0; r < num_derivatives; r++)
515
delete [] transform[r];
516
}// end loop over 'r'
902
// Array of basisvalues.
903
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
905
// Declare helper variables.
909
double tmp5 = 0.00000000;
910
double tmp6 = 0.00000000;
911
double tmp7 = 0.00000000;
912
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
913
double tmp1 = (1.00000000 - Y)/2.00000000;
914
double tmp2 = tmp1*tmp1;
916
// Compute basisvalues.
917
basisvalues[0] = 1.00000000;
918
basisvalues[1] = tmp0;
919
for (unsigned int r = 1; r < 3; r++)
921
rr = (r + 1)*((r + 1) + 1)/2;
923
tt = (r - 1)*((r - 1) + 1)/2;
924
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
925
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
926
}// end loop over 'r'
927
for (unsigned int r = 0; r < 3; r++)
929
rr = (r + 1)*(r + 1 + 1)/2 + 1;
931
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
932
}// end loop over 'r'
933
for (unsigned int r = 0; r < 2; r++)
935
for (unsigned int s = 1; s < 3 - r; s++)
937
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
938
ss = (r + s)*(r + s + 1)/2 + s;
939
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
940
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));
941
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));
942
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));
943
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
944
}// end loop over 's'
945
}// end loop over 'r'
946
for (unsigned int r = 0; r < 4; r++)
948
for (unsigned int s = 0; s < 4 - r; s++)
950
rr = (r + s)*(r + s + 1)/2 + s;
951
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
952
}// end loop over 's'
953
}// end loop over 'r'
955
// Table(s) of coefficients.
956
static const double coefficients0[10] = \
957
{0.04714045, -0.02886751, -0.01666667, 0.07824608, 0.06060915, 0.03499271, -0.06013378, -0.05082232, -0.03936680, -0.02272843};
959
// Tables of derivatives of the polynomial base (transpose).
960
static const double dmats0[10][10] = \
961
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
962
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
963
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
964
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
965
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
966
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
967
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
968
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
969
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
970
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
972
static const double dmats1[10][10] = \
973
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
974
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
975
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
976
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
977
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
978
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
979
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
980
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
981
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
982
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
984
// Compute reference derivatives.
985
// Declare pointer to array of derivatives on FIAT element.
986
double *derivatives = new double[num_derivatives];
987
for (unsigned int r = 0; r < num_derivatives; r++)
989
derivatives[r] = 0.00000000;
990
}// end loop over 'r'
992
// Declare derivative matrix (of polynomial basis).
993
double dmats[10][10] = \
994
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
995
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
996
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
997
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
998
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
999
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1000
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1001
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1002
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1003
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1005
// Declare (auxiliary) derivative matrix (of polynomial basis).
1006
double dmats_old[10][10] = \
1007
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1008
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1009
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1010
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1011
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1012
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1013
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1014
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1015
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1016
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1018
// Loop possible derivatives.
1019
for (unsigned int r = 0; r < num_derivatives; r++)
1021
// Resetting dmats values to compute next derivative.
1022
for (unsigned int t = 0; t < 10; t++)
1024
for (unsigned int u = 0; u < 10; u++)
1026
dmats[t][u] = 0.00000000;
1029
dmats[t][u] = 1.00000000;
1032
}// end loop over 'u'
1033
}// end loop over 't'
1035
// Looping derivative order to generate dmats.
1036
for (unsigned int s = 0; s < n; s++)
1038
// Updating dmats_old with new values and resetting dmats.
1039
for (unsigned int t = 0; t < 10; t++)
1041
for (unsigned int u = 0; u < 10; u++)
1043
dmats_old[t][u] = dmats[t][u];
1044
dmats[t][u] = 0.00000000;
1045
}// end loop over 'u'
1046
}// end loop over 't'
1048
// Update dmats using an inner product.
1049
if (combinations[r][s] == 0)
1051
for (unsigned int t = 0; t < 10; t++)
1053
for (unsigned int u = 0; u < 10; u++)
1055
for (unsigned int tu = 0; tu < 10; tu++)
1057
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1058
}// end loop over 'tu'
1059
}// end loop over 'u'
1060
}// end loop over 't'
1063
if (combinations[r][s] == 1)
1065
for (unsigned int t = 0; t < 10; t++)
1067
for (unsigned int u = 0; u < 10; u++)
1069
for (unsigned int tu = 0; tu < 10; tu++)
1071
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1072
}// end loop over 'tu'
1073
}// end loop over 'u'
1074
}// end loop over 't'
1077
}// end loop over 's'
1078
for (unsigned int s = 0; s < 10; s++)
1080
for (unsigned int t = 0; t < 10; t++)
1082
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1083
}// end loop over 't'
1084
}// end loop over 's'
1085
}// end loop over 'r'
1087
// Transform derivatives back to physical element
1088
for (unsigned int r = 0; r < num_derivatives; r++)
1090
for (unsigned int s = 0; s < num_derivatives; s++)
1092
values[r] += transform[r][s]*derivatives[s];
1093
}// end loop over 's'
1094
}// end loop over 'r'
1096
// Delete pointer to array of derivatives on FIAT element
1097
delete [] derivatives;
1099
// Delete pointer to array of combinations of derivatives and transform
1100
for (unsigned int r = 0; r < num_derivatives; r++)
1102
delete [] combinations[r];
1103
}// end loop over 'r'
1104
delete [] combinations;
1105
for (unsigned int r = 0; r < num_derivatives; r++)
1107
delete [] transform[r];
1108
}// end loop over 'r'
1109
delete [] transform;
1115
// Array of basisvalues.
1116
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1118
// Declare helper variables.
1119
unsigned int rr = 0;
1120
unsigned int ss = 0;
1121
unsigned int tt = 0;
1122
double tmp5 = 0.00000000;
1123
double tmp6 = 0.00000000;
1124
double tmp7 = 0.00000000;
1125
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1126
double tmp1 = (1.00000000 - Y)/2.00000000;
1127
double tmp2 = tmp1*tmp1;
1129
// Compute basisvalues.
1130
basisvalues[0] = 1.00000000;
1131
basisvalues[1] = tmp0;
1132
for (unsigned int r = 1; r < 3; r++)
1134
rr = (r + 1)*((r + 1) + 1)/2;
1136
tt = (r - 1)*((r - 1) + 1)/2;
1137
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
1138
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
1139
}// end loop over 'r'
1140
for (unsigned int r = 0; r < 3; r++)
1142
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1144
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1145
}// end loop over 'r'
1146
for (unsigned int r = 0; r < 2; r++)
1148
for (unsigned int s = 1; s < 3 - r; s++)
1150
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
1151
ss = (r + s)*(r + s + 1)/2 + s;
1152
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
1153
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));
1154
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));
1155
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));
1156
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
1157
}// end loop over 's'
1158
}// end loop over 'r'
1159
for (unsigned int r = 0; r < 4; r++)
1161
for (unsigned int s = 0; s < 4 - r; s++)
1163
rr = (r + s)*(r + s + 1)/2 + s;
1164
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1165
}// end loop over 's'
1166
}// end loop over 'r'
1168
// Table(s) of coefficients.
1169
static const double coefficients0[10] = \
1170
{0.04714045, 0.02886751, -0.01666667, 0.07824608, -0.06060915, 0.03499271, 0.06013378, -0.05082232, 0.03936680, -0.02272843};
1172
// Tables of derivatives of the polynomial base (transpose).
1173
static const double dmats0[10][10] = \
1174
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1175
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1176
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1177
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1178
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1179
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1180
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1181
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1182
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1183
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1185
static const double dmats1[10][10] = \
1186
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1187
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1188
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1189
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1190
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1191
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1192
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1193
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1194
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1195
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1197
// Compute reference derivatives.
1198
// Declare pointer to array of derivatives on FIAT element.
1199
double *derivatives = new double[num_derivatives];
1200
for (unsigned int r = 0; r < num_derivatives; r++)
1202
derivatives[r] = 0.00000000;
1203
}// end loop over 'r'
1205
// Declare derivative matrix (of polynomial basis).
1206
double dmats[10][10] = \
1207
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1208
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1209
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1210
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1211
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1212
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1213
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1214
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1215
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1216
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1218
// Declare (auxiliary) derivative matrix (of polynomial basis).
1219
double dmats_old[10][10] = \
1220
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1221
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1222
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1223
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1224
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1225
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1226
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1227
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1228
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1229
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1231
// Loop possible derivatives.
1232
for (unsigned int r = 0; r < num_derivatives; r++)
1234
// Resetting dmats values to compute next derivative.
1235
for (unsigned int t = 0; t < 10; t++)
1237
for (unsigned int u = 0; u < 10; u++)
1239
dmats[t][u] = 0.00000000;
1242
dmats[t][u] = 1.00000000;
1245
}// end loop over 'u'
1246
}// end loop over 't'
1248
// Looping derivative order to generate dmats.
1249
for (unsigned int s = 0; s < n; s++)
1251
// Updating dmats_old with new values and resetting dmats.
1252
for (unsigned int t = 0; t < 10; t++)
1254
for (unsigned int u = 0; u < 10; u++)
1256
dmats_old[t][u] = dmats[t][u];
1257
dmats[t][u] = 0.00000000;
1258
}// end loop over 'u'
1259
}// end loop over 't'
1261
// Update dmats using an inner product.
1262
if (combinations[r][s] == 0)
1264
for (unsigned int t = 0; t < 10; t++)
1266
for (unsigned int u = 0; u < 10; u++)
1268
for (unsigned int tu = 0; tu < 10; tu++)
1270
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1271
}// end loop over 'tu'
1272
}// end loop over 'u'
1273
}// end loop over 't'
1276
if (combinations[r][s] == 1)
1278
for (unsigned int t = 0; t < 10; t++)
1280
for (unsigned int u = 0; u < 10; u++)
1282
for (unsigned int tu = 0; tu < 10; tu++)
1284
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1285
}// end loop over 'tu'
1286
}// end loop over 'u'
1287
}// end loop over 't'
1290
}// end loop over 's'
1291
for (unsigned int s = 0; s < 10; s++)
1293
for (unsigned int t = 0; t < 10; t++)
1295
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1296
}// end loop over 't'
1297
}// end loop over 's'
1298
}// end loop over 'r'
1300
// Transform derivatives back to physical element
1301
for (unsigned int r = 0; r < num_derivatives; r++)
1303
for (unsigned int s = 0; s < num_derivatives; s++)
1305
values[r] += transform[r][s]*derivatives[s];
1306
}// end loop over 's'
1307
}// end loop over 'r'
1309
// Delete pointer to array of derivatives on FIAT element
1310
delete [] derivatives;
1312
// Delete pointer to array of combinations of derivatives and transform
1313
for (unsigned int r = 0; r < num_derivatives; r++)
1315
delete [] combinations[r];
1316
}// end loop over 'r'
1317
delete [] combinations;
1318
for (unsigned int r = 0; r < num_derivatives; r++)
1320
delete [] transform[r];
1321
}// end loop over 'r'
1322
delete [] transform;
1328
// Array of basisvalues.
1329
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1331
// Declare helper variables.
1332
unsigned int rr = 0;
1333
unsigned int ss = 0;
1334
unsigned int tt = 0;
1335
double tmp5 = 0.00000000;
1336
double tmp6 = 0.00000000;
1337
double tmp7 = 0.00000000;
1338
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1339
double tmp1 = (1.00000000 - Y)/2.00000000;
1340
double tmp2 = tmp1*tmp1;
1342
// Compute basisvalues.
1343
basisvalues[0] = 1.00000000;
1344
basisvalues[1] = tmp0;
1345
for (unsigned int r = 1; r < 3; r++)
1347
rr = (r + 1)*((r + 1) + 1)/2;
1349
tt = (r - 1)*((r - 1) + 1)/2;
1350
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
1351
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
1352
}// end loop over 'r'
1353
for (unsigned int r = 0; r < 3; r++)
1355
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1357
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1358
}// end loop over 'r'
1359
for (unsigned int r = 0; r < 2; r++)
1361
for (unsigned int s = 1; s < 3 - r; s++)
1363
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
1364
ss = (r + s)*(r + s + 1)/2 + s;
1365
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
1366
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));
1367
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));
1368
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));
1369
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
1370
}// end loop over 's'
1371
}// end loop over 'r'
1372
for (unsigned int r = 0; r < 4; r++)
1374
for (unsigned int s = 0; s < 4 - r; s++)
1376
rr = (r + s)*(r + s + 1)/2 + s;
1377
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1378
}// end loop over 's'
1379
}// end loop over 'r'
1381
// Table(s) of coefficients.
1382
static const double coefficients0[10] = \
1383
{0.04714045, 0.00000000, 0.03333333, 0.00000000, 0.00000000, 0.10497813, 0.00000000, 0.00000000, 0.00000000, 0.09091373};
1385
// Tables of derivatives of the polynomial base (transpose).
1386
static const double dmats0[10][10] = \
1387
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1388
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1389
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1390
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1391
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1392
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1393
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1394
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1395
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1396
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1398
static const double dmats1[10][10] = \
1399
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1400
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1401
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1402
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1403
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1404
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1405
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1406
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1407
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1408
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1410
// Compute reference derivatives.
1411
// Declare pointer to array of derivatives on FIAT element.
1412
double *derivatives = new double[num_derivatives];
1413
for (unsigned int r = 0; r < num_derivatives; r++)
1415
derivatives[r] = 0.00000000;
1416
}// end loop over 'r'
1418
// Declare derivative matrix (of polynomial basis).
1419
double dmats[10][10] = \
1420
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1421
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1422
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1423
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1424
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1425
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1426
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1427
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1428
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1429
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1431
// Declare (auxiliary) derivative matrix (of polynomial basis).
1432
double dmats_old[10][10] = \
1433
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1434
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1435
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1436
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1437
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1438
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1439
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1440
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1441
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1442
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1444
// Loop possible derivatives.
1445
for (unsigned int r = 0; r < num_derivatives; r++)
1447
// Resetting dmats values to compute next derivative.
1448
for (unsigned int t = 0; t < 10; t++)
1450
for (unsigned int u = 0; u < 10; u++)
1452
dmats[t][u] = 0.00000000;
1455
dmats[t][u] = 1.00000000;
1458
}// end loop over 'u'
1459
}// end loop over 't'
1461
// Looping derivative order to generate dmats.
1462
for (unsigned int s = 0; s < n; s++)
1464
// Updating dmats_old with new values and resetting dmats.
1465
for (unsigned int t = 0; t < 10; t++)
1467
for (unsigned int u = 0; u < 10; u++)
1469
dmats_old[t][u] = dmats[t][u];
1470
dmats[t][u] = 0.00000000;
1471
}// end loop over 'u'
1472
}// end loop over 't'
1474
// Update dmats using an inner product.
1475
if (combinations[r][s] == 0)
1477
for (unsigned int t = 0; t < 10; t++)
1479
for (unsigned int u = 0; u < 10; u++)
1481
for (unsigned int tu = 0; tu < 10; tu++)
1483
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1484
}// end loop over 'tu'
1485
}// end loop over 'u'
1486
}// end loop over 't'
1489
if (combinations[r][s] == 1)
1491
for (unsigned int t = 0; t < 10; t++)
1493
for (unsigned int u = 0; u < 10; u++)
1495
for (unsigned int tu = 0; tu < 10; tu++)
1497
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1498
}// end loop over 'tu'
1499
}// end loop over 'u'
1500
}// end loop over 't'
1503
}// end loop over 's'
1504
for (unsigned int s = 0; s < 10; s++)
1506
for (unsigned int t = 0; t < 10; t++)
1508
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1509
}// end loop over 't'
1510
}// end loop over 's'
1511
}// end loop over 'r'
1513
// Transform derivatives back to physical element
1514
for (unsigned int r = 0; r < num_derivatives; r++)
1516
for (unsigned int s = 0; s < num_derivatives; s++)
1518
values[r] += transform[r][s]*derivatives[s];
1519
}// end loop over 's'
1520
}// end loop over 'r'
1522
// Delete pointer to array of derivatives on FIAT element
1523
delete [] derivatives;
1525
// Delete pointer to array of combinations of derivatives and transform
1526
for (unsigned int r = 0; r < num_derivatives; r++)
1528
delete [] combinations[r];
1529
}// end loop over 'r'
1530
delete [] combinations;
1531
for (unsigned int r = 0; r < num_derivatives; r++)
1533
delete [] transform[r];
1534
}// end loop over 'r'
1535
delete [] transform;
1541
// Array of basisvalues.
1542
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1544
// Declare helper variables.
1545
unsigned int rr = 0;
1546
unsigned int ss = 0;
1547
unsigned int tt = 0;
1548
double tmp5 = 0.00000000;
1549
double tmp6 = 0.00000000;
1550
double tmp7 = 0.00000000;
1551
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1552
double tmp1 = (1.00000000 - Y)/2.00000000;
1553
double tmp2 = tmp1*tmp1;
1555
// Compute basisvalues.
1556
basisvalues[0] = 1.00000000;
1557
basisvalues[1] = tmp0;
1558
for (unsigned int r = 1; r < 3; r++)
1560
rr = (r + 1)*((r + 1) + 1)/2;
1562
tt = (r - 1)*((r - 1) + 1)/2;
1563
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
1564
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
1565
}// end loop over 'r'
1566
for (unsigned int r = 0; r < 3; r++)
1568
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1570
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1571
}// end loop over 'r'
1572
for (unsigned int r = 0; r < 2; r++)
1574
for (unsigned int s = 1; s < 3 - r; s++)
1576
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
1577
ss = (r + s)*(r + s + 1)/2 + s;
1578
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
1579
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));
1580
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));
1581
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));
1582
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
1583
}// end loop over 's'
1584
}// end loop over 'r'
1585
for (unsigned int r = 0; r < 4; r++)
1587
for (unsigned int s = 0; s < 4 - r; s++)
1589
rr = (r + s)*(r + s + 1)/2 + s;
1590
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1591
}// end loop over 's'
1592
}// end loop over 'r'
1594
// Table(s) of coefficients.
1595
static const double coefficients0[10] = \
1596
{0.10606602, 0.25980762, -0.15000000, 0.11736912, 0.06060915, -0.07873360, 0.00000000, 0.10164464, -0.13122266, 0.09091373};
1598
// Tables of derivatives of the polynomial base (transpose).
1599
static const double dmats0[10][10] = \
1600
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1601
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1602
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1603
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1604
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1605
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1606
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1607
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1608
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1609
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1611
static const double dmats1[10][10] = \
1612
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1613
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1614
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1615
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1616
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1617
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1618
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1619
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1620
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1621
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1623
// Compute reference derivatives.
1624
// Declare pointer to array of derivatives on FIAT element.
1625
double *derivatives = new double[num_derivatives];
1626
for (unsigned int r = 0; r < num_derivatives; r++)
1628
derivatives[r] = 0.00000000;
1629
}// end loop over 'r'
1631
// Declare derivative matrix (of polynomial basis).
1632
double dmats[10][10] = \
1633
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1634
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1635
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1636
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1637
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1638
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1639
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1640
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1641
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1642
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1644
// Declare (auxiliary) derivative matrix (of polynomial basis).
1645
double dmats_old[10][10] = \
1646
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1647
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1648
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1649
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1650
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1651
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1652
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1653
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1654
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1655
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1657
// Loop possible derivatives.
1658
for (unsigned int r = 0; r < num_derivatives; r++)
1660
// Resetting dmats values to compute next derivative.
1661
for (unsigned int t = 0; t < 10; t++)
1663
for (unsigned int u = 0; u < 10; u++)
1665
dmats[t][u] = 0.00000000;
1668
dmats[t][u] = 1.00000000;
1671
}// end loop over 'u'
1672
}// end loop over 't'
1674
// Looping derivative order to generate dmats.
1675
for (unsigned int s = 0; s < n; s++)
1677
// Updating dmats_old with new values and resetting dmats.
1678
for (unsigned int t = 0; t < 10; t++)
1680
for (unsigned int u = 0; u < 10; u++)
1682
dmats_old[t][u] = dmats[t][u];
1683
dmats[t][u] = 0.00000000;
1684
}// end loop over 'u'
1685
}// end loop over 't'
1687
// Update dmats using an inner product.
1688
if (combinations[r][s] == 0)
1690
for (unsigned int t = 0; t < 10; t++)
1692
for (unsigned int u = 0; u < 10; u++)
1694
for (unsigned int tu = 0; tu < 10; tu++)
1696
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1697
}// end loop over 'tu'
1698
}// end loop over 'u'
1699
}// end loop over 't'
1702
if (combinations[r][s] == 1)
1704
for (unsigned int t = 0; t < 10; t++)
1706
for (unsigned int u = 0; u < 10; u++)
1708
for (unsigned int tu = 0; tu < 10; tu++)
1710
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1711
}// end loop over 'tu'
1712
}// end loop over 'u'
1713
}// end loop over 't'
1716
}// end loop over 's'
1717
for (unsigned int s = 0; s < 10; s++)
1719
for (unsigned int t = 0; t < 10; t++)
1721
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1722
}// end loop over 't'
1723
}// end loop over 's'
1724
}// end loop over 'r'
1726
// Transform derivatives back to physical element
1727
for (unsigned int r = 0; r < num_derivatives; r++)
1729
for (unsigned int s = 0; s < num_derivatives; s++)
1731
values[r] += transform[r][s]*derivatives[s];
1732
}// end loop over 's'
1733
}// end loop over 'r'
1735
// Delete pointer to array of derivatives on FIAT element
1736
delete [] derivatives;
1738
// Delete pointer to array of combinations of derivatives and transform
1739
for (unsigned int r = 0; r < num_derivatives; r++)
1741
delete [] combinations[r];
1742
}// end loop over 'r'
1743
delete [] combinations;
1744
for (unsigned int r = 0; r < num_derivatives; r++)
1746
delete [] transform[r];
1747
}// end loop over 'r'
1748
delete [] transform;
1754
// Array of basisvalues.
1755
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1757
// Declare helper variables.
1758
unsigned int rr = 0;
1759
unsigned int ss = 0;
1760
unsigned int tt = 0;
1761
double tmp5 = 0.00000000;
1762
double tmp6 = 0.00000000;
1763
double tmp7 = 0.00000000;
1764
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1765
double tmp1 = (1.00000000 - Y)/2.00000000;
1766
double tmp2 = tmp1*tmp1;
1768
// Compute basisvalues.
1769
basisvalues[0] = 1.00000000;
1770
basisvalues[1] = tmp0;
1771
for (unsigned int r = 1; r < 3; r++)
1773
rr = (r + 1)*((r + 1) + 1)/2;
1775
tt = (r - 1)*((r - 1) + 1)/2;
1776
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
1777
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
1778
}// end loop over 'r'
1779
for (unsigned int r = 0; r < 3; r++)
1781
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1783
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1784
}// end loop over 'r'
1785
for (unsigned int r = 0; r < 2; r++)
1787
for (unsigned int s = 1; s < 3 - r; s++)
1789
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
1790
ss = (r + s)*(r + s + 1)/2 + s;
1791
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
1792
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));
1793
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));
1794
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));
1795
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
1796
}// end loop over 's'
1797
}// end loop over 'r'
1798
for (unsigned int r = 0; r < 4; r++)
1800
for (unsigned int s = 0; s < 4 - r; s++)
1802
rr = (r + s)*(r + s + 1)/2 + s;
1803
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1804
}// end loop over 's'
1805
}// end loop over 'r'
1807
// Table(s) of coefficients.
1808
static const double coefficients0[10] = \
1809
{0.10606602, 0.00000000, 0.30000000, 0.00000000, 0.15152288, 0.02624453, 0.00000000, 0.00000000, 0.13122266, -0.13637059};
1811
// Tables of derivatives of the polynomial base (transpose).
1812
static const double dmats0[10][10] = \
1813
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1814
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1815
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1816
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1817
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1818
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1819
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1820
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1821
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1822
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1824
static const double dmats1[10][10] = \
1825
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1826
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1827
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1828
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1829
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1830
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1831
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1832
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1833
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1834
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1836
// Compute reference derivatives.
1837
// Declare pointer to array of derivatives on FIAT element.
1838
double *derivatives = new double[num_derivatives];
1839
for (unsigned int r = 0; r < num_derivatives; r++)
1841
derivatives[r] = 0.00000000;
1842
}// end loop over 'r'
1844
// Declare derivative matrix (of polynomial basis).
1845
double dmats[10][10] = \
1846
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1847
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1848
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1849
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1850
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1851
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1852
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1853
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1854
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1855
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1857
// Declare (auxiliary) derivative matrix (of polynomial basis).
1858
double dmats_old[10][10] = \
1859
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1860
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1861
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1862
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1863
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1864
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
1865
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
1866
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
1867
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
1868
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1870
// Loop possible derivatives.
1871
for (unsigned int r = 0; r < num_derivatives; r++)
1873
// Resetting dmats values to compute next derivative.
1874
for (unsigned int t = 0; t < 10; t++)
1876
for (unsigned int u = 0; u < 10; u++)
1878
dmats[t][u] = 0.00000000;
1881
dmats[t][u] = 1.00000000;
1884
}// end loop over 'u'
1885
}// end loop over 't'
1887
// Looping derivative order to generate dmats.
1888
for (unsigned int s = 0; s < n; s++)
1890
// Updating dmats_old with new values and resetting dmats.
1891
for (unsigned int t = 0; t < 10; t++)
1893
for (unsigned int u = 0; u < 10; u++)
1895
dmats_old[t][u] = dmats[t][u];
1896
dmats[t][u] = 0.00000000;
1897
}// end loop over 'u'
1898
}// end loop over 't'
1900
// Update dmats using an inner product.
1901
if (combinations[r][s] == 0)
1903
for (unsigned int t = 0; t < 10; t++)
1905
for (unsigned int u = 0; u < 10; u++)
1907
for (unsigned int tu = 0; tu < 10; tu++)
1909
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1910
}// end loop over 'tu'
1911
}// end loop over 'u'
1912
}// end loop over 't'
1915
if (combinations[r][s] == 1)
1917
for (unsigned int t = 0; t < 10; t++)
1919
for (unsigned int u = 0; u < 10; u++)
1921
for (unsigned int tu = 0; tu < 10; tu++)
1923
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1924
}// end loop over 'tu'
1925
}// end loop over 'u'
1926
}// end loop over 't'
1929
}// end loop over 's'
1930
for (unsigned int s = 0; s < 10; s++)
1932
for (unsigned int t = 0; t < 10; t++)
1934
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1935
}// end loop over 't'
1936
}// end loop over 's'
1937
}// end loop over 'r'
1939
// Transform derivatives back to physical element
1940
for (unsigned int r = 0; r < num_derivatives; r++)
1942
for (unsigned int s = 0; s < num_derivatives; s++)
1944
values[r] += transform[r][s]*derivatives[s];
1945
}// end loop over 's'
1946
}// end loop over 'r'
1948
// Delete pointer to array of derivatives on FIAT element
1949
delete [] derivatives;
1951
// Delete pointer to array of combinations of derivatives and transform
1952
for (unsigned int r = 0; r < num_derivatives; r++)
1954
delete [] combinations[r];
1955
}// end loop over 'r'
1956
delete [] combinations;
1957
for (unsigned int r = 0; r < num_derivatives; r++)
1959
delete [] transform[r];
1960
}// end loop over 'r'
1961
delete [] transform;
1967
// Array of basisvalues.
1968
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
1970
// Declare helper variables.
1971
unsigned int rr = 0;
1972
unsigned int ss = 0;
1973
unsigned int tt = 0;
1974
double tmp5 = 0.00000000;
1975
double tmp6 = 0.00000000;
1976
double tmp7 = 0.00000000;
1977
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1978
double tmp1 = (1.00000000 - Y)/2.00000000;
1979
double tmp2 = tmp1*tmp1;
1981
// Compute basisvalues.
1982
basisvalues[0] = 1.00000000;
1983
basisvalues[1] = tmp0;
1984
for (unsigned int r = 1; r < 3; r++)
1986
rr = (r + 1)*((r + 1) + 1)/2;
1988
tt = (r - 1)*((r - 1) + 1)/2;
1989
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
1990
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
1991
}// end loop over 'r'
1992
for (unsigned int r = 0; r < 3; r++)
1994
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1996
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1997
}// end loop over 'r'
1998
for (unsigned int r = 0; r < 2; r++)
2000
for (unsigned int s = 1; s < 3 - r; s++)
2002
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
2003
ss = (r + s)*(r + s + 1)/2 + s;
2004
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
2005
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));
2006
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));
2007
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));
2008
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
2009
}// end loop over 's'
2010
}// end loop over 'r'
2011
for (unsigned int r = 0; r < 4; r++)
2013
for (unsigned int s = 0; s < 4 - r; s++)
2015
rr = (r + s)*(r + s + 1)/2 + s;
2016
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
2017
}// end loop over 's'
2018
}// end loop over 'r'
2020
// Table(s) of coefficients.
2021
static const double coefficients0[10] = \
2022
{0.10606602, -0.25980762, -0.15000000, 0.11736912, -0.06060915, -0.07873360, 0.00000000, 0.10164464, 0.13122266, 0.09091373};
2024
// Tables of derivatives of the polynomial base (transpose).
2025
static const double dmats0[10][10] = \
2026
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2027
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2028
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2029
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2030
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2031
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2032
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2033
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2034
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2035
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2037
static const double dmats1[10][10] = \
2038
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2039
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2040
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2041
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2042
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2043
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2044
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2045
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2046
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2047
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2049
// Compute reference derivatives.
2050
// Declare pointer to array of derivatives on FIAT element.
2051
double *derivatives = new double[num_derivatives];
2052
for (unsigned int r = 0; r < num_derivatives; r++)
2054
derivatives[r] = 0.00000000;
2055
}// end loop over 'r'
2057
// Declare derivative matrix (of polynomial basis).
2058
double dmats[10][10] = \
2059
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2060
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2061
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2062
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2063
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2064
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2065
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2066
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2067
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2068
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2070
// Declare (auxiliary) derivative matrix (of polynomial basis).
2071
double dmats_old[10][10] = \
2072
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2073
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2074
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2075
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2076
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2077
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2078
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2079
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2080
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2081
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2083
// Loop possible derivatives.
2084
for (unsigned int r = 0; r < num_derivatives; r++)
2086
// Resetting dmats values to compute next derivative.
2087
for (unsigned int t = 0; t < 10; t++)
2089
for (unsigned int u = 0; u < 10; u++)
2091
dmats[t][u] = 0.00000000;
2094
dmats[t][u] = 1.00000000;
2097
}// end loop over 'u'
2098
}// end loop over 't'
2100
// Looping derivative order to generate dmats.
2101
for (unsigned int s = 0; s < n; s++)
2103
// Updating dmats_old with new values and resetting dmats.
2104
for (unsigned int t = 0; t < 10; t++)
2106
for (unsigned int u = 0; u < 10; u++)
2108
dmats_old[t][u] = dmats[t][u];
2109
dmats[t][u] = 0.00000000;
2110
}// end loop over 'u'
2111
}// end loop over 't'
2113
// Update dmats using an inner product.
2114
if (combinations[r][s] == 0)
2116
for (unsigned int t = 0; t < 10; t++)
2118
for (unsigned int u = 0; u < 10; u++)
2120
for (unsigned int tu = 0; tu < 10; tu++)
2122
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2123
}// end loop over 'tu'
2124
}// end loop over 'u'
2125
}// end loop over 't'
2128
if (combinations[r][s] == 1)
2130
for (unsigned int t = 0; t < 10; t++)
2132
for (unsigned int u = 0; u < 10; u++)
2134
for (unsigned int tu = 0; tu < 10; tu++)
2136
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2137
}// end loop over 'tu'
2138
}// end loop over 'u'
2139
}// end loop over 't'
2142
}// end loop over 's'
2143
for (unsigned int s = 0; s < 10; s++)
2145
for (unsigned int t = 0; t < 10; t++)
2147
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2148
}// end loop over 't'
2149
}// end loop over 's'
2150
}// end loop over 'r'
2152
// Transform derivatives back to physical element
2153
for (unsigned int r = 0; r < num_derivatives; r++)
2155
for (unsigned int s = 0; s < num_derivatives; s++)
2157
values[r] += transform[r][s]*derivatives[s];
2158
}// end loop over 's'
2159
}// end loop over 'r'
2161
// Delete pointer to array of derivatives on FIAT element
2162
delete [] derivatives;
2164
// Delete pointer to array of combinations of derivatives and transform
2165
for (unsigned int r = 0; r < num_derivatives; r++)
2167
delete [] combinations[r];
2168
}// end loop over 'r'
2169
delete [] combinations;
2170
for (unsigned int r = 0; r < num_derivatives; r++)
2172
delete [] transform[r];
2173
}// end loop over 'r'
2174
delete [] transform;
2180
// Array of basisvalues.
2181
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2183
// Declare helper variables.
2184
unsigned int rr = 0;
2185
unsigned int ss = 0;
2186
unsigned int tt = 0;
2187
double tmp5 = 0.00000000;
2188
double tmp6 = 0.00000000;
2189
double tmp7 = 0.00000000;
2190
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
2191
double tmp1 = (1.00000000 - Y)/2.00000000;
2192
double tmp2 = tmp1*tmp1;
2194
// Compute basisvalues.
2195
basisvalues[0] = 1.00000000;
2196
basisvalues[1] = tmp0;
2197
for (unsigned int r = 1; r < 3; r++)
2199
rr = (r + 1)*((r + 1) + 1)/2;
2201
tt = (r - 1)*((r - 1) + 1)/2;
2202
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
2203
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
2204
}// end loop over 'r'
2205
for (unsigned int r = 0; r < 3; r++)
2207
rr = (r + 1)*(r + 1 + 1)/2 + 1;
2209
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
2210
}// end loop over 'r'
2211
for (unsigned int r = 0; r < 2; r++)
2213
for (unsigned int s = 1; s < 3 - r; s++)
2215
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
2216
ss = (r + s)*(r + s + 1)/2 + s;
2217
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
2218
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));
2219
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));
2220
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));
2221
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
2222
}// end loop over 's'
2223
}// end loop over 'r'
2224
for (unsigned int r = 0; r < 4; r++)
2226
for (unsigned int s = 0; s < 4 - r; s++)
2228
rr = (r + s)*(r + s + 1)/2 + s;
2229
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
2230
}// end loop over 's'
2231
}// end loop over 'r'
2233
// Table(s) of coefficients.
2234
static const double coefficients0[10] = \
2235
{0.10606602, 0.00000000, 0.30000000, 0.00000000, -0.15152288, 0.02624453, 0.00000000, 0.00000000, -0.13122266, -0.13637059};
2237
// Tables of derivatives of the polynomial base (transpose).
2238
static const double dmats0[10][10] = \
2239
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2240
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2241
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2242
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2243
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2244
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2245
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2246
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2247
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2248
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2250
static const double dmats1[10][10] = \
2251
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2252
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2253
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2254
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2255
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2256
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2257
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2258
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2259
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2260
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2262
// Compute reference derivatives.
2263
// Declare pointer to array of derivatives on FIAT element.
2264
double *derivatives = new double[num_derivatives];
2265
for (unsigned int r = 0; r < num_derivatives; r++)
2267
derivatives[r] = 0.00000000;
2268
}// end loop over 'r'
2270
// Declare derivative matrix (of polynomial basis).
2271
double dmats[10][10] = \
2272
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2273
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2274
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2275
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2276
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2277
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2278
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2279
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2280
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2281
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2283
// Declare (auxiliary) derivative matrix (of polynomial basis).
2284
double dmats_old[10][10] = \
2285
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2286
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2287
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2288
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2289
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2290
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2291
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2292
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2293
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2294
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2296
// Loop possible derivatives.
2297
for (unsigned int r = 0; r < num_derivatives; r++)
2299
// Resetting dmats values to compute next derivative.
2300
for (unsigned int t = 0; t < 10; t++)
2302
for (unsigned int u = 0; u < 10; u++)
2304
dmats[t][u] = 0.00000000;
2307
dmats[t][u] = 1.00000000;
2310
}// end loop over 'u'
2311
}// end loop over 't'
2313
// Looping derivative order to generate dmats.
2314
for (unsigned int s = 0; s < n; s++)
2316
// Updating dmats_old with new values and resetting dmats.
2317
for (unsigned int t = 0; t < 10; t++)
2319
for (unsigned int u = 0; u < 10; u++)
2321
dmats_old[t][u] = dmats[t][u];
2322
dmats[t][u] = 0.00000000;
2323
}// end loop over 'u'
2324
}// end loop over 't'
2326
// Update dmats using an inner product.
2327
if (combinations[r][s] == 0)
2329
for (unsigned int t = 0; t < 10; t++)
2331
for (unsigned int u = 0; u < 10; u++)
2333
for (unsigned int tu = 0; tu < 10; tu++)
2335
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2336
}// end loop over 'tu'
2337
}// end loop over 'u'
2338
}// end loop over 't'
2341
if (combinations[r][s] == 1)
2343
for (unsigned int t = 0; t < 10; t++)
2345
for (unsigned int u = 0; u < 10; u++)
2347
for (unsigned int tu = 0; tu < 10; tu++)
2349
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2350
}// end loop over 'tu'
2351
}// end loop over 'u'
2352
}// end loop over 't'
2355
}// end loop over 's'
2356
for (unsigned int s = 0; s < 10; s++)
2358
for (unsigned int t = 0; t < 10; t++)
2360
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2361
}// end loop over 't'
2362
}// end loop over 's'
2363
}// end loop over 'r'
2365
// Transform derivatives back to physical element
2366
for (unsigned int r = 0; r < num_derivatives; r++)
2368
for (unsigned int s = 0; s < num_derivatives; s++)
2370
values[r] += transform[r][s]*derivatives[s];
2371
}// end loop over 's'
2372
}// end loop over 'r'
2374
// Delete pointer to array of derivatives on FIAT element
2375
delete [] derivatives;
2377
// Delete pointer to array of combinations of derivatives and transform
2378
for (unsigned int r = 0; r < num_derivatives; r++)
2380
delete [] combinations[r];
2381
}// end loop over 'r'
2382
delete [] combinations;
2383
for (unsigned int r = 0; r < num_derivatives; r++)
2385
delete [] transform[r];
2386
}// end loop over 'r'
2387
delete [] transform;
2393
// Array of basisvalues.
2394
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2396
// Declare helper variables.
2397
unsigned int rr = 0;
2398
unsigned int ss = 0;
2399
unsigned int tt = 0;
2400
double tmp5 = 0.00000000;
2401
double tmp6 = 0.00000000;
2402
double tmp7 = 0.00000000;
2403
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
2404
double tmp1 = (1.00000000 - Y)/2.00000000;
2405
double tmp2 = tmp1*tmp1;
2407
// Compute basisvalues.
2408
basisvalues[0] = 1.00000000;
2409
basisvalues[1] = tmp0;
2410
for (unsigned int r = 1; r < 3; r++)
2412
rr = (r + 1)*((r + 1) + 1)/2;
2414
tt = (r - 1)*((r - 1) + 1)/2;
2415
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
2416
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
2417
}// end loop over 'r'
2418
for (unsigned int r = 0; r < 3; r++)
2420
rr = (r + 1)*(r + 1 + 1)/2 + 1;
2422
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
2423
}// end loop over 'r'
2424
for (unsigned int r = 0; r < 2; r++)
2426
for (unsigned int s = 1; s < 3 - r; s++)
2428
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
2429
ss = (r + s)*(r + s + 1)/2 + s;
2430
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
2431
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));
2432
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));
2433
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));
2434
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
2435
}// end loop over 's'
2436
}// end loop over 'r'
2437
for (unsigned int r = 0; r < 4; r++)
2439
for (unsigned int s = 0; s < 4 - r; s++)
2441
rr = (r + s)*(r + s + 1)/2 + s;
2442
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
2443
}// end loop over 's'
2444
}// end loop over 'r'
2446
// Table(s) of coefficients.
2447
static const double coefficients0[10] = \
2448
{0.10606602, -0.25980762, -0.15000000, -0.07824608, 0.09091373, 0.09622995, 0.18040134, 0.05082232, -0.01312227, -0.02272843};
2450
// Tables of derivatives of the polynomial base (transpose).
2451
static const double dmats0[10][10] = \
2452
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2453
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2454
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2455
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2456
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2457
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2458
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2459
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2460
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2461
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2463
static const double dmats1[10][10] = \
2464
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2465
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2466
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2467
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2468
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2469
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2470
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2471
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2472
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2473
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2475
// Compute reference derivatives.
2476
// Declare pointer to array of derivatives on FIAT element.
2477
double *derivatives = new double[num_derivatives];
2478
for (unsigned int r = 0; r < num_derivatives; r++)
2480
derivatives[r] = 0.00000000;
2481
}// end loop over 'r'
2483
// Declare derivative matrix (of polynomial basis).
2484
double dmats[10][10] = \
2485
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2486
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2487
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2488
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2489
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2490
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2491
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2492
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2493
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2494
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2496
// Declare (auxiliary) derivative matrix (of polynomial basis).
2497
double dmats_old[10][10] = \
2498
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2499
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2500
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2501
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2502
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2503
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2504
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2505
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2506
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2507
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2509
// Loop possible derivatives.
2510
for (unsigned int r = 0; r < num_derivatives; r++)
2512
// Resetting dmats values to compute next derivative.
2513
for (unsigned int t = 0; t < 10; t++)
2515
for (unsigned int u = 0; u < 10; u++)
2517
dmats[t][u] = 0.00000000;
2520
dmats[t][u] = 1.00000000;
2523
}// end loop over 'u'
2524
}// end loop over 't'
2526
// Looping derivative order to generate dmats.
2527
for (unsigned int s = 0; s < n; s++)
2529
// Updating dmats_old with new values and resetting dmats.
2530
for (unsigned int t = 0; t < 10; t++)
2532
for (unsigned int u = 0; u < 10; u++)
2534
dmats_old[t][u] = dmats[t][u];
2535
dmats[t][u] = 0.00000000;
2536
}// end loop over 'u'
2537
}// end loop over 't'
2539
// Update dmats using an inner product.
2540
if (combinations[r][s] == 0)
2542
for (unsigned int t = 0; t < 10; t++)
2544
for (unsigned int u = 0; u < 10; u++)
2546
for (unsigned int tu = 0; tu < 10; tu++)
2548
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2549
}// end loop over 'tu'
2550
}// end loop over 'u'
2551
}// end loop over 't'
2554
if (combinations[r][s] == 1)
2556
for (unsigned int t = 0; t < 10; t++)
2558
for (unsigned int u = 0; u < 10; u++)
2560
for (unsigned int tu = 0; tu < 10; tu++)
2562
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2563
}// end loop over 'tu'
2564
}// end loop over 'u'
2565
}// end loop over 't'
2568
}// end loop over 's'
2569
for (unsigned int s = 0; s < 10; s++)
2571
for (unsigned int t = 0; t < 10; t++)
2573
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2574
}// end loop over 't'
2575
}// end loop over 's'
2576
}// end loop over 'r'
2578
// Transform derivatives back to physical element
2579
for (unsigned int r = 0; r < num_derivatives; r++)
2581
for (unsigned int s = 0; s < num_derivatives; s++)
2583
values[r] += transform[r][s]*derivatives[s];
2584
}// end loop over 's'
2585
}// end loop over 'r'
2587
// Delete pointer to array of derivatives on FIAT element
2588
delete [] derivatives;
2590
// Delete pointer to array of combinations of derivatives and transform
2591
for (unsigned int r = 0; r < num_derivatives; r++)
2593
delete [] combinations[r];
2594
}// end loop over 'r'
2595
delete [] combinations;
2596
for (unsigned int r = 0; r < num_derivatives; r++)
2598
delete [] transform[r];
2599
}// end loop over 'r'
2600
delete [] transform;
2606
// Array of basisvalues.
2607
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2609
// Declare helper variables.
2610
unsigned int rr = 0;
2611
unsigned int ss = 0;
2612
unsigned int tt = 0;
2613
double tmp5 = 0.00000000;
2614
double tmp6 = 0.00000000;
2615
double tmp7 = 0.00000000;
2616
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
2617
double tmp1 = (1.00000000 - Y)/2.00000000;
2618
double tmp2 = tmp1*tmp1;
2620
// Compute basisvalues.
2621
basisvalues[0] = 1.00000000;
2622
basisvalues[1] = tmp0;
2623
for (unsigned int r = 1; r < 3; r++)
2625
rr = (r + 1)*((r + 1) + 1)/2;
2627
tt = (r - 1)*((r - 1) + 1)/2;
2628
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
2629
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
2630
}// end loop over 'r'
2631
for (unsigned int r = 0; r < 3; r++)
2633
rr = (r + 1)*(r + 1 + 1)/2 + 1;
2635
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
2636
}// end loop over 'r'
2637
for (unsigned int r = 0; r < 2; r++)
2639
for (unsigned int s = 1; s < 3 - r; s++)
2641
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
2642
ss = (r + s)*(r + s + 1)/2 + s;
2643
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
2644
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));
2645
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));
2646
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));
2647
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
2648
}// end loop over 's'
2649
}// end loop over 'r'
2650
for (unsigned int r = 0; r < 4; r++)
2652
for (unsigned int s = 0; s < 4 - r; s++)
2654
rr = (r + s)*(r + s + 1)/2 + s;
2655
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
2656
}// end loop over 's'
2657
}// end loop over 'r'
2659
// Table(s) of coefficients.
2660
static const double coefficients0[10] = \
2661
{0.10606602, 0.25980762, -0.15000000, -0.07824608, -0.09091373, 0.09622995, -0.18040134, 0.05082232, 0.01312227, -0.02272843};
2663
// Tables of derivatives of the polynomial base (transpose).
2664
static const double dmats0[10][10] = \
2665
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2666
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2667
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2668
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2669
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 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
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2672
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2673
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2674
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2676
static const double dmats1[10][10] = \
2677
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2678
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2679
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2680
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2681
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2682
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2683
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2684
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2685
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2686
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2688
// Compute reference derivatives.
2689
// Declare pointer to array of derivatives on FIAT element.
2690
double *derivatives = new double[num_derivatives];
2691
for (unsigned int r = 0; r < num_derivatives; r++)
2693
derivatives[r] = 0.00000000;
2694
}// end loop over 'r'
2696
// Declare derivative matrix (of polynomial basis).
2697
double dmats[10][10] = \
2698
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2699
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2700
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2701
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2702
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2703
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2704
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2705
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2706
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2707
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2709
// Declare (auxiliary) derivative matrix (of polynomial basis).
2710
double dmats_old[10][10] = \
2711
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2712
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2713
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2714
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2715
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2716
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2717
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2718
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2719
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2720
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2722
// Loop possible derivatives.
2723
for (unsigned int r = 0; r < num_derivatives; r++)
2725
// Resetting dmats values to compute next derivative.
2726
for (unsigned int t = 0; t < 10; t++)
2728
for (unsigned int u = 0; u < 10; u++)
2730
dmats[t][u] = 0.00000000;
2733
dmats[t][u] = 1.00000000;
2736
}// end loop over 'u'
2737
}// end loop over 't'
2739
// Looping derivative order to generate dmats.
2740
for (unsigned int s = 0; s < n; s++)
2742
// Updating dmats_old with new values and resetting dmats.
2743
for (unsigned int t = 0; t < 10; t++)
2745
for (unsigned int u = 0; u < 10; u++)
2747
dmats_old[t][u] = dmats[t][u];
2748
dmats[t][u] = 0.00000000;
2749
}// end loop over 'u'
2750
}// end loop over 't'
2752
// Update dmats using an inner product.
2753
if (combinations[r][s] == 0)
2755
for (unsigned int t = 0; t < 10; t++)
2757
for (unsigned int u = 0; u < 10; u++)
2759
for (unsigned int tu = 0; tu < 10; tu++)
2761
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2762
}// end loop over 'tu'
2763
}// end loop over 'u'
2764
}// end loop over 't'
2767
if (combinations[r][s] == 1)
2769
for (unsigned int t = 0; t < 10; t++)
2771
for (unsigned int u = 0; u < 10; u++)
2773
for (unsigned int tu = 0; tu < 10; tu++)
2775
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2776
}// end loop over 'tu'
2777
}// end loop over 'u'
2778
}// end loop over 't'
2781
}// end loop over 's'
2782
for (unsigned int s = 0; s < 10; s++)
2784
for (unsigned int t = 0; t < 10; t++)
2786
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
2787
}// end loop over 't'
2788
}// end loop over 's'
2789
}// end loop over 'r'
2791
// Transform derivatives back to physical element
2792
for (unsigned int r = 0; r < num_derivatives; r++)
2794
for (unsigned int s = 0; s < num_derivatives; s++)
2796
values[r] += transform[r][s]*derivatives[s];
2797
}// end loop over 's'
2798
}// end loop over 'r'
2800
// Delete pointer to array of derivatives on FIAT element
2801
delete [] derivatives;
2803
// Delete pointer to array of combinations of derivatives and transform
2804
for (unsigned int r = 0; r < num_derivatives; r++)
2806
delete [] combinations[r];
2807
}// end loop over 'r'
2808
delete [] combinations;
2809
for (unsigned int r = 0; r < num_derivatives; r++)
2811
delete [] transform[r];
2812
}// end loop over 'r'
2813
delete [] transform;
2819
// Array of basisvalues.
2820
double basisvalues[10] = {0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000};
2822
// Declare helper variables.
2823
unsigned int rr = 0;
2824
unsigned int ss = 0;
2825
unsigned int tt = 0;
2826
double tmp5 = 0.00000000;
2827
double tmp6 = 0.00000000;
2828
double tmp7 = 0.00000000;
2829
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
2830
double tmp1 = (1.00000000 - Y)/2.00000000;
2831
double tmp2 = tmp1*tmp1;
2833
// Compute basisvalues.
2834
basisvalues[0] = 1.00000000;
2835
basisvalues[1] = tmp0;
2836
for (unsigned int r = 1; r < 3; r++)
2838
rr = (r + 1)*((r + 1) + 1)/2;
2840
tt = (r - 1)*((r - 1) + 1)/2;
2841
tmp5 = (1.00000000 + 2.00000000*r)/(1.00000000 + r);
2842
basisvalues[rr] = (basisvalues[ss]*tmp0*tmp5 - basisvalues[tt]*tmp2*r/(1.00000000 + r));
2843
}// end loop over 'r'
2844
for (unsigned int r = 0; r < 3; r++)
2846
rr = (r + 1)*(r + 1 + 1)/2 + 1;
2848
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
2849
}// end loop over 'r'
2850
for (unsigned int r = 0; r < 2; r++)
2852
for (unsigned int s = 1; s < 3 - r; s++)
2854
rr = (r + s + 1)*(r + s + 1 + 1)/2 + s + 1;
2855
ss = (r + s)*(r + s + 1)/2 + s;
2856
tt = (r + s - 1)*(r + s - 1 + 1)/2 + s - 1;
2857
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));
2858
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));
2859
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));
2860
basisvalues[rr] = (basisvalues[ss]*(tmp6 + Y*tmp5) - basisvalues[tt]*tmp7);
2861
}// end loop over 's'
2862
}// end loop over 'r'
2863
for (unsigned int r = 0; r < 4; r++)
2865
for (unsigned int s = 0; s < 4 - r; s++)
2867
rr = (r + s)*(r + s + 1)/2 + s;
2868
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
2869
}// end loop over 's'
2870
}// end loop over 'r'
2872
// Table(s) of coefficients.
2873
static const double coefficients0[10] = \
2874
{0.63639610, 0.00000000, 0.00000000, -0.23473824, 0.00000000, -0.26244533, 0.00000000, -0.20328928, 0.00000000, 0.09091373};
2876
// Tables of derivatives of the polynomial base (transpose).
2877
static const double dmats0[10][10] = \
2878
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2879
{4.89897949, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2880
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2881
{0.00000000, 9.48683298, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2882
{4.00000000, 0.00000000, 7.07106781, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2883
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2884
{5.29150262, 0.00000000, -2.99332591, 13.66260102, 0.00000000, 0.61101009, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2885
{0.00000000, 4.38178046, 0.00000000, 0.00000000, 12.52198067, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2886
{3.46410162, 0.00000000, 7.83836718, 0.00000000, 0.00000000, 8.40000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2887
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2889
static const double dmats1[10][10] = \
2890
{{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2891
{2.44948974, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2892
{4.24264069, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2893
{2.58198890, 4.74341649, -0.91287093, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2894
{2.00000000, 6.12372436, 3.53553391, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2895
{-2.30940108, 0.00000000, 8.16496581, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2896
{2.64575131, 5.18459256, -1.49666295, 6.83130051, -1.05830052, 0.30550505, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2897
{2.23606798, 2.19089023, 2.52982213, 8.08290377, 6.26099034, -1.80739223, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2898
{1.73205081, -5.09116882, 3.91918359, 0.00000000, 9.69948452, 4.20000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2899
{5.00000000, 0.00000000, -2.82842712, 0.00000000, 0.00000000, 12.12435565, 0.00000000, 0.00000000, 0.00000000, 0.00000000}};
2901
// Compute reference derivatives.
2902
// Declare pointer to array of derivatives on FIAT element.
2903
double *derivatives = new double[num_derivatives];
2904
for (unsigned int r = 0; r < num_derivatives; r++)
2906
derivatives[r] = 0.00000000;
2907
}// end loop over 'r'
2909
// Declare derivative matrix (of polynomial basis).
2910
double dmats[10][10] = \
2911
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2912
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2913
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2914
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2915
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2916
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2917
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2918
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2919
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2920
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2922
// Declare (auxiliary) derivative matrix (of polynomial basis).
2923
double dmats_old[10][10] = \
2924
{{1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2925
{0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2926
{0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2927
{0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2928
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2929
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000},
2930
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000, 0.00000000},
2931
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000, 0.00000000},
2932
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000, 0.00000000},
2933
{0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 1.00000000}};
2935
// Loop possible derivatives.
2936
for (unsigned int r = 0; r < num_derivatives; r++)
2938
// Resetting dmats values to compute next derivative.
2939
for (unsigned int t = 0; t < 10; t++)
2941
for (unsigned int u = 0; u < 10; u++)
2943
dmats[t][u] = 0.00000000;
2946
dmats[t][u] = 1.00000000;
2949
}// end loop over 'u'
2950
}// end loop over 't'
2952
// Looping derivative order to generate dmats.
2953
for (unsigned int s = 0; s < n; s++)
2955
// Updating dmats_old with new values and resetting dmats.
2956
for (unsigned int t = 0; t < 10; t++)
2958
for (unsigned int u = 0; u < 10; u++)
2960
dmats_old[t][u] = dmats[t][u];
2961
dmats[t][u] = 0.00000000;
2962
}// end loop over 'u'
2963
}// end loop over 't'
2965
// Update dmats using an inner product.
2966
if (combinations[r][s] == 0)
2968
for (unsigned int t = 0; t < 10; t++)
2970
for (unsigned int u = 0; u < 10; u++)
2972
for (unsigned int tu = 0; tu < 10; tu++)
2974
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
2975
}// end loop over 'tu'
2976
}// end loop over 'u'
2977
}// end loop over 't'
2980
if (combinations[r][s] == 1)
2982
for (unsigned int t = 0; t < 10; t++)
2984
for (unsigned int u = 0; u < 10; u++)
2986
for (unsigned int tu = 0; tu < 10; tu++)
2988
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
2989
}// end loop over 'tu'
2990
}// end loop over 'u'
2991
}// end loop over 't'
2994
}// end loop over 's'
2995
for (unsigned int s = 0; s < 10; s++)
2997
for (unsigned int t = 0; t < 10; t++)
2999
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
3000
}// end loop over 't'
3001
}// end loop over 's'
3002
}// end loop over 'r'
3004
// Transform derivatives back to physical element
3005
for (unsigned int r = 0; r < num_derivatives; r++)
3007
for (unsigned int s = 0; s < num_derivatives; s++)
3009
values[r] += transform[r][s]*derivatives[s];
3010
}// end loop over 's'
3011
}// end loop over 'r'
3013
// Delete pointer to array of derivatives on FIAT element
3014
delete [] derivatives;
3016
// Delete pointer to array of combinations of derivatives and transform
3017
for (unsigned int r = 0; r < num_derivatives; r++)
3019
delete [] combinations[r];
3020
}// end loop over 'r'
3021
delete [] combinations;
3022
for (unsigned int r = 0; r < num_derivatives; r++)
3024
delete [] transform[r];
3025
}// end loop over 'r'
3026
delete [] transform;
520
3033
/// Evaluate order n derivatives of all basis functions at given point in cell