126
126
*values = 0.00000000;
128
// Map degree of freedom to element degree of freedom
129
const unsigned int dof = i;
131
// Array of basisvalues.
132
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
134
// Declare helper variables.
137
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
139
// Compute basisvalues.
140
basisvalues[0] = 1.00000000;
141
basisvalues[1] = tmp0;
142
for (unsigned int r = 0; r < 1; r++)
144
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
145
ss = r*(r + 1)*(r + 2)/6;
146
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
147
}// end loop over 'r'
148
for (unsigned int r = 0; r < 1; r++)
150
for (unsigned int s = 0; s < 1 - r; s++)
152
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
153
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
154
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
155
}// end loop over 's'
156
}// end loop over 'r'
157
for (unsigned int r = 0; r < 2; r++)
159
for (unsigned int s = 0; s < 2 - r; s++)
161
for (unsigned int t = 0; t < 2 - r - s; t++)
163
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
164
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
165
}// end loop over 't'
166
}// end loop over 's'
167
}// end loop over 'r'
169
// Table(s) of coefficients.
170
static const double coefficients0[4][4] = \
171
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
172
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
173
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
174
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
177
for (unsigned int r = 0; r < 4; r++)
179
*values += coefficients0[dof][r]*basisvalues[r];
180
}// end loop over 'r'
132
// Array of basisvalues.
133
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
135
// Declare helper variables.
138
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
140
// Compute basisvalues.
141
basisvalues[0] = 1.00000000;
142
basisvalues[1] = tmp0;
143
for (unsigned int r = 0; r < 1; r++)
145
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
146
ss = r*(r + 1)*(r + 2)/6;
147
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
148
}// end loop over 'r'
149
for (unsigned int r = 0; r < 1; r++)
151
for (unsigned int s = 0; s < 1 - r; s++)
153
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
154
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
155
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
156
}// end loop over 's'
157
}// end loop over 'r'
158
for (unsigned int r = 0; r < 2; r++)
160
for (unsigned int s = 0; s < 2 - r; s++)
162
for (unsigned int t = 0; t < 2 - r - s; t++)
164
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
165
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
166
}// end loop over 't'
167
}// end loop over 's'
168
}// end loop over 'r'
170
// Table(s) of coefficients.
171
static const double coefficients0[4] = \
172
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
175
for (unsigned int r = 0; r < 4; r++)
177
*values += coefficients0[r]*basisvalues[r];
178
}// end loop over 'r'
184
// Array of basisvalues.
185
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
187
// Declare helper variables.
190
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
192
// Compute basisvalues.
193
basisvalues[0] = 1.00000000;
194
basisvalues[1] = tmp0;
195
for (unsigned int r = 0; r < 1; r++)
197
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
198
ss = r*(r + 1)*(r + 2)/6;
199
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
200
}// end loop over 'r'
201
for (unsigned int r = 0; r < 1; r++)
203
for (unsigned int s = 0; s < 1 - r; s++)
205
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
206
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
207
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
208
}// end loop over 's'
209
}// end loop over 'r'
210
for (unsigned int r = 0; r < 2; r++)
212
for (unsigned int s = 0; s < 2 - r; s++)
214
for (unsigned int t = 0; t < 2 - r - s; t++)
216
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
217
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
218
}// end loop over 't'
219
}// end loop over 's'
220
}// end loop over 'r'
222
// Table(s) of coefficients.
223
static const double coefficients0[4] = \
224
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
227
for (unsigned int r = 0; r < 4; r++)
229
*values += coefficients0[r]*basisvalues[r];
230
}// end loop over 'r'
236
// Array of basisvalues.
237
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
239
// Declare helper variables.
242
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
244
// Compute basisvalues.
245
basisvalues[0] = 1.00000000;
246
basisvalues[1] = tmp0;
247
for (unsigned int r = 0; r < 1; r++)
249
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
250
ss = r*(r + 1)*(r + 2)/6;
251
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
252
}// end loop over 'r'
253
for (unsigned int r = 0; r < 1; r++)
255
for (unsigned int s = 0; s < 1 - r; s++)
257
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
258
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
259
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
260
}// end loop over 's'
261
}// end loop over 'r'
262
for (unsigned int r = 0; r < 2; r++)
264
for (unsigned int s = 0; s < 2 - r; s++)
266
for (unsigned int t = 0; t < 2 - r - s; t++)
268
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
269
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
270
}// end loop over 't'
271
}// end loop over 's'
272
}// end loop over 'r'
274
// Table(s) of coefficients.
275
static const double coefficients0[4] = \
276
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
279
for (unsigned int r = 0; r < 4; r++)
281
*values += coefficients0[r]*basisvalues[r];
282
}// end loop over 'r'
288
// Array of basisvalues.
289
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
291
// Declare helper variables.
294
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
296
// Compute basisvalues.
297
basisvalues[0] = 1.00000000;
298
basisvalues[1] = tmp0;
299
for (unsigned int r = 0; r < 1; r++)
301
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
302
ss = r*(r + 1)*(r + 2)/6;
303
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
304
}// end loop over 'r'
305
for (unsigned int r = 0; r < 1; r++)
307
for (unsigned int s = 0; s < 1 - r; s++)
309
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
310
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
311
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
312
}// end loop over 's'
313
}// end loop over 'r'
314
for (unsigned int r = 0; r < 2; r++)
316
for (unsigned int s = 0; s < 2 - r; s++)
318
for (unsigned int t = 0; t < 2 - r - s; t++)
320
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
321
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
322
}// end loop over 't'
323
}// end loop over 's'
324
}// end loop over 'r'
326
// Table(s) of coefficients.
327
static const double coefficients0[4] = \
328
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
331
for (unsigned int r = 0; r < 4; r++)
333
*values += coefficients0[r]*basisvalues[r];
334
}// end loop over 'r'
183
341
/// Evaluate all basis functions at given point in cell
317
475
values[r] = 0.00000000;
318
476
}// end loop over 'r'
320
// Map degree of freedom to element degree of freedom
321
const unsigned int dof = i;
323
// Array of basisvalues.
324
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
326
// Declare helper variables.
329
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
331
// Compute basisvalues.
332
basisvalues[0] = 1.00000000;
333
basisvalues[1] = tmp0;
334
for (unsigned int r = 0; r < 1; r++)
336
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
337
ss = r*(r + 1)*(r + 2)/6;
338
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
339
}// end loop over 'r'
340
for (unsigned int r = 0; r < 1; r++)
342
for (unsigned int s = 0; s < 1 - r; s++)
344
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
345
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
346
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
347
}// end loop over 's'
348
}// end loop over 'r'
349
for (unsigned int r = 0; r < 2; r++)
351
for (unsigned int s = 0; s < 2 - r; s++)
353
for (unsigned int t = 0; t < 2 - r - s; t++)
355
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
356
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
357
}// end loop over 't'
358
}// end loop over 's'
359
}// end loop over 'r'
361
// Table(s) of coefficients.
362
static const double coefficients0[4][4] = \
363
{{0.28867513, -0.18257419, -0.10540926, -0.07453560},
364
{0.28867513, 0.18257419, -0.10540926, -0.07453560},
365
{0.28867513, 0.00000000, 0.21081851, -0.07453560},
366
{0.28867513, 0.00000000, 0.00000000, 0.22360680}};
368
// Tables of derivatives of the polynomial base (transpose).
369
static const double dmats0[4][4] = \
370
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
371
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
372
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
373
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
375
static const double dmats1[4][4] = \
376
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
377
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
378
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
379
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
381
static const double dmats2[4][4] = \
382
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
383
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
384
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
385
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
387
// Compute reference derivatives.
388
// Declare pointer to array of derivatives on FIAT element.
389
double *derivatives = new double[num_derivatives];
390
for (unsigned int r = 0; r < num_derivatives; r++)
392
derivatives[r] = 0.00000000;
393
}// end loop over 'r'
395
// Declare derivative matrix (of polynomial basis).
396
double dmats[4][4] = \
397
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
398
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
399
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
400
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
402
// Declare (auxiliary) derivative matrix (of polynomial basis).
403
double dmats_old[4][4] = \
404
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
405
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
406
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
407
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
409
// Loop possible derivatives.
410
for (unsigned int r = 0; r < num_derivatives; r++)
412
// Resetting dmats values to compute next derivative.
413
for (unsigned int t = 0; t < 4; t++)
415
for (unsigned int u = 0; u < 4; u++)
417
dmats[t][u] = 0.00000000;
420
dmats[t][u] = 1.00000000;
423
}// end loop over 'u'
424
}// end loop over 't'
426
// Looping derivative order to generate dmats.
427
for (unsigned int s = 0; s < n; s++)
429
// Updating dmats_old with new values and resetting dmats.
430
for (unsigned int t = 0; t < 4; t++)
432
for (unsigned int u = 0; u < 4; u++)
434
dmats_old[t][u] = dmats[t][u];
435
dmats[t][u] = 0.00000000;
436
}// end loop over 'u'
437
}// end loop over 't'
439
// Update dmats using an inner product.
440
if (combinations[r][s] == 0)
442
for (unsigned int t = 0; t < 4; t++)
444
for (unsigned int u = 0; u < 4; u++)
446
for (unsigned int tu = 0; tu < 4; tu++)
448
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
449
}// end loop over 'tu'
450
}// end loop over 'u'
451
}// end loop over 't'
454
if (combinations[r][s] == 1)
456
for (unsigned int t = 0; t < 4; t++)
458
for (unsigned int u = 0; u < 4; u++)
460
for (unsigned int tu = 0; tu < 4; tu++)
462
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
463
}// end loop over 'tu'
464
}// end loop over 'u'
465
}// end loop over 't'
468
if (combinations[r][s] == 2)
470
for (unsigned int t = 0; t < 4; t++)
472
for (unsigned int u = 0; u < 4; u++)
474
for (unsigned int tu = 0; tu < 4; tu++)
476
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
477
}// end loop over 'tu'
478
}// end loop over 'u'
479
}// end loop over 't'
482
}// end loop over 's'
483
for (unsigned int s = 0; s < 4; s++)
485
for (unsigned int t = 0; t < 4; t++)
487
derivatives[r] += coefficients0[dof][s]*dmats[s][t]*basisvalues[t];
488
}// end loop over 't'
489
}// end loop over 's'
490
}// end loop over 'r'
492
// Transform derivatives back to physical element
493
for (unsigned int r = 0; r < num_derivatives; r++)
495
for (unsigned int s = 0; s < num_derivatives; s++)
497
values[r] += transform[r][s]*derivatives[s];
498
}// end loop over 's'
499
}// end loop over 'r'
501
// Delete pointer to array of derivatives on FIAT element
502
delete [] derivatives;
504
// Delete pointer to array of combinations of derivatives and transform
505
for (unsigned int r = 0; r < num_derivatives; r++)
507
delete [] combinations[r];
508
}// end loop over 'r'
509
delete [] combinations;
510
for (unsigned int r = 0; r < num_derivatives; r++)
512
delete [] transform[r];
513
}// end loop over 'r'
483
// Array of basisvalues.
484
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
486
// Declare helper variables.
489
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
491
// Compute basisvalues.
492
basisvalues[0] = 1.00000000;
493
basisvalues[1] = tmp0;
494
for (unsigned int r = 0; r < 1; r++)
496
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
497
ss = r*(r + 1)*(r + 2)/6;
498
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
499
}// end loop over 'r'
500
for (unsigned int r = 0; r < 1; r++)
502
for (unsigned int s = 0; s < 1 - r; s++)
504
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
505
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
506
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
507
}// end loop over 's'
508
}// end loop over 'r'
509
for (unsigned int r = 0; r < 2; r++)
511
for (unsigned int s = 0; s < 2 - r; s++)
513
for (unsigned int t = 0; t < 2 - r - s; t++)
515
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
516
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
517
}// end loop over 't'
518
}// end loop over 's'
519
}// end loop over 'r'
521
// Table(s) of coefficients.
522
static const double coefficients0[4] = \
523
{0.28867513, -0.18257419, -0.10540926, -0.07453560};
525
// Tables of derivatives of the polynomial base (transpose).
526
static const double dmats0[4][4] = \
527
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
528
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
529
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
530
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
532
static const double dmats1[4][4] = \
533
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
534
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
535
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
536
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
538
static const double dmats2[4][4] = \
539
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
540
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
541
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
542
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
544
// Compute reference derivatives.
545
// Declare pointer to array of derivatives on FIAT element.
546
double *derivatives = new double[num_derivatives];
547
for (unsigned int r = 0; r < num_derivatives; r++)
549
derivatives[r] = 0.00000000;
550
}// end loop over 'r'
552
// Declare derivative matrix (of polynomial basis).
553
double dmats[4][4] = \
554
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
555
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
556
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
557
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
559
// Declare (auxiliary) derivative matrix (of polynomial basis).
560
double dmats_old[4][4] = \
561
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
562
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
563
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
564
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
566
// Loop possible derivatives.
567
for (unsigned int r = 0; r < num_derivatives; r++)
569
// Resetting dmats values to compute next derivative.
570
for (unsigned int t = 0; t < 4; t++)
572
for (unsigned int u = 0; u < 4; u++)
574
dmats[t][u] = 0.00000000;
577
dmats[t][u] = 1.00000000;
580
}// end loop over 'u'
581
}// end loop over 't'
583
// Looping derivative order to generate dmats.
584
for (unsigned int s = 0; s < n; s++)
586
// Updating dmats_old with new values and resetting dmats.
587
for (unsigned int t = 0; t < 4; t++)
589
for (unsigned int u = 0; u < 4; u++)
591
dmats_old[t][u] = dmats[t][u];
592
dmats[t][u] = 0.00000000;
593
}// end loop over 'u'
594
}// end loop over 't'
596
// Update dmats using an inner product.
597
if (combinations[r][s] == 0)
599
for (unsigned int t = 0; t < 4; t++)
601
for (unsigned int u = 0; u < 4; u++)
603
for (unsigned int tu = 0; tu < 4; tu++)
605
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
606
}// end loop over 'tu'
607
}// end loop over 'u'
608
}// end loop over 't'
611
if (combinations[r][s] == 1)
613
for (unsigned int t = 0; t < 4; t++)
615
for (unsigned int u = 0; u < 4; u++)
617
for (unsigned int tu = 0; tu < 4; tu++)
619
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
620
}// end loop over 'tu'
621
}// end loop over 'u'
622
}// end loop over 't'
625
if (combinations[r][s] == 2)
627
for (unsigned int t = 0; t < 4; t++)
629
for (unsigned int u = 0; u < 4; u++)
631
for (unsigned int tu = 0; tu < 4; tu++)
633
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
634
}// end loop over 'tu'
635
}// end loop over 'u'
636
}// end loop over 't'
639
}// end loop over 's'
640
for (unsigned int s = 0; s < 4; s++)
642
for (unsigned int t = 0; t < 4; t++)
644
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
645
}// end loop over 't'
646
}// end loop over 's'
647
}// end loop over 'r'
649
// Transform derivatives back to physical element
650
for (unsigned int r = 0; r < num_derivatives; r++)
652
for (unsigned int s = 0; s < num_derivatives; s++)
654
values[r] += transform[r][s]*derivatives[s];
655
}// end loop over 's'
656
}// end loop over 'r'
658
// Delete pointer to array of derivatives on FIAT element
659
delete [] derivatives;
661
// Delete pointer to array of combinations of derivatives and transform
662
for (unsigned int r = 0; r < num_derivatives; r++)
664
delete [] combinations[r];
665
}// end loop over 'r'
666
delete [] combinations;
667
for (unsigned int r = 0; r < num_derivatives; r++)
669
delete [] transform[r];
670
}// end loop over 'r'
677
// Array of basisvalues.
678
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
680
// Declare helper variables.
683
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
685
// Compute basisvalues.
686
basisvalues[0] = 1.00000000;
687
basisvalues[1] = tmp0;
688
for (unsigned int r = 0; r < 1; r++)
690
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
691
ss = r*(r + 1)*(r + 2)/6;
692
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
693
}// end loop over 'r'
694
for (unsigned int r = 0; r < 1; r++)
696
for (unsigned int s = 0; s < 1 - r; s++)
698
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
699
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
700
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
701
}// end loop over 's'
702
}// end loop over 'r'
703
for (unsigned int r = 0; r < 2; r++)
705
for (unsigned int s = 0; s < 2 - r; s++)
707
for (unsigned int t = 0; t < 2 - r - s; t++)
709
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
710
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
711
}// end loop over 't'
712
}// end loop over 's'
713
}// end loop over 'r'
715
// Table(s) of coefficients.
716
static const double coefficients0[4] = \
717
{0.28867513, 0.18257419, -0.10540926, -0.07453560};
719
// Tables of derivatives of the polynomial base (transpose).
720
static const double dmats0[4][4] = \
721
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
722
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
723
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
724
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
726
static const double dmats1[4][4] = \
727
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
728
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
729
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
730
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
732
static const double dmats2[4][4] = \
733
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
734
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
735
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
736
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
738
// Compute reference derivatives.
739
// Declare pointer to array of derivatives on FIAT element.
740
double *derivatives = new double[num_derivatives];
741
for (unsigned int r = 0; r < num_derivatives; r++)
743
derivatives[r] = 0.00000000;
744
}// end loop over 'r'
746
// Declare derivative matrix (of polynomial basis).
747
double dmats[4][4] = \
748
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
749
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
750
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
751
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
753
// Declare (auxiliary) derivative matrix (of polynomial basis).
754
double dmats_old[4][4] = \
755
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
756
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
757
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
758
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
760
// Loop possible derivatives.
761
for (unsigned int r = 0; r < num_derivatives; r++)
763
// Resetting dmats values to compute next derivative.
764
for (unsigned int t = 0; t < 4; t++)
766
for (unsigned int u = 0; u < 4; u++)
768
dmats[t][u] = 0.00000000;
771
dmats[t][u] = 1.00000000;
774
}// end loop over 'u'
775
}// end loop over 't'
777
// Looping derivative order to generate dmats.
778
for (unsigned int s = 0; s < n; s++)
780
// Updating dmats_old with new values and resetting dmats.
781
for (unsigned int t = 0; t < 4; t++)
783
for (unsigned int u = 0; u < 4; u++)
785
dmats_old[t][u] = dmats[t][u];
786
dmats[t][u] = 0.00000000;
787
}// end loop over 'u'
788
}// end loop over 't'
790
// Update dmats using an inner product.
791
if (combinations[r][s] == 0)
793
for (unsigned int t = 0; t < 4; t++)
795
for (unsigned int u = 0; u < 4; u++)
797
for (unsigned int tu = 0; tu < 4; tu++)
799
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
800
}// end loop over 'tu'
801
}// end loop over 'u'
802
}// end loop over 't'
805
if (combinations[r][s] == 1)
807
for (unsigned int t = 0; t < 4; t++)
809
for (unsigned int u = 0; u < 4; u++)
811
for (unsigned int tu = 0; tu < 4; tu++)
813
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
814
}// end loop over 'tu'
815
}// end loop over 'u'
816
}// end loop over 't'
819
if (combinations[r][s] == 2)
821
for (unsigned int t = 0; t < 4; t++)
823
for (unsigned int u = 0; u < 4; u++)
825
for (unsigned int tu = 0; tu < 4; tu++)
827
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
828
}// end loop over 'tu'
829
}// end loop over 'u'
830
}// end loop over 't'
833
}// end loop over 's'
834
for (unsigned int s = 0; s < 4; s++)
836
for (unsigned int t = 0; t < 4; t++)
838
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
839
}// end loop over 't'
840
}// end loop over 's'
841
}// end loop over 'r'
843
// Transform derivatives back to physical element
844
for (unsigned int r = 0; r < num_derivatives; r++)
846
for (unsigned int s = 0; s < num_derivatives; s++)
848
values[r] += transform[r][s]*derivatives[s];
849
}// end loop over 's'
850
}// end loop over 'r'
852
// Delete pointer to array of derivatives on FIAT element
853
delete [] derivatives;
855
// Delete pointer to array of combinations of derivatives and transform
856
for (unsigned int r = 0; r < num_derivatives; r++)
858
delete [] combinations[r];
859
}// end loop over 'r'
860
delete [] combinations;
861
for (unsigned int r = 0; r < num_derivatives; r++)
863
delete [] transform[r];
864
}// end loop over 'r'
871
// Array of basisvalues.
872
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
874
// Declare helper variables.
877
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
879
// Compute basisvalues.
880
basisvalues[0] = 1.00000000;
881
basisvalues[1] = tmp0;
882
for (unsigned int r = 0; r < 1; r++)
884
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
885
ss = r*(r + 1)*(r + 2)/6;
886
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
887
}// end loop over 'r'
888
for (unsigned int r = 0; r < 1; r++)
890
for (unsigned int s = 0; s < 1 - r; s++)
892
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
893
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
894
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
895
}// end loop over 's'
896
}// end loop over 'r'
897
for (unsigned int r = 0; r < 2; r++)
899
for (unsigned int s = 0; s < 2 - r; s++)
901
for (unsigned int t = 0; t < 2 - r - s; t++)
903
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
904
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
905
}// end loop over 't'
906
}// end loop over 's'
907
}// end loop over 'r'
909
// Table(s) of coefficients.
910
static const double coefficients0[4] = \
911
{0.28867513, 0.00000000, 0.21081851, -0.07453560};
913
// Tables of derivatives of the polynomial base (transpose).
914
static const double dmats0[4][4] = \
915
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
916
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
917
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
918
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
920
static const double dmats1[4][4] = \
921
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
922
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
923
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
924
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
926
static const double dmats2[4][4] = \
927
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
928
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
929
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
930
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
932
// Compute reference derivatives.
933
// Declare pointer to array of derivatives on FIAT element.
934
double *derivatives = new double[num_derivatives];
935
for (unsigned int r = 0; r < num_derivatives; r++)
937
derivatives[r] = 0.00000000;
938
}// end loop over 'r'
940
// Declare derivative matrix (of polynomial basis).
941
double dmats[4][4] = \
942
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
943
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
944
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
945
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
947
// Declare (auxiliary) derivative matrix (of polynomial basis).
948
double dmats_old[4][4] = \
949
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
950
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
951
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
952
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
954
// Loop possible derivatives.
955
for (unsigned int r = 0; r < num_derivatives; r++)
957
// Resetting dmats values to compute next derivative.
958
for (unsigned int t = 0; t < 4; t++)
960
for (unsigned int u = 0; u < 4; u++)
962
dmats[t][u] = 0.00000000;
965
dmats[t][u] = 1.00000000;
968
}// end loop over 'u'
969
}// end loop over 't'
971
// Looping derivative order to generate dmats.
972
for (unsigned int s = 0; s < n; s++)
974
// Updating dmats_old with new values and resetting dmats.
975
for (unsigned int t = 0; t < 4; t++)
977
for (unsigned int u = 0; u < 4; u++)
979
dmats_old[t][u] = dmats[t][u];
980
dmats[t][u] = 0.00000000;
981
}// end loop over 'u'
982
}// end loop over 't'
984
// Update dmats using an inner product.
985
if (combinations[r][s] == 0)
987
for (unsigned int t = 0; t < 4; t++)
989
for (unsigned int u = 0; u < 4; u++)
991
for (unsigned int tu = 0; tu < 4; tu++)
993
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
994
}// end loop over 'tu'
995
}// end loop over 'u'
996
}// end loop over 't'
999
if (combinations[r][s] == 1)
1001
for (unsigned int t = 0; t < 4; t++)
1003
for (unsigned int u = 0; u < 4; u++)
1005
for (unsigned int tu = 0; tu < 4; tu++)
1007
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1008
}// end loop over 'tu'
1009
}// end loop over 'u'
1010
}// end loop over 't'
1013
if (combinations[r][s] == 2)
1015
for (unsigned int t = 0; t < 4; t++)
1017
for (unsigned int u = 0; u < 4; u++)
1019
for (unsigned int tu = 0; tu < 4; tu++)
1021
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1022
}// end loop over 'tu'
1023
}// end loop over 'u'
1024
}// end loop over 't'
1027
}// end loop over 's'
1028
for (unsigned int s = 0; s < 4; s++)
1030
for (unsigned int t = 0; t < 4; t++)
1032
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1033
}// end loop over 't'
1034
}// end loop over 's'
1035
}// end loop over 'r'
1037
// Transform derivatives back to physical element
1038
for (unsigned int r = 0; r < num_derivatives; r++)
1040
for (unsigned int s = 0; s < num_derivatives; s++)
1042
values[r] += transform[r][s]*derivatives[s];
1043
}// end loop over 's'
1044
}// end loop over 'r'
1046
// Delete pointer to array of derivatives on FIAT element
1047
delete [] derivatives;
1049
// Delete pointer to array of combinations of derivatives and transform
1050
for (unsigned int r = 0; r < num_derivatives; r++)
1052
delete [] combinations[r];
1053
}// end loop over 'r'
1054
delete [] combinations;
1055
for (unsigned int r = 0; r < num_derivatives; r++)
1057
delete [] transform[r];
1058
}// end loop over 'r'
1059
delete [] transform;
1065
// Array of basisvalues.
1066
double basisvalues[4] = {0.00000000, 0.00000000, 0.00000000, 0.00000000};
1068
// Declare helper variables.
1069
unsigned int rr = 0;
1070
unsigned int ss = 0;
1071
double tmp0 = 0.50000000*(2.00000000 + Y + Z + 2.00000000*X);
1073
// Compute basisvalues.
1074
basisvalues[0] = 1.00000000;
1075
basisvalues[1] = tmp0;
1076
for (unsigned int r = 0; r < 1; r++)
1078
rr = (r + 1)*(r + 1 + 1)*(r + 1 + 2)/6 + 1*(1 + 1)/2;
1079
ss = r*(r + 1)*(r + 2)/6;
1080
basisvalues[rr] = basisvalues[ss]*(r*(1.00000000 + Y) + (2.00000000 + Z + 3.00000000*Y)/2.00000000);
1081
}// end loop over 'r'
1082
for (unsigned int r = 0; r < 1; r++)
1084
for (unsigned int s = 0; s < 1 - r; s++)
1086
rr = (r + s + 1)*(r + s + 1 + 1)*(r + s + 1 + 2)/6 + (s + 1)*(s + 1 + 1)/2 + 1;
1087
ss = (r + s)*(r + s + 1)*(r + s + 2)/6 + s*(s + 1)/2;
1088
basisvalues[rr] = basisvalues[ss]*(1.00000000 + r + s + Z*(2.00000000 + r + s));
1089
}// end loop over 's'
1090
}// end loop over 'r'
1091
for (unsigned int r = 0; r < 2; r++)
1093
for (unsigned int s = 0; s < 2 - r; s++)
1095
for (unsigned int t = 0; t < 2 - r - s; t++)
1097
rr = (r + s + t)*(r + s + t + 1)*(r + s + t + 2)/6 + (s + t)*(s + t + 1)/2 + t;
1098
basisvalues[rr] *= std::sqrt((0.50000000 + r)*(1.00000000 + r + s)*(1.50000000 + r + s + t));
1099
}// end loop over 't'
1100
}// end loop over 's'
1101
}// end loop over 'r'
1103
// Table(s) of coefficients.
1104
static const double coefficients0[4] = \
1105
{0.28867513, 0.00000000, 0.00000000, 0.22360680};
1107
// Tables of derivatives of the polynomial base (transpose).
1108
static const double dmats0[4][4] = \
1109
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1110
{6.32455532, 0.00000000, 0.00000000, 0.00000000},
1111
{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1112
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1114
static const double dmats1[4][4] = \
1115
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1116
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1117
{5.47722558, 0.00000000, 0.00000000, 0.00000000},
1118
{0.00000000, 0.00000000, 0.00000000, 0.00000000}};
1120
static const double dmats2[4][4] = \
1121
{{0.00000000, 0.00000000, 0.00000000, 0.00000000},
1122
{3.16227766, 0.00000000, 0.00000000, 0.00000000},
1123
{1.82574186, 0.00000000, 0.00000000, 0.00000000},
1124
{5.16397779, 0.00000000, 0.00000000, 0.00000000}};
1126
// Compute reference derivatives.
1127
// Declare pointer to array of derivatives on FIAT element.
1128
double *derivatives = new double[num_derivatives];
1129
for (unsigned int r = 0; r < num_derivatives; r++)
1131
derivatives[r] = 0.00000000;
1132
}// end loop over 'r'
1134
// Declare derivative matrix (of polynomial basis).
1135
double dmats[4][4] = \
1136
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1137
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1138
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1139
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1141
// Declare (auxiliary) derivative matrix (of polynomial basis).
1142
double dmats_old[4][4] = \
1143
{{1.00000000, 0.00000000, 0.00000000, 0.00000000},
1144
{0.00000000, 1.00000000, 0.00000000, 0.00000000},
1145
{0.00000000, 0.00000000, 1.00000000, 0.00000000},
1146
{0.00000000, 0.00000000, 0.00000000, 1.00000000}};
1148
// Loop possible derivatives.
1149
for (unsigned int r = 0; r < num_derivatives; r++)
1151
// Resetting dmats values to compute next derivative.
1152
for (unsigned int t = 0; t < 4; t++)
1154
for (unsigned int u = 0; u < 4; u++)
1156
dmats[t][u] = 0.00000000;
1159
dmats[t][u] = 1.00000000;
1162
}// end loop over 'u'
1163
}// end loop over 't'
1165
// Looping derivative order to generate dmats.
1166
for (unsigned int s = 0; s < n; s++)
1168
// Updating dmats_old with new values and resetting dmats.
1169
for (unsigned int t = 0; t < 4; t++)
1171
for (unsigned int u = 0; u < 4; u++)
1173
dmats_old[t][u] = dmats[t][u];
1174
dmats[t][u] = 0.00000000;
1175
}// end loop over 'u'
1176
}// end loop over 't'
1178
// Update dmats using an inner product.
1179
if (combinations[r][s] == 0)
1181
for (unsigned int t = 0; t < 4; t++)
1183
for (unsigned int u = 0; u < 4; u++)
1185
for (unsigned int tu = 0; tu < 4; tu++)
1187
dmats[t][u] += dmats0[t][tu]*dmats_old[tu][u];
1188
}// end loop over 'tu'
1189
}// end loop over 'u'
1190
}// end loop over 't'
1193
if (combinations[r][s] == 1)
1195
for (unsigned int t = 0; t < 4; t++)
1197
for (unsigned int u = 0; u < 4; u++)
1199
for (unsigned int tu = 0; tu < 4; tu++)
1201
dmats[t][u] += dmats1[t][tu]*dmats_old[tu][u];
1202
}// end loop over 'tu'
1203
}// end loop over 'u'
1204
}// end loop over 't'
1207
if (combinations[r][s] == 2)
1209
for (unsigned int t = 0; t < 4; t++)
1211
for (unsigned int u = 0; u < 4; u++)
1213
for (unsigned int tu = 0; tu < 4; tu++)
1215
dmats[t][u] += dmats2[t][tu]*dmats_old[tu][u];
1216
}// end loop over 'tu'
1217
}// end loop over 'u'
1218
}// end loop over 't'
1221
}// end loop over 's'
1222
for (unsigned int s = 0; s < 4; s++)
1224
for (unsigned int t = 0; t < 4; t++)
1226
derivatives[r] += coefficients0[s]*dmats[s][t]*basisvalues[t];
1227
}// end loop over 't'
1228
}// end loop over 's'
1229
}// end loop over 'r'
1231
// Transform derivatives back to physical element
1232
for (unsigned int r = 0; r < num_derivatives; r++)
1234
for (unsigned int s = 0; s < num_derivatives; s++)
1236
values[r] += transform[r][s]*derivatives[s];
1237
}// end loop over 's'
1238
}// end loop over 'r'
1240
// Delete pointer to array of derivatives on FIAT element
1241
delete [] derivatives;
1243
// Delete pointer to array of combinations of derivatives and transform
1244
for (unsigned int r = 0; r < num_derivatives; r++)
1246
delete [] combinations[r];
1247
}// end loop over 'r'
1248
delete [] combinations;
1249
for (unsigned int r = 0; r < num_derivatives; r++)
1251
delete [] transform[r];
1252
}// end loop over 'r'
1253
delete [] transform;
517
1260
/// Evaluate order n derivatives of all basis functions at given point in cell