1cae8b89aSjeremylt /// @file 2cae8b89aSjeremylt /// Test CeedOperatorApplyAdd 3cae8b89aSjeremylt /// \test Test CeedOperatorApplyAdd 4cae8b89aSjeremylt #include <ceed.h> 5cae8b89aSjeremylt #include <stdlib.h> 6cae8b89aSjeremylt #include <math.h> 7cae8b89aSjeremylt 8cae8b89aSjeremylt #include "t500-operator.h" 9cae8b89aSjeremylt 10cae8b89aSjeremylt int main(int argc, char **argv) { 11cae8b89aSjeremylt Ceed ceed; 12*d1d35e2fSjeremylt CeedElemRestriction elem_restr_x, elem_restr_u, elem_restr_qd_i; 13*d1d35e2fSjeremylt CeedBasis basis_x, basis_u; 14cae8b89aSjeremylt CeedQFunction qf_setup, qf_mass; 15cae8b89aSjeremylt CeedOperator op_setup, op_mass; 16*d1d35e2fSjeremylt CeedVector q_data, X, U, V; 17cae8b89aSjeremylt const CeedScalar *hv; 18*d1d35e2fSjeremylt CeedInt num_elem = 15, P = 5, Q = 8; 19*d1d35e2fSjeremylt CeedInt num_nodes_x = num_elem+1, num_nodes_u = num_elem*(P-1)+1; 20*d1d35e2fSjeremylt CeedInt ind_x[num_elem*2], ind_u[num_elem*P]; 21*d1d35e2fSjeremylt CeedScalar x[num_nodes_x]; 22cae8b89aSjeremylt CeedScalar sum; 23cae8b89aSjeremylt 24cae8b89aSjeremylt CeedInit(argv[1], &ceed); 25cae8b89aSjeremylt 26*d1d35e2fSjeremylt for (CeedInt i=0; i<num_nodes_x; i++) 27*d1d35e2fSjeremylt x[i] = (CeedScalar) i / (num_nodes_x - 1); 28*d1d35e2fSjeremylt for (CeedInt i=0; i<num_elem; i++) { 29*d1d35e2fSjeremylt ind_x[2*i+0] = i; 30*d1d35e2fSjeremylt ind_x[2*i+1] = i+1; 31cae8b89aSjeremylt } 32cae8b89aSjeremylt // Restrictions 33*d1d35e2fSjeremylt CeedElemRestrictionCreate(ceed, num_elem, 2, 1, 1, num_nodes_x, CEED_MEM_HOST, 34*d1d35e2fSjeremylt CEED_USE_POINTER, ind_x, &elem_restr_x); 3515910d16Sjeremylt 36*d1d35e2fSjeremylt for (CeedInt i=0; i<num_elem; i++) { 37cae8b89aSjeremylt for (CeedInt j=0; j<P; j++) { 38*d1d35e2fSjeremylt ind_u[P*i+j] = i*(P-1) + j; 39cae8b89aSjeremylt } 40cae8b89aSjeremylt } 41*d1d35e2fSjeremylt CeedElemRestrictionCreate(ceed, num_elem, P, 1, 1, num_nodes_u, CEED_MEM_HOST, 42*d1d35e2fSjeremylt CEED_USE_POINTER, ind_u, &elem_restr_u); 43*d1d35e2fSjeremylt CeedInt strides_qd[3] = {1, Q, Q}; 44*d1d35e2fSjeremylt CeedElemRestrictionCreateStrided(ceed, num_elem, Q, 1, Q*num_elem, strides_qd, 45*d1d35e2fSjeremylt &elem_restr_qd_i); 46cae8b89aSjeremylt 47cae8b89aSjeremylt // Bases 48*d1d35e2fSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &basis_x); 49*d1d35e2fSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, P, Q, CEED_GAUSS, &basis_u); 50cae8b89aSjeremylt 51cae8b89aSjeremylt // QFunctions 52cae8b89aSjeremylt CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 53cae8b89aSjeremylt CeedQFunctionAddInput(qf_setup, "_weight", 1, CEED_EVAL_WEIGHT); 54cae8b89aSjeremylt CeedQFunctionAddInput(qf_setup, "dx", 1, CEED_EVAL_GRAD); 55cae8b89aSjeremylt CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE); 56cae8b89aSjeremylt 57cae8b89aSjeremylt CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 58cae8b89aSjeremylt CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE); 59cae8b89aSjeremylt CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP); 60cae8b89aSjeremylt CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP); 61cae8b89aSjeremylt 62cae8b89aSjeremylt // Operators 63cae8b89aSjeremylt CeedOperatorCreate(ceed, qf_setup, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 64cae8b89aSjeremylt &op_setup); 65cae8b89aSjeremylt 66cae8b89aSjeremylt CeedOperatorCreate(ceed, qf_mass, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 67cae8b89aSjeremylt &op_mass); 68cae8b89aSjeremylt 69*d1d35e2fSjeremylt CeedVectorCreate(ceed, num_nodes_x, &X); 70cae8b89aSjeremylt CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, x); 71*d1d35e2fSjeremylt CeedVectorCreate(ceed, num_elem*Q, &q_data); 72cae8b89aSjeremylt 73*d1d35e2fSjeremylt CeedOperatorSetField(op_setup, "_weight", CEED_ELEMRESTRICTION_NONE, basis_x, 7415910d16Sjeremylt CEED_VECTOR_NONE); 75*d1d35e2fSjeremylt CeedOperatorSetField(op_setup, "dx", elem_restr_x, basis_x, CEED_VECTOR_ACTIVE); 76*d1d35e2fSjeremylt CeedOperatorSetField(op_setup, "rho", elem_restr_qd_i, CEED_BASIS_COLLOCATED, 77a8d32208Sjeremylt CEED_VECTOR_ACTIVE); 78cae8b89aSjeremylt 79*d1d35e2fSjeremylt CeedOperatorSetField(op_mass, "rho", elem_restr_qd_i, CEED_BASIS_COLLOCATED, 80*d1d35e2fSjeremylt q_data); 81*d1d35e2fSjeremylt CeedOperatorSetField(op_mass, "u", elem_restr_u, basis_u, CEED_VECTOR_ACTIVE); 82*d1d35e2fSjeremylt CeedOperatorSetField(op_mass, "v", elem_restr_u, basis_u, CEED_VECTOR_ACTIVE); 83cae8b89aSjeremylt 84*d1d35e2fSjeremylt CeedOperatorApply(op_setup, X, q_data, CEED_REQUEST_IMMEDIATE); 85cae8b89aSjeremylt 86*d1d35e2fSjeremylt CeedVectorCreate(ceed, num_nodes_u, &U); 87cae8b89aSjeremylt CeedVectorSetValue(U, 1.0); 88*d1d35e2fSjeremylt CeedVectorCreate(ceed, num_nodes_u, &V); 89cae8b89aSjeremylt CeedVectorSetValue(V, 0.0); 90cae8b89aSjeremylt 91cae8b89aSjeremylt // Apply with V = 0 92cae8b89aSjeremylt CeedOperatorApplyAdd(op_mass, U, V, CEED_REQUEST_IMMEDIATE); 93cae8b89aSjeremylt 94cae8b89aSjeremylt // Check output 95cae8b89aSjeremylt CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); 96cae8b89aSjeremylt sum = 0.; 97*d1d35e2fSjeremylt for (CeedInt i=0; i<num_nodes_u; i++) 98cae8b89aSjeremylt sum += hv[i]; 99cae8b89aSjeremylt if (fabs(sum-1.)>1e-10) printf("Computed Area: %f != True Area: 1.0\n", sum); 100cae8b89aSjeremylt CeedVectorRestoreArrayRead(V, &hv); 101cae8b89aSjeremylt 102cae8b89aSjeremylt // Apply with V = 1 103cae8b89aSjeremylt CeedVectorSetValue(V, 1.0); 104cae8b89aSjeremylt CeedOperatorApplyAdd(op_mass, U, V, CEED_REQUEST_IMMEDIATE); 105cae8b89aSjeremylt 106cae8b89aSjeremylt // Check output 107cae8b89aSjeremylt CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); 108*d1d35e2fSjeremylt sum = -num_nodes_u; 109*d1d35e2fSjeremylt for (CeedInt i=0; i<num_nodes_u; i++) 110cae8b89aSjeremylt sum += hv[i]; 111cae8b89aSjeremylt if (fabs(sum-(1.))>1e-10) printf("Computed Area: %f != True Area: 1.0\n", sum); 112cae8b89aSjeremylt CeedVectorRestoreArrayRead(V, &hv); 113cae8b89aSjeremylt 114cae8b89aSjeremylt CeedQFunctionDestroy(&qf_setup); 115cae8b89aSjeremylt CeedQFunctionDestroy(&qf_mass); 116cae8b89aSjeremylt CeedOperatorDestroy(&op_setup); 117cae8b89aSjeremylt CeedOperatorDestroy(&op_mass); 118*d1d35e2fSjeremylt CeedElemRestrictionDestroy(&elem_restr_u); 119*d1d35e2fSjeremylt CeedElemRestrictionDestroy(&elem_restr_x); 120*d1d35e2fSjeremylt CeedElemRestrictionDestroy(&elem_restr_qd_i); 121*d1d35e2fSjeremylt CeedBasisDestroy(&basis_u); 122*d1d35e2fSjeremylt CeedBasisDestroy(&basis_x); 123cae8b89aSjeremylt CeedVectorDestroy(&X); 124cae8b89aSjeremylt CeedVectorDestroy(&U); 125cae8b89aSjeremylt CeedVectorDestroy(&V); 126*d1d35e2fSjeremylt CeedVectorDestroy(&q_data); 127cae8b89aSjeremylt CeedDestroy(&ceed); 128cae8b89aSjeremylt return 0; 129cae8b89aSjeremylt } 130