/// @file /// Test assembly of Poisson operator QFunction /// \test Test assembly of Poisson operator QFunction #include #include #include #include "t531-operator.h" int main(int argc, char **argv) { Ceed ceed; CeedElemRestriction Erestrictx, Erestrictu, Erestrictxi, Erestrictui, Erestrictqi, Erestrictlini; CeedBasis bx, bu; CeedQFunction qf_setup, qf_diff, qf_diff_lin; CeedOperator op_setup, op_diff, op_diff_lin; CeedVector qdata, X, A, u, v; CeedInt nelem = 6, P = 3, Q = 4, dim = 2; CeedInt nx = 3, ny = 2; CeedInt ndofs = (nx*2+1)*(ny*2+1), nqpts = nelem*Q*Q; CeedInt indx[nelem*P*P]; CeedScalar x[dim*ndofs]; CeedInit(argv[1], &ceed); // DoF Coordinates for (CeedInt i=0; i 1e-14) // LCOV_EXCL_START printf("Error: Operator computed v[i] = %f != 0.0\n", vv[i]); // LCOV_EXCL_STOP CeedVectorRestoreArrayRead(v, &vv); // Assemble QFunction CeedOperatorAssembleLinearQFunction(op_diff, &A, &Erestrictlini, CEED_REQUEST_IMMEDIATE); // QFunction - apply assembled CeedQFunctionCreateInterior(ceed, 1, diff_lin, diff_lin_loc, &qf_diff_lin); CeedQFunctionAddInput(qf_diff_lin, "du", dim, CEED_EVAL_GRAD); CeedQFunctionAddInput(qf_diff_lin, "qdata", dim*dim, CEED_EVAL_NONE); CeedQFunctionAddOutput(qf_diff_lin, "dv", dim, CEED_EVAL_GRAD); // Operator - apply assembled CeedOperatorCreate(ceed, qf_diff_lin, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_diff_lin); CeedOperatorSetField(op_diff_lin, "du", Erestrictu, CEED_NOTRANSPOSE, bu, CEED_VECTOR_ACTIVE); CeedOperatorSetField(op_diff_lin, "qdata", Erestrictlini, CEED_NOTRANSPOSE, CEED_BASIS_COLLOCATED, A); CeedOperatorSetField(op_diff_lin, "dv", Erestrictu, CEED_NOTRANSPOSE, bu, CEED_VECTOR_ACTIVE); // Apply new Poisson Operator CeedVectorSetValue(v, 0.0); CeedOperatorApply(op_diff_lin, u, v, CEED_REQUEST_IMMEDIATE); // Check output CeedVectorGetArrayRead(v, CEED_MEM_HOST, &vv); for (CeedInt i=0; i 1e-14) // LCOV_EXCL_START printf("Error: Linerized operator computed v[i] = %f != 0.0\n", vv[i]); // LCOV_EXCL_STOP CeedVectorRestoreArrayRead(v, &vv); // Cleanup CeedQFunctionDestroy(&qf_setup); CeedQFunctionDestroy(&qf_diff); CeedQFunctionDestroy(&qf_diff_lin); CeedOperatorDestroy(&op_setup); CeedOperatorDestroy(&op_diff); CeedOperatorDestroy(&op_diff_lin); CeedElemRestrictionDestroy(&Erestrictu); CeedElemRestrictionDestroy(&Erestrictx); CeedElemRestrictionDestroy(&Erestrictui); CeedElemRestrictionDestroy(&Erestrictxi); CeedElemRestrictionDestroy(&Erestrictqi); CeedElemRestrictionDestroy(&Erestrictlini); CeedBasisDestroy(&bu); CeedBasisDestroy(&bx); CeedVectorDestroy(&X); CeedVectorDestroy(&A); CeedVectorDestroy(&qdata); CeedVectorDestroy(&u); CeedVectorDestroy(&v); CeedDestroy(&ceed); return 0; }