1 /// @file
2 /// Test creation, evaluation, and destruction for QFunction
3 /// \test Test creation, evaluation, and destruction for QFunction
4 #include "t409-qfunction.h"
5
6 #include <ceed.h>
7 #include <math.h>
8 #include <stdio.h>
9
main(int argc,char ** argv)10 int main(int argc, char **argv) {
11 Ceed ceed;
12 CeedVector in[16], out[16];
13 CeedVector u, v;
14 CeedQFunction qf;
15 CeedQFunctionContext ctx;
16 CeedInt q = 8;
17 bool is_writable = true;
18 CeedScalar ctx_data[5] = {1, 2, 3, 4, 5};
19
20 CeedInit(argv[1], &ceed);
21
22 CeedVectorCreate(ceed, q, &u);
23 CeedVectorSetValue(u, 1.0);
24 CeedVectorCreate(ceed, q, &v);
25 CeedVectorSetValue(v, 0.0);
26
27 CeedQFunctionCreateInterior(ceed, 1, scale, scale_loc, &qf);
28 CeedQFunctionAddInput(qf, "u", 1, CEED_EVAL_INTERP);
29 CeedQFunctionAddOutput(qf, "v", 1, CEED_EVAL_INTERP);
30
31 CeedQFunctionContextCreate(ceed, &ctx);
32 CeedQFunctionContextSetData(ctx, CEED_MEM_HOST, CEED_COPY_VALUES, sizeof(ctx_data), &ctx_data);
33 CeedQFunctionSetContext(qf, ctx);
34 CeedQFunctionSetContextWritable(qf, is_writable);
35 {
36 in[0] = u;
37 out[0] = v;
38 CeedQFunctionApply(qf, q, in, out);
39 }
40
41 {
42 const CeedScalar *v_array;
43
44 CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
45 for (CeedInt i = 0; i < q; i++) {
46 if (fabs(v_array[i] - ctx_data[1]) > 100. * CEED_EPSILON) {
47 // LCOV_EXCL_START
48 printf("v[%" CeedInt_FMT "] %f != 2.0\n", i, v_array[i]);
49 // LCOV_EXCL_STOP
50 }
51 }
52 CeedVectorRestoreArrayRead(v, &v_array);
53 }
54
55 // Check for written context data
56 CeedScalar *ctx_data_new;
57 CeedQFunctionContextGetDataRead(ctx, CEED_MEM_HOST, &ctx_data_new);
58 if (ctx_data_new[0] != 42) {
59 // LCOV_EXCL_START
60 printf("Context data not written: %f != 42\n", ctx_data_new[0]);
61 // LCOV_EXCL_STOP
62 }
63 CeedQFunctionContextRestoreDataRead(ctx, &ctx_data_new);
64
65 // Assert that context will not be written
66 // Note: The interface cannot enforce this in user code
67 // so setting is_writable == false and then calling
68 // CeedQFunctionApply to mutate the context would lead
69 // to inconsistent data on the GPU.
70 // Only the `/cpu/self/memcheck/*` backends verify that
71 // read-only access resulted in no changes to the context data
72 CeedQFunctionContextGetData(ctx, CEED_MEM_HOST, &ctx_data_new);
73 ctx_data_new[0] = 5;
74 CeedQFunctionContextRestoreData(ctx, &ctx_data_new);
75 is_writable = false;
76 CeedQFunctionSetContextWritable(qf, is_writable);
77
78 {
79 in[0] = u;
80 out[0] = v;
81 // Will only error in `/cpu/self/memcheck/*` backends
82 CeedQFunctionApply(qf, q, in, out);
83 }
84
85 CeedVectorDestroy(&u);
86 CeedVectorDestroy(&v);
87 CeedQFunctionDestroy(&qf);
88 CeedQFunctionContextDestroy(&ctx);
89 CeedDestroy(&ceed);
90 return 0;
91 }
92