1ccec5866SJeremy L Thompson /// @file 2ccec5866SJeremy L Thompson /// Test QFunction helper macro 3ccec5866SJeremy L Thompson /// \test Test QFunction helper macro 4*2b730f8bSJeremy L Thompson #include "t406-qfunction.h" 5*2b730f8bSJeremy L Thompson 6ccec5866SJeremy L Thompson #include <ceed.h> 7ccec5866SJeremy L Thompson #include <math.h> 8ccec5866SJeremy L Thompson #include <stdlib.h> 9ccec5866SJeremy L Thompson #include <string.h> 10ccec5866SJeremy L Thompson 11ccec5866SJeremy L Thompson int main(int argc, char **argv) { 12ccec5866SJeremy L Thompson Ceed ceed; 13ccec5866SJeremy L Thompson CeedVector in[16], out[16]; 14ccec5866SJeremy L Thompson CeedVector Q_data, W, U, V; 15ccec5866SJeremy L Thompson CeedQFunction qf_setup, qf_mass; 16ccec5866SJeremy L Thompson CeedInt Q = 8; 17ccec5866SJeremy L Thompson const CeedScalar *vv; 18ccec5866SJeremy L Thompson CeedScalar w[Q], u[Q], v[Q]; 19ccec5866SJeremy L Thompson 20ccec5866SJeremy L Thompson CeedInit(argv[1], &ceed); 21ccec5866SJeremy L Thompson 22ccec5866SJeremy L Thompson CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 23ccec5866SJeremy L Thompson CeedQFunctionAddInput(qf_setup, "w", 1, CEED_EVAL_WEIGHT); 24ccec5866SJeremy L Thompson CeedQFunctionAddOutput(qf_setup, "qdata", 1, CEED_EVAL_NONE); 25ccec5866SJeremy L Thompson 26ccec5866SJeremy L Thompson CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 27ccec5866SJeremy L Thompson CeedQFunctionAddInput(qf_mass, "qdata", 1, CEED_EVAL_NONE); 28ccec5866SJeremy L Thompson CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP); 29ccec5866SJeremy L Thompson CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP); 30ccec5866SJeremy L Thompson 31ccec5866SJeremy L Thompson for (CeedInt i = 0; i < Q; i++) { 32ccec5866SJeremy L Thompson CeedScalar x = 2. * i / (Q - 1) - 1; 33ccec5866SJeremy L Thompson w[i] = 1 - x * x; 34ccec5866SJeremy L Thompson u[i] = 2 + 3 * x + 5 * x * x; 35ccec5866SJeremy L Thompson v[i] = w[i] * u[i]; 36ccec5866SJeremy L Thompson } 37ccec5866SJeremy L Thompson 38ccec5866SJeremy L Thompson CeedVectorCreate(ceed, Q, &W); 39ccec5866SJeremy L Thompson CeedVectorSetArray(W, CEED_MEM_HOST, CEED_USE_POINTER, w); 40ccec5866SJeremy L Thompson CeedVectorCreate(ceed, Q, &U); 41ccec5866SJeremy L Thompson CeedVectorSetArray(U, CEED_MEM_HOST, CEED_USE_POINTER, u); 42ccec5866SJeremy L Thompson CeedVectorCreate(ceed, Q, &V); 43ccec5866SJeremy L Thompson CeedVectorSetValue(V, 0); 44ccec5866SJeremy L Thompson CeedVectorCreate(ceed, Q, &Q_data); 45ccec5866SJeremy L Thompson CeedVectorSetValue(Q_data, 0); 46ccec5866SJeremy L Thompson 47ccec5866SJeremy L Thompson { 48ccec5866SJeremy L Thompson in[0] = W; 49ccec5866SJeremy L Thompson out[0] = Q_data; 50ccec5866SJeremy L Thompson CeedQFunctionApply(qf_setup, Q, in, out); 51ccec5866SJeremy L Thompson } 52ccec5866SJeremy L Thompson { 53ccec5866SJeremy L Thompson in[0] = W; 54ccec5866SJeremy L Thompson in[1] = U; 55ccec5866SJeremy L Thompson out[0] = V; 56ccec5866SJeremy L Thompson CeedQFunctionApply(qf_mass, Q, in, out); 57ccec5866SJeremy L Thompson } 58ccec5866SJeremy L Thompson 59ccec5866SJeremy L Thompson CeedVectorGetArrayRead(V, CEED_MEM_HOST, &vv); 60*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < Q; i++) { 61*2b730f8bSJeremy L Thompson if (fabs(5 * v[i] * sqrt(2.) - vv[i]) > 1E3 * CEED_EPSILON) printf("[%" CeedInt_FMT "] v %f != vv %f\n", i, 5 * v[i] * sqrt(2.), vv[i]); 62*2b730f8bSJeremy L Thompson } 63ccec5866SJeremy L Thompson CeedVectorRestoreArrayRead(V, &vv); 64ccec5866SJeremy L Thompson 65ccec5866SJeremy L Thompson CeedVectorDestroy(&W); 66ccec5866SJeremy L Thompson CeedVectorDestroy(&U); 67ccec5866SJeremy L Thompson CeedVectorDestroy(&V); 68ccec5866SJeremy L Thompson CeedVectorDestroy(&Q_data); 69ccec5866SJeremy L Thompson CeedQFunctionDestroy(&qf_setup); 70ccec5866SJeremy L Thompson CeedQFunctionDestroy(&qf_mass); 71ccec5866SJeremy L Thompson CeedDestroy(&ceed); 72ccec5866SJeremy L Thompson return 0; 73ccec5866SJeremy L Thompson } 74