PetscErrorCode PCGAMGCoarsen_Classical(PC pc,Mat *G,PetscCoarsenData **agg_lists) { PetscErrorCode ierr; MatCoarsen crs; MPI_Comm fcomm = ((PetscObject)pc)->comm; PetscFunctionBegin; /* construct the graph if necessary */ if (!G) { SETERRQ(fcomm,PETSC_ERR_ARG_WRONGSTATE,"Must set Graph in PC in PCGAMG before coarsening"); } ierr = MatCoarsenCreate(fcomm,&crs);CHKERRQ(ierr); ierr = MatCoarsenSetFromOptions(crs);CHKERRQ(ierr); ierr = MatCoarsenSetAdjacency(crs,*G);CHKERRQ(ierr); ierr = MatCoarsenSetStrictAggs(crs,PETSC_TRUE);CHKERRQ(ierr); ierr = MatCoarsenApply(crs);CHKERRQ(ierr); ierr = MatCoarsenGetData(crs,agg_lists);CHKERRQ(ierr); ierr = MatCoarsenDestroy(&crs);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PCGAMGcoarsen_GEO(PC a_pc,Mat *a_Gmat,PetscCoarsenData **a_llist_parent) { PetscErrorCode ierr; PC_MG *mg = (PC_MG*)a_pc->data; PC_GAMG *pc_gamg = (PC_GAMG*)mg->innerctx; PetscInt Istart,Iend,nloc,kk,Ii,ncols; PetscMPIInt rank,size; IS perm; GAMGNode *gnodes; PetscInt *permute; Mat Gmat = *a_Gmat; MPI_Comm comm; MatCoarsen crs; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)a_pc,&comm);CHKERRQ(ierr); #if defined PETSC_USE_LOG ierr = PetscLogEventBegin(PC_GAMGCoarsen_GEO,0,0,0,0);CHKERRQ(ierr); #endif ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); ierr = MatGetOwnershipRange(Gmat, &Istart, &Iend);CHKERRQ(ierr); nloc = (Iend-Istart); /* create random permutation with sort for geo-mg */ ierr = PetscMalloc1(nloc, &gnodes);CHKERRQ(ierr); ierr = PetscMalloc1(nloc, &permute);CHKERRQ(ierr); for (Ii=Istart; Ii<Iend; Ii++) { /* locals only? */ ierr = MatGetRow(Gmat,Ii,&ncols,0,0);CHKERRQ(ierr); { PetscInt lid = Ii - Istart; gnodes[lid].lid = lid; gnodes[lid].degree = ncols; } ierr = MatRestoreRow(Gmat,Ii,&ncols,0,0);CHKERRQ(ierr); } /* randomize */ srand(1); /* make deterministic */ if (PETSC_TRUE) { PetscBool *bIndexSet; ierr = PetscMalloc1(nloc, &bIndexSet);CHKERRQ(ierr); for (Ii = 0; Ii < nloc; Ii++) bIndexSet[Ii] = PETSC_FALSE; for (Ii = 0; Ii < nloc; Ii++) { PetscInt iSwapIndex = rand()%nloc; if (!bIndexSet[iSwapIndex] && iSwapIndex != Ii) { GAMGNode iTemp = gnodes[iSwapIndex]; gnodes[iSwapIndex] = gnodes[Ii]; gnodes[Ii] = iTemp; bIndexSet[Ii] = PETSC_TRUE; bIndexSet[iSwapIndex] = PETSC_TRUE; } } ierr = PetscFree(bIndexSet);CHKERRQ(ierr); } /* only sort locals */ qsort(gnodes, nloc, sizeof(GAMGNode), petsc_geo_mg_compare); /* create IS of permutation */ for (kk=0; kk<nloc; kk++) permute[kk] = gnodes[kk].lid; /* locals only */ ierr = ISCreateGeneral(PETSC_COMM_SELF, nloc, permute, PETSC_OWN_POINTER, &perm);CHKERRQ(ierr); ierr = PetscFree(gnodes);CHKERRQ(ierr); /* get MIS aggs */ ierr = MatCoarsenCreate(comm, &crs);CHKERRQ(ierr); ierr = MatCoarsenSetType(crs, MATCOARSENMIS);CHKERRQ(ierr); ierr = MatCoarsenSetGreedyOrdering(crs, perm);CHKERRQ(ierr); ierr = MatCoarsenSetAdjacency(crs, Gmat);CHKERRQ(ierr); ierr = MatCoarsenSetVerbose(crs, pc_gamg->verbose);CHKERRQ(ierr); ierr = MatCoarsenSetStrictAggs(crs, PETSC_FALSE);CHKERRQ(ierr); ierr = MatCoarsenApply(crs);CHKERRQ(ierr); ierr = MatCoarsenGetData(crs, a_llist_parent);CHKERRQ(ierr); ierr = MatCoarsenDestroy(&crs);CHKERRQ(ierr); ierr = ISDestroy(&perm);CHKERRQ(ierr); #if defined PETSC_USE_LOG ierr = PetscLogEventEnd(PC_GAMGCoarsen_GEO,0,0,0,0);CHKERRQ(ierr); #endif PetscFunctionReturn(0); }
void PETSC_STDCALL matcoarsenapply_(MatCoarsen *coarser, int *__ierr ){ *__ierr = MatCoarsenApply(*coarser); }
PETSC_EXTERN void PETSC_STDCALL matcoarsenapply_(MatCoarsen coarser, int *__ierr ){ *__ierr = MatCoarsenApply( (MatCoarsen)PetscToPointer((coarser) )); }