/// @file /// Test assembly of mass matrix operator QFunction /// \test Test assembly of mass matrix operator QFunction #include #include #include #include "t510-operator.h" int main(int argc, char **argv) { Ceed ceed; CeedElemRestriction elem_restr_x, elem_restr_u, elem_restr_qd_i, elem_restr_lin_i; CeedBasis basis_x, basis_u; CeedQFunction qf_setup, qf_mass; CeedOperator op_setup, op_mass; CeedVector q_data, X, A, u, v; const CeedScalar *a, *q; CeedInt num_elem = 6, P = 3, Q = 4, dim = 2; CeedInt nx = 3, ny = 2; CeedInt num_dofs = (nx*2+1)*(ny*2+1), num_qpts = num_elem*Q*Q; CeedInt ind_x[num_elem*P*P]; CeedScalar x[dim*num_dofs]; CeedInit(argv[1], &ceed); // DoF Coordinates for (CeedInt i=0; i 1e-9) // LCOV_EXCL_START printf("Error: A[%" CeedInt_FMT "] = %f != %f\n", i, a[i], q[i]); // LCOV_EXCL_STOP CeedVectorRestoreArrayRead(A, &a); CeedVectorRestoreArrayRead(q_data, &q); // Apply original Mass Operator CeedVectorCreate(ceed, num_dofs, &u); CeedVectorSetValue(u, 1.0); CeedVectorCreate(ceed, num_dofs, &v); CeedVectorSetValue(v, 0.0); CeedOperatorApply(op_mass, u, v, CEED_REQUEST_IMMEDIATE); // Check output CeedScalar area = 0.0; const CeedScalar *vv; CeedVectorGetArrayRead(v, CEED_MEM_HOST, &vv); for (CeedInt i=0; i 100.*CEED_EPSILON) // LCOV_EXCL_START printf("Error: True operator computed area = %f != 1.0\n", area); // LCOV_EXCL_STOP // Switch to new q_data CeedVectorGetArrayRead(A, CEED_MEM_HOST, &a); CeedVectorSetArray(q_data, CEED_MEM_HOST, CEED_COPY_VALUES, (CeedScalar *)a); CeedVectorRestoreArrayRead(A, &a); // Apply new Mass Operator CeedOperatorApply(op_mass, u, v, CEED_REQUEST_IMMEDIATE); // Check output area = 0.0; CeedVectorGetArrayRead(v, CEED_MEM_HOST, &vv); for (CeedInt i=0; i 1000.*CEED_EPSILON) // LCOV_EXCL_START printf("Error: Linearized operator computed area = %f != 1.0\n", area); // LCOV_EXCL_STOP // Cleanup CeedQFunctionDestroy(&qf_setup); CeedQFunctionDestroy(&qf_mass); CeedOperatorDestroy(&op_setup); CeedOperatorDestroy(&op_mass); CeedElemRestrictionDestroy(&elem_restr_u); CeedElemRestrictionDestroy(&elem_restr_x); CeedElemRestrictionDestroy(&elem_restr_qd_i); CeedElemRestrictionDestroy(&elem_restr_lin_i); CeedBasisDestroy(&basis_u); CeedBasisDestroy(&basis_x); CeedVectorDestroy(&X); CeedVectorDestroy(&A); CeedVectorDestroy(&q_data); CeedVectorDestroy(&u); CeedVectorDestroy(&v); CeedDestroy(&ceed); return 0; }