int main(int argc,char **argv) { PetscErrorCode ierr; ADDA adda; PetscInt nodes[4] = {20, 20, 10, 10}; PetscBool periodic[4] = {PETSC_TRUE, PETSC_TRUE, PETSC_FALSE, PETSC_FALSE}; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); /* Create distributed array and get vectors */ ierr = DMADDACreate(PETSC_COMM_WORLD, 4, nodes, PETSC_NULL, 2, periodic, &adda);CHKERRQ(ierr); /* Free memory */ ierr = DMDestroy(&adda);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
PetscErrorCode DMCoarsen_ADDA(DM dm, MPI_Comm comm,DM *dmc) { PetscErrorCode ierr; PetscInt *nodesc; PetscInt dofc; PetscInt i; DM_ADDA *dd = (DM_ADDA*)dm->data; PetscFunctionBegin; PetscValidHeaderSpecific(dm, DM_CLASSID, 1); PetscValidPointer(dmc, 3); ierr = PetscMalloc(dd->dim*sizeof(PetscInt), &nodesc);CHKERRQ(ierr); for (i=0; i<dd->dim; i++) { nodesc[i] = (dd->nodes[i] % dd->refine[i]) ? dd->nodes[i] / dd->refine[i] + 1 : dd->nodes[i] / dd->refine[i]; } dofc = (dd->dof % dd->dofrefine) ? dd->dof / dd->dofrefine + 1 : dd->dof / dd->dofrefine; ierr = DMADDACreate(PetscObjectComm((PetscObject)dm), dd->dim, nodesc, dd->procs, dofc, dd->periodic, dmc);CHKERRQ(ierr); ierr = PetscFree(nodesc);CHKERRQ(ierr); /* copy refinement factors */ ierr = DMADDASetRefinement(*dmc, dd->refine, dd->dofrefine);CHKERRQ(ierr); PetscFunctionReturn(0); }