|
1 | 1 | /// @file
|
2 |
| -/// Test GetInterp and BasisApply for a 2D Quad non-tensor H(div) basis |
3 |
| -/// \test Test GetInterp and BasisApply for a 2D Quad non-tensor H(div) basis |
| 2 | +/// Test interpolation with a 2D Quad non-tensor H(div) basis |
| 3 | +/// \test Test interpolation with a 2D Quad non-tensor H(div) basis |
4 | 4 | #include <ceed.h>
|
5 | 5 | #include <math.h>
|
6 | 6 |
|
7 | 7 | #include "t330-basis.h"
|
8 | 8 |
|
9 | 9 | int main(int argc, char **argv) {
|
10 | 10 | Ceed ceed;
|
11 |
| - const CeedInt num_nodes = 4, Q = 3, dim = 2, num_qpts = Q * Q; |
12 |
| - CeedInt num_comp = 1; // one vector componenet |
13 |
| - CeedInt P = dim * num_nodes; // dof per element! |
| 11 | + const CeedInt Q = 3, dim = 2, num_qpts = Q * Q, elem_nodes = 4; |
| 12 | + const CeedInt P = dim * elem_nodes; |
14 | 13 | CeedBasis b;
|
15 | 14 | CeedScalar q_ref[dim * num_qpts], q_weights[num_qpts];
|
16 |
| - CeedScalar div[P * num_qpts], interp[P * dim * num_qpts]; |
| 15 | + CeedScalar interp[dim * P * num_qpts], div[P * num_qpts]; |
17 | 16 | CeedVector X, Y;
|
18 |
| - const CeedScalar *y, *x; |
| 17 | + const CeedScalar *y, *x, *interp2; |
| 18 | + CeedScalar sum; |
19 | 19 |
|
20 | 20 | CeedInit(argv[1], &ceed);
|
21 | 21 |
|
22 | 22 | HdivBasisQuad(Q, q_ref, q_weights, interp, div, CEED_GAUSS);
|
23 |
| - CeedBasisCreateHdiv(ceed, CEED_TOPOLOGY_QUAD, num_comp, P, num_qpts, interp, div, q_ref, q_weights, &b); |
24 | 23 |
|
25 |
| - // Test GetInterp for H(div) |
26 |
| - const CeedScalar *interp2; |
| 24 | + CeedBasisCreateHdiv(ceed, CEED_TOPOLOGY_QUAD, 1, P, num_qpts, interp, div, q_ref, q_weights, &b); |
| 25 | + |
| 26 | + // Test interpolation for H(div) |
27 | 27 | CeedBasisGetInterp(b, &interp2);
|
28 |
| - for (CeedInt i = 0; i < P * dim * num_qpts; i++) { |
29 |
| - if (fabs(interp[i] - interp2[i]) > 100. * CEED_EPSILON) { |
30 |
| - // LCOV_EXCL_START |
31 |
| - printf("%f != %f\n", interp[i], interp2[i]); |
32 |
| - // LCOV_EXCL_STOP |
33 |
| - } |
| 28 | + for (CeedInt i = 0; i < dim * P * num_qpts; i++) { |
| 29 | + if (fabs(interp[i] - interp2[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", interp[i], interp2[i]); |
34 | 30 | }
|
35 | 31 |
|
36 | 32 | CeedVectorCreate(ceed, P, &X);
|
37 | 33 | CeedVectorSetValue(X, 1.0);
|
38 |
| - CeedVectorCreate(ceed, num_qpts * dim, &Y); |
39 |
| - CeedVectorSetValue(Y, 0.); |
40 |
| - // BasisApply for H(div): CEED_EVAL_INTERP, NOTRANSPOSE case |
| 34 | + CeedVectorCreate(ceed, dim * num_qpts, &Y); |
| 35 | + CeedVectorSetValue(Y, 0.0); |
| 36 | + |
41 | 37 | CeedBasisApply(b, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Y);
|
42 | 38 |
|
43 | 39 | CeedVectorGetArrayRead(Y, CEED_MEM_HOST, &y);
|
44 | 40 | for (CeedInt i = 0; i < dim * num_qpts; i++) {
|
45 |
| - if (fabs(q_ref[i] - y[i]) > 100. * CEED_EPSILON) { |
46 |
| - // LCOV_EXCL_START |
47 |
| - printf("%f != %f\n", q_ref[i], y[i]); |
48 |
| - // LCOV_EXCL_STOP |
49 |
| - } |
| 41 | + if (fabs(q_ref[i] - y[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", q_ref[i], y[i]); |
50 | 42 | }
|
51 | 43 | CeedVectorRestoreArrayRead(Y, &y);
|
52 | 44 |
|
53 | 45 | CeedVectorSetValue(Y, 1.0);
|
54 | 46 | CeedVectorSetValue(X, 0.0);
|
55 |
| - // BasisApply for Hdiv: CEED_EVAL_INTERP, TRANSPOSE case |
| 47 | + |
56 | 48 | CeedBasisApply(b, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, Y, X);
|
57 | 49 |
|
58 | 50 | CeedVectorGetArrayRead(X, CEED_MEM_HOST, &x);
|
59 |
| - CeedScalar sum = 0.; |
| 51 | + sum = 0.; |
60 | 52 | for (CeedInt i = 0; i < P; i++) {
|
61 | 53 | sum += x[i];
|
62 | 54 | }
|
|
0 commit comments