1a8de75f0Sjeremylt /// @file 2361afa9aSjeremylt /// Test creation, action, and destruction for mass matrix operator 3361afa9aSjeremylt /// \test Test creation, action, and destruction for mass matrix operator 4a8de75f0Sjeremylt #include <ceed.h> 5a8de75f0Sjeremylt #include <math.h> 6*2b730f8bSJeremy L Thompson #include <stdlib.h> 7a8de75f0Sjeremylt 8a05f9790Sjeremylt #include "t500-operator.h" 9a8de75f0Sjeremylt 10a8de75f0Sjeremylt int main(int argc, char **argv) { 11a8de75f0Sjeremylt Ceed ceed; 12d1d35e2fSjeremylt CeedElemRestriction elem_restr_x, elem_restr_u, elem_restr_qd_i; 13d1d35e2fSjeremylt CeedBasis basis_x, basis_u; 14a8de75f0Sjeremylt CeedQFunction qf_setup, qf_mass; 15a8de75f0Sjeremylt CeedOperator op_setup, op_mass; 16d1d35e2fSjeremylt CeedVector q_data, X, U, V; 17a8de75f0Sjeremylt const CeedScalar *hv; 18d1d35e2fSjeremylt CeedInt num_elem = 15, P = 5, Q = 8; 19d1d35e2fSjeremylt CeedInt num_nodes_x = num_elem + 1, num_nodes_u = num_elem * (P - 1) + 1; 20d1d35e2fSjeremylt CeedInt ind_x[num_elem * 2], ind_u[num_elem * P]; 21d1d35e2fSjeremylt CeedScalar x[num_nodes_x]; 22a8de75f0Sjeremylt CeedScalar sum; 23a8de75f0Sjeremylt 24a8de75f0Sjeremylt CeedInit(argv[1], &ceed); 25288c0443SJeremy L Thompson 26*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < num_nodes_x; i++) x[i] = (CeedScalar)i / (num_nodes_x - 1); 27d1d35e2fSjeremylt for (CeedInt i = 0; i < num_elem; i++) { 28d1d35e2fSjeremylt ind_x[2 * i + 0] = i; 29d1d35e2fSjeremylt ind_x[2 * i + 1] = i + 1; 30a8de75f0Sjeremylt } 31a8de75f0Sjeremylt // Restrictions 32*2b730f8bSJeremy L Thompson CeedElemRestrictionCreate(ceed, num_elem, 2, 1, 1, num_nodes_x, CEED_MEM_HOST, CEED_USE_POINTER, ind_x, &elem_restr_x); 33a8de75f0Sjeremylt 34d1d35e2fSjeremylt for (CeedInt i = 0; i < num_elem; i++) { 35a8de75f0Sjeremylt for (CeedInt j = 0; j < P; j++) { 36d1d35e2fSjeremylt ind_u[P * i + j] = i * (P - 1) + j; 37a8de75f0Sjeremylt } 38a8de75f0Sjeremylt } 39*2b730f8bSJeremy L Thompson CeedElemRestrictionCreate(ceed, num_elem, P, 1, 1, num_nodes_u, CEED_MEM_HOST, CEED_USE_POINTER, ind_u, &elem_restr_u); 40d1d35e2fSjeremylt CeedInt strides_qd[3] = {1, Q, Q}; 41*2b730f8bSJeremy L Thompson CeedElemRestrictionCreateStrided(ceed, num_elem, Q, 1, Q * num_elem, strides_qd, &elem_restr_qd_i); 42a8de75f0Sjeremylt 43a8de75f0Sjeremylt // Bases 44d1d35e2fSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &basis_x); 45d1d35e2fSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, P, Q, CEED_GAUSS, &basis_u); 46a8de75f0Sjeremylt 47a8de75f0Sjeremylt // QFunctions 484d537eeaSYohann CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 49a61c78d6SJeremy L Thompson CeedQFunctionAddInput(qf_setup, "weight", 1, CEED_EVAL_WEIGHT); 504d537eeaSYohann CeedQFunctionAddInput(qf_setup, "dx", 1, CEED_EVAL_GRAD); 51a8de75f0Sjeremylt CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE); 52a8de75f0Sjeremylt 534d537eeaSYohann CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 54a8de75f0Sjeremylt CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE); 55a8de75f0Sjeremylt CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP); 56a8de75f0Sjeremylt CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP); 57a8de75f0Sjeremylt 58a8de75f0Sjeremylt // Operators 59*2b730f8bSJeremy L Thompson CeedOperatorCreate(ceed, qf_setup, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_setup); 60a8de75f0Sjeremylt 61*2b730f8bSJeremy L Thompson CeedOperatorCreate(ceed, qf_mass, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_mass); 62a8de75f0Sjeremylt 63d1d35e2fSjeremylt CeedVectorCreate(ceed, num_nodes_x, &X); 64a8de75f0Sjeremylt CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, x); 65d1d35e2fSjeremylt CeedVectorCreate(ceed, num_elem * Q, &q_data); 66a8de75f0Sjeremylt 67*2b730f8bSJeremy L Thompson CeedOperatorSetField(op_setup, "weight", CEED_ELEMRESTRICTION_NONE, basis_x, CEED_VECTOR_NONE); 68d1d35e2fSjeremylt CeedOperatorSetField(op_setup, "dx", elem_restr_x, basis_x, CEED_VECTOR_ACTIVE); 69*2b730f8bSJeremy L Thompson CeedOperatorSetField(op_setup, "rho", elem_restr_qd_i, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE); 70a8de75f0Sjeremylt 71*2b730f8bSJeremy L Thompson CeedOperatorSetField(op_mass, "rho", elem_restr_qd_i, CEED_BASIS_COLLOCATED, q_data); 72d1d35e2fSjeremylt CeedOperatorSetField(op_mass, "u", elem_restr_u, basis_u, CEED_VECTOR_ACTIVE); 73d1d35e2fSjeremylt CeedOperatorSetField(op_mass, "v", elem_restr_u, basis_u, CEED_VECTOR_ACTIVE); 74a8de75f0Sjeremylt 75d1d35e2fSjeremylt CeedOperatorApply(op_setup, X, q_data, CEED_REQUEST_IMMEDIATE); 76a8de75f0Sjeremylt 77d1d35e2fSjeremylt CeedVectorCreate(ceed, num_nodes_u, &U); 78a8de75f0Sjeremylt CeedVectorSetValue(U, 1.0); 79d1d35e2fSjeremylt CeedVectorCreate(ceed, num_nodes_u, &V); 80a8de75f0Sjeremylt CeedOperatorApply(op_mass, U, V, CEED_REQUEST_IMMEDIATE); 81a8de75f0Sjeremylt 82a8de75f0Sjeremylt // Check output 83a8de75f0Sjeremylt CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); 84a8de75f0Sjeremylt sum = 0.; 85*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < num_nodes_u; i++) sum += hv[i]; 86*2b730f8bSJeremy L Thompson if (fabs(sum - 1.) > 1000. * CEED_EPSILON) printf("Computed Area: %f != True Area: 1.0\n", sum); 87a8de75f0Sjeremylt CeedVectorRestoreArrayRead(V, &hv); 88a8de75f0Sjeremylt 89a8de75f0Sjeremylt CeedQFunctionDestroy(&qf_setup); 90a8de75f0Sjeremylt CeedQFunctionDestroy(&qf_mass); 91a8de75f0Sjeremylt CeedOperatorDestroy(&op_setup); 92a8de75f0Sjeremylt CeedOperatorDestroy(&op_mass); 93d1d35e2fSjeremylt CeedElemRestrictionDestroy(&elem_restr_u); 94d1d35e2fSjeremylt CeedElemRestrictionDestroy(&elem_restr_x); 95d1d35e2fSjeremylt CeedElemRestrictionDestroy(&elem_restr_qd_i); 96d1d35e2fSjeremylt CeedBasisDestroy(&basis_u); 97d1d35e2fSjeremylt CeedBasisDestroy(&basis_x); 98a8de75f0Sjeremylt CeedVectorDestroy(&X); 99a8de75f0Sjeremylt CeedVectorDestroy(&U); 100a8de75f0Sjeremylt CeedVectorDestroy(&V); 101d1d35e2fSjeremylt CeedVectorDestroy(&q_data); 102a8de75f0Sjeremylt CeedDestroy(&ceed); 103a8de75f0Sjeremylt return 0; 104a8de75f0Sjeremylt } 105