int main(int argc, char **argv) { Mat A; KSP ksp; DM shell; Vec *left, *right; MPI_Comm c; PetscErrorCode ierr; ierr = PetscInitialize(&argc, &argv, NULL, NULL);if (ierr) return ierr; c = PETSC_COMM_WORLD; ierr = MatCreate(c, &A); CHKERRQ(ierr); ierr = MatSetSizes(A, 1, 1, PETSC_DECIDE, PETSC_DECIDE); CHKERRQ(ierr); ierr = MatSetFromOptions(A); CHKERRQ(ierr); ierr = MatSetUp(A); CHKERRQ(ierr); ierr = KSPCreate(c, &ksp); CHKERRQ(ierr); ierr = KSPSetOperators(ksp, A, A); CHKERRQ(ierr); ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr); ierr = DMShellCreate(c, &shell); CHKERRQ(ierr); ierr = DMSetFromOptions(shell); CHKERRQ(ierr); ierr = DMSetUp(shell); CHKERRQ(ierr); ierr = KSPSetDM(ksp, shell); CHKERRQ(ierr); ierr = KSPCreateVecs(ksp, 1, &right, 1, &left); CHKERRQ(ierr); ierr = VecView(right[0], PETSC_VIEWER_STDOUT_(c));CHKERRQ(ierr); ierr = VecDestroyVecs(1,&right); CHKERRQ(ierr); ierr = VecDestroyVecs(1,&left); CHKERRQ(ierr); ierr = DMDestroy(&shell); CHKERRQ(ierr); ierr = KSPDestroy(&ksp); CHKERRQ(ierr); ierr = MatDestroy(&A); CHKERRQ(ierr); PetscFinalize(); return 0; }
PetscErrorCode DMCreateSubDM_Shell(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) { PetscErrorCode ierr; PetscFunctionBegin; if (subdm) {ierr = DMShellCreate(PetscObjectComm((PetscObject) dm), subdm);CHKERRQ(ierr);} ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ KSPGetDM - Gets the DM that may be used by some preconditioners Not Collective Input Parameter: . ksp - the preconditioner context Output Parameter: . dm - the dm Level: intermediate .seealso: KSPSetDM(), KSPSetDMActive() @*/ PetscErrorCode KSPGetDM(KSP ksp,DM *dm) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_CLASSID,1); if (!ksp->dm) { ierr = DMShellCreate(PetscObjectComm((PetscObject)ksp),&ksp->dm);CHKERRQ(ierr); ksp->dmAuto = PETSC_TRUE; } *dm = ksp->dm; PetscFunctionReturn(0); }
static PetscErrorCode MyDMShellCreate(MPI_Comm comm,DM da,DM *shell) { PetscErrorCode ierr; ierr = DMShellCreate(comm,shell);CHKERRQ(ierr); ierr = DMShellSetContext(*shell,da);CHKERRQ(ierr); ierr = DMShellSetCreateMatrix(*shell,CreateMatrix);CHKERRQ(ierr); ierr = DMShellSetCreateGlobalVector(*shell,CreateGlobalVector);CHKERRQ(ierr); ierr = DMShellSetCreateLocalVector(*shell,CreateLocalVector);CHKERRQ(ierr); ierr = DMShellSetRefine(*shell,Refine);CHKERRQ(ierr); ierr = DMShellSetCoarsen(*shell,Coarsen);CHKERRQ(ierr); ierr = DMShellSetCreateInterpolation(*shell,CreateInterpolation);CHKERRQ(ierr); ierr = DMShellSetCreateRestriction(*shell,CreateRestriction);CHKERRQ(ierr); return 0; }