Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
/*
   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);
}
Exemplo n.º 3
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;
}