/// @file /// Test CeedOperatorApplyAdd for composite operator /// \test CeedOperatorApplyAdd for composite operator #include #include #include #include "t320-basis.h" #include "t510-operator.h" /* The mesh comprises of two rows of 3 quadralaterals followed by one row of 6 triangles: _ _ _ |_|_|_| |_|_|_| |/|/|/| */ int main(int argc, char **argv) { Ceed ceed; CeedElemRestriction elem_restr_x_tet, elem_restr_u_tet, elem_restr_qd_i_tet, elem_restr_x_hex, elem_restr_u_hex, elem_restr_qd_i_hex; CeedBasis basis_x_tet, basis_u_tet, basis_x_hex, basis_u_hex; CeedQFunction qf_setup_tet, qf_mass_tet, qf_setup_hex, qf_mass_hex; CeedOperator op_setup_tet, op_mass_tet, op_setup_hex, op_mass_hex, op_setup, op_mass; CeedVector q_data_tet, q_data_hex, X, U, V; const CeedScalar *hv; CeedInt nelem_tet = 6, P_tet = 6, Q_tet = 4, nelem_hex = 6, P_hex = 3, Q_hex = 4, dim = 2; CeedInt nx = 3, ny = 3, nx_tet = 3, ny_tet = 1, nx_hex = 3; CeedInt row, col, offset; CeedInt num_dofs = (nx*2+1)*(ny*2+1), num_qpts_tet = nelem_tet*Q_tet, num_qpts_hex = nelem_hex*Q_hex*Q_hex; CeedInt ind_x_tet[nelem_tet*P_tet], ind_x_hex[nelem_hex*P_hex*P_hex]; CeedScalar x[dim*num_dofs]; CeedScalar q_ref[dim*Q_tet], q_weight[Q_tet]; CeedScalar interp[P_tet*Q_tet], grad[dim*P_tet*Q_tet]; CeedScalar sum; CeedInit(argv[1], &ceed); // DoF Coordinates for (CeedInt i=0; i1000.*CEED_EPSILON) // LCOV_EXCL_START printf("Computed Area: %f != True Area: 1.0\n", sum); // LCOV_EXCL_STOP CeedVectorRestoreArrayRead(V, &hv); // Apply Add CeedVectorSetValue(V, 1.0); CeedOperatorApplyAdd(op_mass, U, V, CEED_REQUEST_IMMEDIATE); // Check output CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); sum = -num_dofs; for (CeedInt i=0; i1000.*CEED_EPSILON) // LCOV_EXCL_START printf("Computed Area: %f != True Area: 1.0\n", sum); // LCOV_EXCL_STOP CeedVectorRestoreArrayRead(V, &hv); // Cleanup CeedQFunctionDestroy(&qf_setup_tet); CeedQFunctionDestroy(&qf_mass_tet); CeedOperatorDestroy(&op_setup_tet); CeedOperatorDestroy(&op_mass_tet); CeedQFunctionDestroy(&qf_setup_hex); CeedQFunctionDestroy(&qf_mass_hex); CeedOperatorDestroy(&op_setup_hex); CeedOperatorDestroy(&op_mass_hex); CeedOperatorDestroy(&op_setup); CeedOperatorDestroy(&op_mass); CeedElemRestrictionDestroy(&elem_restr_u_tet); CeedElemRestrictionDestroy(&elem_restr_x_tet); CeedElemRestrictionDestroy(&elem_restr_qd_i_tet); CeedElemRestrictionDestroy(&elem_restr_u_hex); CeedElemRestrictionDestroy(&elem_restr_x_hex); CeedElemRestrictionDestroy(&elem_restr_qd_i_hex); CeedBasisDestroy(&basis_u_tet); CeedBasisDestroy(&basis_x_tet); CeedBasisDestroy(&basis_u_hex); CeedBasisDestroy(&basis_x_hex); CeedVectorDestroy(&X); CeedVectorDestroy(&U); CeedVectorDestroy(&V); CeedVectorDestroy(&q_data_tet); CeedVectorDestroy(&q_data_hex); CeedDestroy(&ceed); return 0; }