static char help[] = "Solves 1D wave equation using multigrid.\n\n"; #include #include #include extern PetscErrorCode ComputeMatrix(KSP,Mat,Mat,void*); extern PetscErrorCode ComputeRHS(KSP,Vec,void*); extern PetscErrorCode ComputeInitialSolution(DM,Vec); int main(int argc,char **argv) { PetscInt i, nlevels = 3; KSP ksp; PC pc; DM da; Vec x; PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); PetscCall(KSPCreate(PETSC_COMM_WORLD,&ksp)); PetscCall(DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_PERIODIC,64,2,1,0,&da)); PetscCall(KSPGetPC(ksp, &pc)); PetscCall(PCSetType(pc, PCMG)); PetscCall(PCMGSetLevels(pc, nlevels, NULL)); PetscCall(DMSetFromOptions(da)); PetscCall(DMSetUp(da)); PetscCall(KSPSetDM(ksp,da)); PetscCall(KSPSetComputeRHS(ksp,ComputeRHS,NULL)); PetscCall(KSPSetComputeOperators(ksp,ComputeMatrix,NULL)); { Mat R; DM *da_list,*daclist; PetscInt k; PetscCall(PetscMalloc1(nlevels,&da_list)); for (k=0; k