/*@C DMMGView - prints information on a DA based multi-level preconditioner Collective on DMMG and PetscViewer Input Parameter: + dmmg - the context - viewer - the viewer Level: advanced .seealso DMMGCreate(), DMMGDestroy(), DMMGSetMatType() @*/ PetscErrorCode PETSCSNES_DLLEXPORT DMMGView(DMMG *dmmg,PetscViewer viewer) { PetscErrorCode ierr; PetscInt i,nlevels = dmmg[0]->nlevels; PetscMPIInt flag; MPI_Comm comm; PetscTruth iascii,isbinary; PetscFunctionBegin; PetscValidPointer(dmmg,1); PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2); ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); ierr = MPI_Comm_compare(comm,dmmg[0]->comm,&flag);CHKERRQ(ierr); if (flag != MPI_CONGRUENT && flag != MPI_IDENT) { SETERRQ(PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the DMMG and the PetscViewer"); } ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); if (isbinary) { for (i=0; i<nlevels; i++) { ierr = MatView(dmmg[i]->J,viewer);CHKERRQ(ierr); } for (i=1; i<nlevels; i++) { ierr = MatView(dmmg[i]->R,viewer);CHKERRQ(ierr); } } else { if (iascii) { ierr = PetscViewerASCIIPrintf(viewer,"DMMG Object with %D levels\n",nlevels);CHKERRQ(ierr); if (dmmg[0]->isctype == IS_COLORING_GLOBAL) { ierr = PetscViewerASCIIPrintf(viewer,"Using global (nonghosted) Jacobian coloring computation\n");CHKERRQ(ierr); } else { ierr = PetscViewerASCIIPrintf(viewer,"Using ghosted Jacobian coloring computation\n");CHKERRQ(ierr); } } for (i=0; i<nlevels; i++) { ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); ierr = DMView(dmmg[i]->dm,viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); } if (iascii) { ierr = PetscViewerASCIIPrintf(viewer,"Using matrix type %s\n",dmmg[nlevels-1]->mtype);CHKERRQ(ierr); } if (DMMGGetKSP(dmmg)) { ierr = KSPView(DMMGGetKSP(dmmg),viewer);CHKERRQ(ierr); } else if (DMMGGetSNES(dmmg)) { ierr = SNESView(DMMGGetSNES(dmmg),viewer);CHKERRQ(ierr); } else if (iascii) { ierr = PetscViewerASCIIPrintf(viewer,"DMMG does not have a SNES or KSP set\n");CHKERRQ(ierr); } } PetscFunctionReturn(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); }
void PETSC_STDCALL dmmggetksp_(DMMG **dmmg,KSP *x,PetscErrorCode *ierr) { *ierr = 0; *x = DMMGGetKSP(*dmmg); }