1151
1146
// Reset values.
1152
1147
*values = 0.00000000;
1154
// Map degree of freedom to element degree of freedom
1155
const unsigned int dof = i;
1157
// Array of basisvalues.
1158
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1160
// Declare helper variables.
1161
unsigned int rr = 0;
1162
unsigned int ss = 0;
1163
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1165
// Compute basisvalues.
1166
basisvalues[0] = 1.00000000;
1167
basisvalues[1] = tmp0;
1168
for (unsigned int r = 0; r < 1; r++)
1170
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1172
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1173
}// end loop over 'r'
1174
for (unsigned int r = 0; r < 2; r++)
1176
for (unsigned int s = 0; s < 2 - r; s++)
1178
rr = (r + s)*(r + s + 1)/2 + s;
1179
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1180
}// end loop over 's'
1181
}// end loop over 'r'
1183
// Table(s) of coefficients.
1184
static const double coefficients0[3][3] = \
1185
{{0.47140452, -0.28867513, -0.16666667},
1186
{0.47140452, 0.28867513, -0.16666667},
1187
{0.47140452, 0.00000000, 0.33333333}};
1189
// Compute value(s).
1190
for (unsigned int r = 0; r < 3; r++)
1192
*values += coefficients0[dof][r]*basisvalues[r];
1193
}// end loop over 'r'
1153
// Array of basisvalues.
1154
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1156
// Declare helper variables.
1157
unsigned int rr = 0;
1158
unsigned int ss = 0;
1159
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1161
// Compute basisvalues.
1162
basisvalues[0] = 1.00000000;
1163
basisvalues[1] = tmp0;
1164
for (unsigned int r = 0; r < 1; r++)
1166
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1168
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1169
}// end loop over 'r'
1170
for (unsigned int r = 0; r < 2; r++)
1172
for (unsigned int s = 0; s < 2 - r; s++)
1174
rr = (r + s)*(r + s + 1)/2 + s;
1175
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1176
}// end loop over 's'
1177
}// end loop over 'r'
1179
// Table(s) of coefficients.
1180
static const double coefficients0[3] = \
1181
{0.47140452, -0.28867513, -0.16666667};
1183
// Compute value(s).
1184
for (unsigned int r = 0; r < 3; r++)
1186
*values += coefficients0[r]*basisvalues[r];
1187
}// end loop over 'r'
1193
// Array of basisvalues.
1194
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1196
// Declare helper variables.
1197
unsigned int rr = 0;
1198
unsigned int ss = 0;
1199
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1201
// Compute basisvalues.
1202
basisvalues[0] = 1.00000000;
1203
basisvalues[1] = tmp0;
1204
for (unsigned int r = 0; r < 1; r++)
1206
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1208
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1209
}// end loop over 'r'
1210
for (unsigned int r = 0; r < 2; r++)
1212
for (unsigned int s = 0; s < 2 - r; s++)
1214
rr = (r + s)*(r + s + 1)/2 + s;
1215
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1216
}// end loop over 's'
1217
}// end loop over 'r'
1219
// Table(s) of coefficients.
1220
static const double coefficients0[3] = \
1221
{0.47140452, 0.28867513, -0.16666667};
1223
// Compute value(s).
1224
for (unsigned int r = 0; r < 3; r++)
1226
*values += coefficients0[r]*basisvalues[r];
1227
}// end loop over 'r'
1233
// Array of basisvalues.
1234
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1236
// Declare helper variables.
1237
unsigned int rr = 0;
1238
unsigned int ss = 0;
1239
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1241
// Compute basisvalues.
1242
basisvalues[0] = 1.00000000;
1243
basisvalues[1] = tmp0;
1244
for (unsigned int r = 0; r < 1; r++)
1246
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1248
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1249
}// end loop over 'r'
1250
for (unsigned int r = 0; r < 2; r++)
1252
for (unsigned int s = 0; s < 2 - r; s++)
1254
rr = (r + s)*(r + s + 1)/2 + s;
1255
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1256
}// end loop over 's'
1257
}// end loop over 'r'
1259
// Table(s) of coefficients.
1260
static const double coefficients0[3] = \
1261
{0.47140452, 0.00000000, 0.33333333};
1263
// Compute value(s).
1264
for (unsigned int r = 0; r < 3; r++)
1266
*values += coefficients0[r]*basisvalues[r];
1267
}// end loop over 'r'
1196
1274
/// Evaluate all basis functions at given point in cell
1306
1384
values[r] = 0.00000000;
1307
1385
}// end loop over 'r'
1309
// Map degree of freedom to element degree of freedom
1310
const unsigned int dof = i;
1312
// Array of basisvalues.
1313
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1315
// Declare helper variables.
1316
unsigned int rr = 0;
1317
unsigned int ss = 0;
1318
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1320
// Compute basisvalues.
1321
basisvalues[0] = 1.00000000;
1322
basisvalues[1] = tmp0;
1323
for (unsigned int r = 0; r < 1; r++)
1325
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1327
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1328
}// end loop over 'r'
1329
for (unsigned int r = 0; r < 2; r++)
1331
for (unsigned int s = 0; s < 2 - r; s++)
1333
rr = (r + s)*(r + s + 1)/2 + s;
1334
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1335
}// end loop over 's'
1336
}// end loop over 'r'
1338
// Table(s) of coefficients.
1339
static const double coefficients0[3][3] = \
1340
{{0.47140452, -0.28867513, -0.16666667},
1341
{0.47140452, 0.28867513, -0.16666667},
1342
{0.47140452, 0.00000000, 0.33333333}};
1344
// Tables of derivatives of the polynomial base (transpose).
1345
static const double dmats0[3][3] = \
1346
{{0.00000000, 0.00000000, 0.00000000},
1347
{4.89897949, 0.00000000, 0.00000000},
1348
{0.00000000, 0.00000000, 0.00000000}};
1350
static const double dmats1[3][3] = \
1351
{{0.00000000, 0.00000000, 0.00000000},
1352
{2.44948974, 0.00000000, 0.00000000},
1353
{4.24264069, 0.00000000, 0.00000000}};
1355
// Compute reference derivatives.
1356
// Declare pointer to array of derivatives on FIAT element.
1357
double *derivatives = new double[num_derivatives];
1358
for (unsigned int r = 0; r < num_derivatives; r++)
1360
derivatives[r] = 0.00000000;
1361
}// end loop over 'r'
1363
// Declare derivative matrix (of polynomial basis).
1364
double dmats[3][3] = \
1365
{{1.00000000, 0.00000000, 0.00000000},
1366
{0.00000000, 1.00000000, 0.00000000},
1367
{0.00000000, 0.00000000, 1.00000000}};
1369
// Declare (auxiliary) derivative matrix (of polynomial basis).
1370
double dmats_old[3][3] = \
1371
{{1.00000000, 0.00000000, 0.00000000},
1372
{0.00000000, 1.00000000, 0.00000000},
1373
{0.00000000, 0.00000000, 1.00000000}};
1375
// Loop possible derivatives.
1376
for (unsigned int r = 0; r < num_derivatives; r++)
1378
// Resetting dmats values to compute next derivative.
1379
for (unsigned int t = 0; t < 3; t++)
1381
for (unsigned int u = 0; u < 3; u++)
1383
dmats[t][u] = 0.00000000;
1386
dmats[t][u] = 1.00000000;
1389
}// end loop over 'u'
1390
}// end loop over 't'
1392
// Looping derivative order to generate dmats.
1393
for (unsigned int s = 0; s < n; s++)
1395
// Updating dmats_old with new values and resetting dmats.
1396
for (unsigned int t = 0; t < 3; t++)
1398
for (unsigned int u = 0; u < 3; u++)
1400
dmats_old[t][u] = dmats[t][u];
1401
dmats[t][u] = 0.00000000;
1402
}// end loop over 'u'
1403
}// end loop over 't'
1405
// Update dmats using an inner product.
1406
if (combinations[r][s] == 0)
1408
for (unsigned int t = 0; t < 3; t++)
1410
for (unsigned int u = 0; u < 3; u++)
1412
for (unsigned int tu = 0; tu < 3; tu++)
1414
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1415
}// end loop over 'tu'
1416
}// end loop over 'u'
1417
}// end loop over 't'
1420
if (combinations[r][s] == 1)
1422
for (unsigned int t = 0; t < 3; t++)
1424
for (unsigned int u = 0; u < 3; u++)
1426
for (unsigned int tu = 0; tu < 3; tu++)
1428
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1429
}// end loop over 'tu'
1430
}// end loop over 'u'
1431
}// end loop over 't'
1434
}// end loop over 's'
1435
for (unsigned int s = 0; s < 3; s++)
1437
for (unsigned int t = 0; t < 3; t++)
1439
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
1440
}// end loop over 't'
1441
}// end loop over 's'
1442
}// end loop over 'r'
1444
// Transform derivatives back to physical element
1445
for (unsigned int r = 0; r < num_derivatives; r++)
1447
for (unsigned int s = 0; s < num_derivatives; s++)
1449
values[r] += transform[r][s]*derivatives[s];
1450
}// end loop over 's'
1451
}// end loop over 'r'
1453
// Delete pointer to array of derivatives on FIAT element
1454
delete [] derivatives;
1456
// Delete pointer to array of combinations of derivatives and transform
1457
for (unsigned int r = 0; r < num_derivatives; r++)
1459
delete [] combinations[r];
1460
}// end loop over 'r'
1461
delete [] combinations;
1462
for (unsigned int r = 0; r < num_derivatives; r++)
1464
delete [] transform[r];
1465
}// end loop over 'r'
1466
delete [] transform;
1392
// Array of basisvalues.
1393
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1395
// Declare helper variables.
1396
unsigned int rr = 0;
1397
unsigned int ss = 0;
1398
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1400
// Compute basisvalues.
1401
basisvalues[0] = 1.00000000;
1402
basisvalues[1] = tmp0;
1403
for (unsigned int r = 0; r < 1; r++)
1405
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1407
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1408
}// end loop over 'r'
1409
for (unsigned int r = 0; r < 2; r++)
1411
for (unsigned int s = 0; s < 2 - r; s++)
1413
rr = (r + s)*(r + s + 1)/2 + s;
1414
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1415
}// end loop over 's'
1416
}// end loop over 'r'
1418
// Table(s) of coefficients.
1419
static const double coefficients0[3] = \
1420
{0.47140452, -0.28867513, -0.16666667};
1422
// Tables of derivatives of the polynomial base (transpose).
1423
static const double dmats0[3][3] = \
1424
{{0.00000000, 0.00000000, 0.00000000},
1425
{4.89897949, 0.00000000, 0.00000000},
1426
{0.00000000, 0.00000000, 0.00000000}};
1428
static const double dmats1[3][3] = \
1429
{{0.00000000, 0.00000000, 0.00000000},
1430
{2.44948974, 0.00000000, 0.00000000},
1431
{4.24264069, 0.00000000, 0.00000000}};
1433
// Compute reference derivatives.
1434
// Declare pointer to array of derivatives on FIAT element.
1435
double *derivatives = new double[num_derivatives];
1436
for (unsigned int r = 0; r < num_derivatives; r++)
1438
derivatives[r] = 0.00000000;
1439
}// end loop over 'r'
1441
// Declare derivative matrix (of polynomial basis).
1442
double dmats[3][3] = \
1443
{{1.00000000, 0.00000000, 0.00000000},
1444
{0.00000000, 1.00000000, 0.00000000},
1445
{0.00000000, 0.00000000, 1.00000000}};
1447
// Declare (auxiliary) derivative matrix (of polynomial basis).
1448
double dmats_old[3][3] = \
1449
{{1.00000000, 0.00000000, 0.00000000},
1450
{0.00000000, 1.00000000, 0.00000000},
1451
{0.00000000, 0.00000000, 1.00000000}};
1453
// Loop possible derivatives.
1454
for (unsigned int r = 0; r < num_derivatives; r++)
1456
// Resetting dmats values to compute next derivative.
1457
for (unsigned int t = 0; t < 3; t++)
1459
for (unsigned int u = 0; u < 3; u++)
1461
dmats[t][u] = 0.00000000;
1464
dmats[t][u] = 1.00000000;
1467
}// end loop over 'u'
1468
}// end loop over 't'
1470
// Looping derivative order to generate dmats.
1471
for (unsigned int s = 0; s < n; s++)
1473
// Updating dmats_old with new values and resetting dmats.
1474
for (unsigned int t = 0; t < 3; t++)
1476
for (unsigned int u = 0; u < 3; u++)
1478
dmats_old[t][u] = dmats[t][u];
1479
dmats[t][u] = 0.00000000;
1480
}// end loop over 'u'
1481
}// end loop over 't'
1483
// Update dmats using an inner product.
1484
if (combinations[r][s] == 0)
1486
for (unsigned int t = 0; t < 3; t++)
1488
for (unsigned int u = 0; u < 3; u++)
1490
for (unsigned int tu = 0; tu < 3; tu++)
1492
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1493
}// end loop over 'tu'
1494
}// end loop over 'u'
1495
}// end loop over 't'
1498
if (combinations[r][s] == 1)
1500
for (unsigned int t = 0; t < 3; t++)
1502
for (unsigned int u = 0; u < 3; u++)
1504
for (unsigned int tu = 0; tu < 3; tu++)
1506
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1507
}// end loop over 'tu'
1508
}// end loop over 'u'
1509
}// end loop over 't'
1512
}// end loop over 's'
1513
for (unsigned int s = 0; s < 3; s++)
1515
for (unsigned int t = 0; t < 3; t++)
1517
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1518
}// end loop over 't'
1519
}// end loop over 's'
1520
}// end loop over 'r'
1522
// Transform derivatives back to physical element
1523
for (unsigned int r = 0; r < num_derivatives; r++)
1525
for (unsigned int s = 0; s < num_derivatives; s++)
1527
values[r] += transform[r][s]*derivatives[s];
1528
}// end loop over 's'
1529
}// end loop over 'r'
1531
// Delete pointer to array of derivatives on FIAT element
1532
delete [] derivatives;
1534
// Delete pointer to array of combinations of derivatives and transform
1535
for (unsigned int r = 0; r < num_derivatives; r++)
1537
delete [] combinations[r];
1538
}// end loop over 'r'
1539
delete [] combinations;
1540
for (unsigned int r = 0; r < num_derivatives; r++)
1542
delete [] transform[r];
1543
}// end loop over 'r'
1544
delete [] transform;
1550
// Array of basisvalues.
1551
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1553
// Declare helper variables.
1554
unsigned int rr = 0;
1555
unsigned int ss = 0;
1556
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1558
// Compute basisvalues.
1559
basisvalues[0] = 1.00000000;
1560
basisvalues[1] = tmp0;
1561
for (unsigned int r = 0; r < 1; r++)
1563
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1565
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1566
}// end loop over 'r'
1567
for (unsigned int r = 0; r < 2; r++)
1569
for (unsigned int s = 0; s < 2 - r; s++)
1571
rr = (r + s)*(r + s + 1)/2 + s;
1572
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1573
}// end loop over 's'
1574
}// end loop over 'r'
1576
// Table(s) of coefficients.
1577
static const double coefficients0[3] = \
1578
{0.47140452, 0.28867513, -0.16666667};
1580
// Tables of derivatives of the polynomial base (transpose).
1581
static const double dmats0[3][3] = \
1582
{{0.00000000, 0.00000000, 0.00000000},
1583
{4.89897949, 0.00000000, 0.00000000},
1584
{0.00000000, 0.00000000, 0.00000000}};
1586
static const double dmats1[3][3] = \
1587
{{0.00000000, 0.00000000, 0.00000000},
1588
{2.44948974, 0.00000000, 0.00000000},
1589
{4.24264069, 0.00000000, 0.00000000}};
1591
// Compute reference derivatives.
1592
// Declare pointer to array of derivatives on FIAT element.
1593
double *derivatives = new double[num_derivatives];
1594
for (unsigned int r = 0; r < num_derivatives; r++)
1596
derivatives[r] = 0.00000000;
1597
}// end loop over 'r'
1599
// Declare derivative matrix (of polynomial basis).
1600
double dmats[3][3] = \
1601
{{1.00000000, 0.00000000, 0.00000000},
1602
{0.00000000, 1.00000000, 0.00000000},
1603
{0.00000000, 0.00000000, 1.00000000}};
1605
// Declare (auxiliary) derivative matrix (of polynomial basis).
1606
double dmats_old[3][3] = \
1607
{{1.00000000, 0.00000000, 0.00000000},
1608
{0.00000000, 1.00000000, 0.00000000},
1609
{0.00000000, 0.00000000, 1.00000000}};
1611
// Loop possible derivatives.
1612
for (unsigned int r = 0; r < num_derivatives; r++)
1614
// Resetting dmats values to compute next derivative.
1615
for (unsigned int t = 0; t < 3; t++)
1617
for (unsigned int u = 0; u < 3; u++)
1619
dmats[t][u] = 0.00000000;
1622
dmats[t][u] = 1.00000000;
1625
}// end loop over 'u'
1626
}// end loop over 't'
1628
// Looping derivative order to generate dmats.
1629
for (unsigned int s = 0; s < n; s++)
1631
// Updating dmats_old with new values and resetting dmats.
1632
for (unsigned int t = 0; t < 3; t++)
1634
for (unsigned int u = 0; u < 3; u++)
1636
dmats_old[t][u] = dmats[t][u];
1637
dmats[t][u] = 0.00000000;
1638
}// end loop over 'u'
1639
}// end loop over 't'
1641
// Update dmats using an inner product.
1642
if (combinations[r][s] == 0)
1644
for (unsigned int t = 0; t < 3; t++)
1646
for (unsigned int u = 0; u < 3; u++)
1648
for (unsigned int tu = 0; tu < 3; tu++)
1650
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1651
}// end loop over 'tu'
1652
}// end loop over 'u'
1653
}// end loop over 't'
1656
if (combinations[r][s] == 1)
1658
for (unsigned int t = 0; t < 3; t++)
1660
for (unsigned int u = 0; u < 3; u++)
1662
for (unsigned int tu = 0; tu < 3; tu++)
1664
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1665
}// end loop over 'tu'
1666
}// end loop over 'u'
1667
}// end loop over 't'
1670
}// end loop over 's'
1671
for (unsigned int s = 0; s < 3; s++)
1673
for (unsigned int t = 0; t < 3; t++)
1675
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1676
}// end loop over 't'
1677
}// end loop over 's'
1678
}// end loop over 'r'
1680
// Transform derivatives back to physical element
1681
for (unsigned int r = 0; r < num_derivatives; r++)
1683
for (unsigned int s = 0; s < num_derivatives; s++)
1685
values[r] += transform[r][s]*derivatives[s];
1686
}// end loop over 's'
1687
}// end loop over 'r'
1689
// Delete pointer to array of derivatives on FIAT element
1690
delete [] derivatives;
1692
// Delete pointer to array of combinations of derivatives and transform
1693
for (unsigned int r = 0; r < num_derivatives; r++)
1695
delete [] combinations[r];
1696
}// end loop over 'r'
1697
delete [] combinations;
1698
for (unsigned int r = 0; r < num_derivatives; r++)
1700
delete [] transform[r];
1701
}// end loop over 'r'
1702
delete [] transform;
1708
// Array of basisvalues.
1709
double basisvalues[3] = {0.00000000, 0.00000000, 0.00000000};
1711
// Declare helper variables.
1712
unsigned int rr = 0;
1713
unsigned int ss = 0;
1714
double tmp0 = (1.00000000 + Y + 2.00000000*X)/2.00000000;
1716
// Compute basisvalues.
1717
basisvalues[0] = 1.00000000;
1718
basisvalues[1] = tmp0;
1719
for (unsigned int r = 0; r < 1; r++)
1721
rr = (r + 1)*(r + 1 + 1)/2 + 1;
1723
basisvalues[rr] = basisvalues[ss]*(0.50000000 + r + Y*(1.50000000 + r));
1724
}// end loop over 'r'
1725
for (unsigned int r = 0; r < 2; r++)
1727
for (unsigned int s = 0; s < 2 - r; s++)
1729
rr = (r + s)*(r + s + 1)/2 + s;
1730
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s));
1731
}// end loop over 's'
1732
}// end loop over 'r'
1734
// Table(s) of coefficients.
1735
static const double coefficients0[3] = \
1736
{0.47140452, 0.00000000, 0.33333333};
1738
// Tables of derivatives of the polynomial base (transpose).
1739
static const double dmats0[3][3] = \
1740
{{0.00000000, 0.00000000, 0.00000000},
1741
{4.89897949, 0.00000000, 0.00000000},
1742
{0.00000000, 0.00000000, 0.00000000}};
1744
static const double dmats1[3][3] = \
1745
{{0.00000000, 0.00000000, 0.00000000},
1746
{2.44948974, 0.00000000, 0.00000000},
1747
{4.24264069, 0.00000000, 0.00000000}};
1749
// Compute reference derivatives.
1750
// Declare pointer to array of derivatives on FIAT element.
1751
double *derivatives = new double[num_derivatives];
1752
for (unsigned int r = 0; r < num_derivatives; r++)
1754
derivatives[r] = 0.00000000;
1755
}// end loop over 'r'
1757
// Declare derivative matrix (of polynomial basis).
1758
double dmats[3][3] = \
1759
{{1.00000000, 0.00000000, 0.00000000},
1760
{0.00000000, 1.00000000, 0.00000000},
1761
{0.00000000, 0.00000000, 1.00000000}};
1763
// Declare (auxiliary) derivative matrix (of polynomial basis).
1764
double dmats_old[3][3] = \
1765
{{1.00000000, 0.00000000, 0.00000000},
1766
{0.00000000, 1.00000000, 0.00000000},
1767
{0.00000000, 0.00000000, 1.00000000}};
1769
// Loop possible derivatives.
1770
for (unsigned int r = 0; r < num_derivatives; r++)
1772
// Resetting dmats values to compute next derivative.
1773
for (unsigned int t = 0; t < 3; t++)
1775
for (unsigned int u = 0; u < 3; u++)
1777
dmats[t][u] = 0.00000000;
1780
dmats[t][u] = 1.00000000;
1783
}// end loop over 'u'
1784
}// end loop over 't'
1786
// Looping derivative order to generate dmats.
1787
for (unsigned int s = 0; s < n; s++)
1789
// Updating dmats_old with new values and resetting dmats.
1790
for (unsigned int t = 0; t < 3; t++)
1792
for (unsigned int u = 0; u < 3; u++)
1794
dmats_old[t][u] = dmats[t][u];
1795
dmats[t][u] = 0.00000000;
1796
}// end loop over 'u'
1797
}// end loop over 't'
1799
// Update dmats using an inner product.
1800
if (combinations[r][s] == 0)
1802
for (unsigned int t = 0; t < 3; t++)
1804
for (unsigned int u = 0; u < 3; u++)
1806
for (unsigned int tu = 0; tu < 3; tu++)
1808
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1809
}// end loop over 'tu'
1810
}// end loop over 'u'
1811
}// end loop over 't'
1814
if (combinations[r][s] == 1)
1816
for (unsigned int t = 0; t < 3; t++)
1818
for (unsigned int u = 0; u < 3; u++)
1820
for (unsigned int tu = 0; tu < 3; tu++)
1822
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1823
}// end loop over 'tu'
1824
}// end loop over 'u'
1825
}// end loop over 't'
1828
}// end loop over 's'
1829
for (unsigned int s = 0; s < 3; s++)
1831
for (unsigned int t = 0; t < 3; t++)
1833
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1834
}// end loop over 't'
1835
}// end loop over 's'
1836
}// end loop over 'r'
1838
// Transform derivatives back to physical element
1839
for (unsigned int r = 0; r < num_derivatives; r++)
1841
for (unsigned int s = 0; s < num_derivatives; s++)
1843
values[r] += transform[r][s]*derivatives[s];
1844
}// end loop over 's'
1845
}// end loop over 'r'
1847
// Delete pointer to array of derivatives on FIAT element
1848
delete [] derivatives;
1850
// Delete pointer to array of combinations of derivatives and transform
1851
for (unsigned int r = 0; r < num_derivatives; r++)
1853
delete [] combinations[r];
1854
}// end loop over 'r'
1855
delete [] combinations;
1856
for (unsigned int r = 0; r < num_derivatives; r++)
1858
delete [] transform[r];
1859
}// end loop over 'r'
1860
delete [] transform;
1469
1867
/// Evaluate order n derivatives of all basis functions at given point in cell