void createMG(LocalData* data) { assert(data != NULL); int nlevels = 1; PetscOptionsGetInt(PETSC_NULL, "-nlevels", &nlevels, PETSC_NULL); int coarseSize = 1 + (((data->N) - 1)>>(nlevels - 1)); int rank; MPI_Comm_rank((data->commAll), &rank); if(!rank) { std::cout<<"nlevels = "<<nlevels<<std::endl; std::cout<<"coarseSize = "<<coarseSize<<std::endl; } DMMGCreate(PETSC_COMM_SELF, -nlevels, PETSC_NULL, &(data->mgObj)); DMMGSetOptionsPrefix(data->mgObj, "loc_"); DA da; DACreate2d(PETSC_COMM_SELF, DA_NONPERIODIC, DA_STENCIL_BOX, coarseSize, coarseSize, PETSC_DECIDE, PETSC_DECIDE, (data->dofsPerNode), 1, PETSC_NULL, PETSC_NULL, &da); DMMGSetDM((data->mgObj), (DM)da); DADestroy(da); DMMGSetKSP((data->mgObj), PETSC_NULL, &computeMGmatrix); PetscObjectIncrementTabLevel((PetscObject)(DMMGGetKSP(data->mgObj)), PETSC_NULL, 2); }
/* Setup for the custom preconditioner */ PetscErrorCode MyPCSetUp(PC pc) { AppCtx *app; PetscErrorCode ierr; DA da; PetscFunctionBegin; ierr = PCShellGetContext(pc,(void**)&app); CHKERRQ(ierr); /* create the linear solver for the Neutron diffusion */ ierr = DMMGCreate(app->comm,1,0,&app->fdmmg); CHKERRQ(ierr); ierr = DMMGSetOptionsPrefix(app->fdmmg,"phi_"); CHKERRQ(ierr); ierr = DMMGSetUser(app->fdmmg,0,app); CHKERRQ(ierr); ierr = DACreate2d(app->comm,DA_NONPERIODIC,DA_STENCIL_STAR,app->nxv,app->nyvf,PETSC_DETERMINE,1,1,1,0,0,&da); CHKERRQ(ierr); ierr = DMMGSetDM(app->fdmmg,(DM)da); CHKERRQ(ierr); ierr = DMMGSetKSP(app->fdmmg,PETSC_NULL,MyFormMatrix); CHKERRQ(ierr); app->dx = DMMGGetRHS(app->fdmmg); app->dy = DMMGGetx(app->fdmmg); ierr = VecDuplicate(app->dy,&app->c); CHKERRQ(ierr); ierr = DADestroy(da); CHKERRQ(ierr); PetscFunctionReturn(0); }
void InitializeDMMGSolver(State *BHD) { PC pc; DMMG *dmmg; int l; DMMGCreate(PETSC_COMM_WORLD,2,PETSC_NULL,&dmmg); DMMGSetDM(dmmg,(DM)BHD->da_dmmg); DADestroy(BHD->da_dmmg); for (l = 0; l < DMMGGetLevels(dmmg); l++) { DMMGSetUser(dmmg,l,(void*) BHD); } DMMGSetKSP(dmmg,ComputeRHSDMMG,InitializeLaplaceMatrix); BHD->dmmg = dmmg; }