PetscErrorCode SetupElement(DM dm, AppCtx *user) { const PetscInt dim = user->dim, numFields = 2; const char *prefix[2] = {"vel_", "pres_"}; PetscInt qorder = 0, f; PetscErrorCode ierr; PetscFunctionBegin; for (f = 0; f < numFields; ++f) { PetscFE fem; DM K; PetscSpace P; PetscDualSpace Q; PetscInt order; /* Create space */ ierr = PetscSpaceCreate(PetscObjectComm((PetscObject) dm), &P);CHKERRQ(ierr); ierr = PetscObjectSetOptionsPrefix((PetscObject) P, prefix[f]);CHKERRQ(ierr); ierr = PetscSpaceSetFromOptions(P);CHKERRQ(ierr); ierr = PetscSpacePolynomialSetNumVariables(P, dim);CHKERRQ(ierr); ierr = PetscSpaceSetUp(P);CHKERRQ(ierr); ierr = PetscSpaceGetOrder(P, &order);CHKERRQ(ierr); qorder = PetscMax(qorder, order); /* Create dual space */ ierr = PetscDualSpaceCreate(PetscObjectComm((PetscObject) dm), &Q);CHKERRQ(ierr); ierr = PetscObjectSetOptionsPrefix((PetscObject) Q, prefix[f]);CHKERRQ(ierr); ierr = PetscDualSpaceCreateReferenceCell(Q, dim, PETSC_TRUE, &K);CHKERRQ(ierr); ierr = PetscDualSpaceSetDM(Q, K);CHKERRQ(ierr); ierr = DMDestroy(&K);CHKERRQ(ierr); ierr = PetscDualSpaceSetOrder(Q, order);CHKERRQ(ierr); ierr = PetscDualSpaceSetFromOptions(Q);CHKERRQ(ierr); ierr = PetscDualSpaceSetUp(Q);CHKERRQ(ierr); /* Create element */ ierr = PetscFECreate(PetscObjectComm((PetscObject) dm), &fem);CHKERRQ(ierr); ierr = PetscObjectSetOptionsPrefix((PetscObject) fem, prefix[f]);CHKERRQ(ierr); ierr = PetscFESetFromOptions(fem);CHKERRQ(ierr); ierr = PetscFESetBasisSpace(fem, P);CHKERRQ(ierr); ierr = PetscFESetDualSpace(fem, Q);CHKERRQ(ierr); ierr = PetscFESetNumComponents(fem, f ? 1 : dim);CHKERRQ(ierr); ierr = PetscSpaceDestroy(&P);CHKERRQ(ierr); ierr = PetscDualSpaceDestroy(&Q);CHKERRQ(ierr); user->fe[f] = fem; } for (f = 0; f < numFields; ++f) { PetscQuadrature q; /* Create quadrature */ ierr = PetscDTGaussJacobiQuadrature(dim, qorder, -1.0, 1.0, &q);CHKERRQ(ierr); ierr = PetscFESetQuadrature(user->fe[f], q);CHKERRQ(ierr); } user->fem.fe = user->fe; user->fem.feAux = NULL; PetscFunctionReturn(0); }
PetscErrorCode SetupElement(DM dm, AppCtx *user) { PetscFE fem; DM K; PetscSpace P; PetscDualSpace Q; PetscReal *B, *D; PetscQuadrature q; const PetscInt dim = user->dim; PetscInt order, numBasisFunc, numBasisComp; PetscErrorCode ierr; PetscFunctionBegin; /* Create space */ ierr = PetscSpaceCreate(PetscObjectComm((PetscObject) dm), &P);CHKERRQ(ierr); ierr = PetscSpaceSetFromOptions(P);CHKERRQ(ierr); ierr = PetscSpacePolynomialSetNumVariables(P, dim);CHKERRQ(ierr); ierr = PetscSpaceSetUp(P);CHKERRQ(ierr); ierr = PetscSpaceGetOrder(P, &order);CHKERRQ(ierr); /* Create dual space */ ierr = PetscDualSpaceCreate(PetscObjectComm((PetscObject) dm), &Q);CHKERRQ(ierr); ierr = PetscDualSpaceCreateReferenceCell(Q, dim, user->simplex, &K);CHKERRQ(ierr); ierr = PetscDualSpaceSetDM(Q, K);CHKERRQ(ierr); ierr = DMDestroy(&K);CHKERRQ(ierr); ierr = PetscDualSpaceSetOrder(Q, order);CHKERRQ(ierr); ierr = PetscDualSpaceSetFromOptions(Q);CHKERRQ(ierr); ierr = PetscDualSpaceSetUp(Q);CHKERRQ(ierr); /* Create quadrature */ ierr = PetscDTGaussJacobiQuadrature(dim, PetscMax(user->qorder, order), -1.0, 1.0, &q);CHKERRQ(ierr); /* Create element */ ierr = PetscFECreate(PetscObjectComm((PetscObject) dm), &fem);CHKERRQ(ierr); ierr = PetscFESetBasisSpace(fem, P);CHKERRQ(ierr); ierr = PetscFESetDualSpace(fem, Q);CHKERRQ(ierr); ierr = PetscFESetNumComponents(fem, user->numComponents);CHKERRQ(ierr); ierr = PetscFESetQuadrature(fem, q);CHKERRQ(ierr); ierr = PetscSpaceDestroy(&P);CHKERRQ(ierr); ierr = PetscDualSpaceDestroy(&Q);CHKERRQ(ierr); ierr = PetscFEGetDimension(fem, &numBasisFunc);CHKERRQ(ierr); ierr = PetscFEGetNumComponents(fem, &numBasisComp);CHKERRQ(ierr); ierr = PetscFEGetDefaultTabulation(fem, &B, &D, NULL);CHKERRQ(ierr); user->fe = fem; PetscFunctionReturn(0); }