|
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 | #include <stdio.h>
|
|
9 | 9 |
|
10 | 10 | int main(int argc, char **argv) {
|
11 | 11 | Ceed ceed;
|
12 |
| - const CeedInt num_nodes = 4, q = 3, dim = 2, num_qpts = q * q; |
13 |
| - CeedInt num_comp = 1; // one vector component |
14 |
| - CeedInt p = dim * num_nodes; // DoF per element |
| 12 | + CeedVector u, v; |
| 13 | + const CeedInt p = 8, q = 3, dim = 2, num_qpts = q * q; |
15 | 14 | CeedBasis basis;
|
16 | 15 | CeedScalar q_ref[dim * num_qpts], q_weights[num_qpts];
|
17 |
| - CeedScalar div[p * num_qpts], interp[p * dim * num_qpts]; |
18 |
| - CeedVector u, v; |
| 16 | + CeedScalar interp[dim * p * num_qpts], div[p * num_qpts]; |
19 | 17 |
|
20 | 18 | CeedInit(argv[1], &ceed);
|
21 | 19 |
|
22 | 20 | BuildHdivQuadrilateral(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, &basis); |
| 21 | + CeedBasisCreateHdiv(ceed, CEED_TOPOLOGY_QUAD, 1, p, num_qpts, interp, div, q_ref, q_weights, &basis); |
24 | 22 |
|
25 |
| - // Test GetInterp for H(div) |
| 23 | + // Test interpolation for H(div) |
26 | 24 | {
|
27 |
| - const CeedScalar *interp_2; |
28 |
| - CeedBasisGetInterp(basis, &interp_2); |
29 |
| - for (CeedInt i = 0; i < p * dim * num_qpts; i++) { |
30 |
| - if (fabs(interp[i] - interp_2[i]) > 100. * CEED_EPSILON) { |
31 |
| - // LCOV_EXCL_START |
32 |
| - printf("%f != %f\n", interp[i], interp_2[i]); |
33 |
| - // LCOV_EXCL_STOP |
34 |
| - } |
| 25 | + const CeedScalar *interp_in_basis; |
| 26 | + |
| 27 | + CeedBasisGetInterp(basis, &interp_in_basis); |
| 28 | + for (CeedInt i = 0; i < dim * p * num_qpts; i++) { |
| 29 | + if (fabs(interp[i] - interp_in_basis[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", interp[i], interp_in_basis[i]); |
35 | 30 | }
|
36 | 31 | }
|
37 | 32 |
|
38 | 33 | CeedVectorCreate(ceed, p, &u);
|
39 | 34 | CeedVectorSetValue(u, 1.0);
|
40 |
| - CeedVectorCreate(ceed, num_qpts * dim, &v); |
41 |
| - CeedVectorSetValue(v, 0.); |
| 35 | + CeedVectorCreate(ceed, dim * num_qpts, &v); |
| 36 | + CeedVectorSetValue(v, 0.0); |
42 | 37 |
|
43 |
| - // BasisApply for H(div): CEED_EVAL_INTERP, NOTRANSPOSE case |
44 | 38 | CeedBasisApply(basis, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, u, v);
|
45 | 39 |
|
46 | 40 | {
|
47 | 41 | const CeedScalar *v_array;
|
48 | 42 |
|
49 | 43 | CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
|
50 | 44 | for (CeedInt i = 0; i < dim * num_qpts; i++) {
|
51 |
| - if (fabs(q_ref[i] - v_array[i]) > 100. * CEED_EPSILON) { |
52 |
| - // LCOV_EXCL_START |
53 |
| - printf("%f != %f\n", q_ref[i], v_array[i]); |
54 |
| - // LCOV_EXCL_STOP |
55 |
| - } |
| 45 | + if (fabs(q_ref[i] - v_array[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", q_ref[i], v_array[i]); |
56 | 46 | }
|
57 | 47 | CeedVectorRestoreArrayRead(v, &v_array);
|
58 | 48 | }
|
59 | 49 |
|
60 | 50 | CeedVectorSetValue(v, 1.0);
|
61 | 51 | CeedVectorSetValue(u, 0.0);
|
62 | 52 |
|
63 |
| - // BasisApply for Hdiv: CEED_EVAL_INTERP, TRANSPOSE case |
64 | 53 | CeedBasisApply(basis, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, v, u);
|
65 | 54 |
|
66 | 55 | {
|
|
0 commit comments