1f3161b27SJose E. Roman #define PETSCKSP_DLL 2f3161b27SJose E. Roman 3f3161b27SJose E. Roman /* 4f3161b27SJose E. Roman Provides an interface to pARMS. 5f3161b27SJose E. Roman Requires pARMS 3.2 or later. 6f3161b27SJose E. Roman */ 7f3161b27SJose E. Roman 8*b45d2f2cSJed Brown #include "petsc-private/pcimpl.h" /*I "petscpc.h" I*/ 9f3161b27SJose E. Roman 10f3161b27SJose E. Roman #ifdef PETSC_USE_COMPLEX 11f3161b27SJose E. Roman #define DBL_CMPLX 12f3161b27SJose E. Roman #else 13f3161b27SJose E. Roman #define DBL 14f3161b27SJose E. Roman #endif 15f3161b27SJose E. Roman #define USE_MPI 16f3161b27SJose E. Roman #define REAL double 17f3161b27SJose E. Roman #define HAS_BLAS 18f3161b27SJose E. Roman #define FORTRAN_UNDERSCORE 19f3161b27SJose E. Roman #include "parms_sys.h" 20f3161b27SJose E. Roman #undef FLOAT 21f3161b27SJose E. Roman #define FLOAT PetscScalar 22f3161b27SJose E. Roman #include "parms.h" 23f3161b27SJose E. Roman 24f3161b27SJose E. Roman /* 25f3161b27SJose E. Roman Private context (data structure) for the preconditioner. 26f3161b27SJose E. Roman */ 27f3161b27SJose E. Roman typedef struct { 28f3161b27SJose E. Roman parms_Map map; 29f3161b27SJose E. Roman parms_Mat A; 30f3161b27SJose E. Roman parms_PC pc; 31f3161b27SJose E. Roman PCPARMSGlobalType global; 32f3161b27SJose E. Roman PCPARMSLocalType local; 33f3161b27SJose E. Roman PetscInt levels, blocksize, maxdim, maxits, lfil[7]; 34f3161b27SJose E. Roman PetscBool nonsymperm, meth[8]; 35f3161b27SJose E. Roman PetscReal solvetol, indtol, droptol[7]; 36f3161b27SJose E. Roman PetscScalar *lvec0, *lvec1; 37f3161b27SJose E. Roman } PC_PARMS; 38f3161b27SJose E. Roman 39f3161b27SJose E. Roman 40f3161b27SJose E. Roman #undef __FUNCT__ 41f3161b27SJose E. Roman #define __FUNCT__ "PCSetUp_PARMS" 42f3161b27SJose E. Roman static PetscErrorCode PCSetUp_PARMS(PC pc) 43f3161b27SJose E. Roman { 44f3161b27SJose E. Roman Mat pmat; 45f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 46f3161b27SJose E. Roman const PetscInt *mapptr0; 47f3161b27SJose E. Roman PetscInt n, lsize, low, high, i, pos, ncols, length; 48f3161b27SJose E. Roman int *maptmp, *mapptr, *ia, *ja, *ja1, *im; 49f3161b27SJose E. Roman PetscScalar *aa, *aa1; 50f3161b27SJose E. Roman const PetscInt *cols; 51f3161b27SJose E. Roman PetscInt meth[8]; 52f3161b27SJose E. Roman const PetscScalar *values; 53f3161b27SJose E. Roman PetscErrorCode ierr; 54f3161b27SJose E. Roman MatInfo matinfo; 55f3161b27SJose E. Roman PetscMPIInt rank, npro; 56f3161b27SJose E. Roman 57f3161b27SJose E. Roman PetscFunctionBegin; 58f3161b27SJose E. Roman 59f3161b27SJose E. Roman /* Get preconditioner matrix from PETSc and setup pARMS structs */ 60f3161b27SJose E. Roman ierr = PCGetOperators(pc,PETSC_NULL,&pmat,PETSC_NULL);CHKERRQ(ierr); 61f3161b27SJose E. Roman MPI_Comm_size(((PetscObject)pmat)->comm,&npro); 62f3161b27SJose E. Roman MPI_Comm_rank(((PetscObject)pmat)->comm,&rank); 63f3161b27SJose E. Roman 64f3161b27SJose E. Roman ierr = MatGetSize(pmat,&n,PETSC_NULL);CHKERRQ(ierr); 65f3161b27SJose E. Roman ierr = PetscMalloc((npro+1)*sizeof(int),&mapptr);CHKERRQ(ierr); 66f3161b27SJose E. Roman ierr = PetscMalloc(n*sizeof(int),&maptmp);CHKERRQ(ierr); 67f3161b27SJose E. Roman ierr = MatGetOwnershipRanges(pmat,&mapptr0);CHKERRQ(ierr); 68f3161b27SJose E. Roman low = mapptr0[rank]; 69f3161b27SJose E. Roman high = mapptr0[rank+1]; 70f3161b27SJose E. Roman lsize = high - low; 71f3161b27SJose E. Roman 72f3161b27SJose E. Roman for (i=0; i<npro+1; i++) 73f3161b27SJose E. Roman mapptr[i] = mapptr0[i]+1; 74f3161b27SJose E. Roman for (i = 0; i<n; i++) 75f3161b27SJose E. Roman maptmp[i] = i+1; 76f3161b27SJose E. Roman 77f3161b27SJose E. Roman /* if created, destroy the previous map */ 78f3161b27SJose E. Roman if(parms->map) { 79f3161b27SJose E. Roman parms_MapFree(&parms->map); 80f3161b27SJose E. Roman parms->map = PETSC_NULL; 81f3161b27SJose E. Roman } 82f3161b27SJose E. Roman 83f3161b27SJose E. Roman /* create pARMS map object */ 84f3161b27SJose E. Roman parms_MapCreateFromPtr(&parms->map,(int)n,maptmp,mapptr,((PetscObject)pmat)->comm,1,NONINTERLACED); 85f3161b27SJose E. Roman 86f3161b27SJose E. Roman /* if created, destroy the previous pARMS matrix */ 87f3161b27SJose E. Roman if(parms->A) { 88f3161b27SJose E. Roman parms_MatFree(&parms->A); 89f3161b27SJose E. Roman parms->A = PETSC_NULL; 90f3161b27SJose E. Roman } 91f3161b27SJose E. Roman 92f3161b27SJose E. Roman /* create pARMS mat object */ 93f3161b27SJose E. Roman parms_MatCreate(&parms->A,parms->map); 94f3161b27SJose E. Roman 95f3161b27SJose E. Roman /* setup and copy csr data structure for pARMS */ 96f3161b27SJose E. Roman ierr = PetscMalloc((lsize+1)*sizeof(int),&ia);CHKERRQ(ierr); 97f3161b27SJose E. Roman ia[0] = 1; 98f3161b27SJose E. Roman ierr = MatGetInfo(pmat,MAT_LOCAL,&matinfo);CHKERRQ(ierr); 99f3161b27SJose E. Roman length = matinfo.nz_used; 100f3161b27SJose E. Roman ierr = PetscMalloc(length*sizeof(int),&ja);CHKERRQ(ierr); 101f3161b27SJose E. Roman ierr = PetscMalloc(length*sizeof(PetscScalar),&aa);CHKERRQ(ierr); 102f3161b27SJose E. Roman 103f3161b27SJose E. Roman for (i = low; i<high; i++) { 104f3161b27SJose E. Roman pos = ia[i-low]-1; 105f3161b27SJose E. Roman ierr = MatGetRow(pmat,i,&ncols,&cols,&values);CHKERRQ(ierr); 106f3161b27SJose E. Roman ia[i-low+1] = ia[i-low] + ncols; 107f3161b27SJose E. Roman 108f3161b27SJose E. Roman if (ia[i-low+1] >= length) { 109f3161b27SJose E. Roman length += ncols; 110f3161b27SJose E. Roman ierr = PetscMalloc(length*sizeof(int),&ja1);CHKERRQ(ierr); 111f3161b27SJose E. Roman ierr = PetscMemcpy(ja1,ja,(ia[i-low]-1)*sizeof(int));CHKERRQ(ierr); 112f3161b27SJose E. Roman ierr = PetscFree(ja);CHKERRQ(ierr); 113f3161b27SJose E. Roman ja = ja1; 114f3161b27SJose E. Roman ierr = PetscMalloc(length*sizeof(PetscScalar),&aa1);CHKERRQ(ierr); 115f3161b27SJose E. Roman ierr = PetscMemcpy(aa1,aa,(ia[i-low]-1)*sizeof(PetscScalar));CHKERRQ(ierr); 116f3161b27SJose E. Roman ierr = PetscFree(aa);CHKERRQ(ierr); 117f3161b27SJose E. Roman aa = aa1; 118f3161b27SJose E. Roman } 119f3161b27SJose E. Roman ierr = PetscMemcpy(&ja[pos],cols,ncols*sizeof(int));CHKERRQ(ierr); 120f3161b27SJose E. Roman ierr = PetscMemcpy(&aa[pos],values,ncols*sizeof(PetscScalar));CHKERRQ(ierr); 121f3161b27SJose E. Roman ierr = MatRestoreRow(pmat,i,&ncols,&cols,&values);CHKERRQ(ierr); 122f3161b27SJose E. Roman } 123f3161b27SJose E. Roman 124f3161b27SJose E. Roman /* csr info is for local matrix so initialize im[] locally */ 125f3161b27SJose E. Roman ierr = PetscMalloc(lsize*sizeof(int),&im);CHKERRQ(ierr); 126f3161b27SJose E. Roman ierr = PetscMemcpy(im,&maptmp[mapptr[rank]-1],lsize*sizeof(int));CHKERRQ(ierr); 127f3161b27SJose E. Roman 128f3161b27SJose E. Roman /* 1-based indexing */ 129f3161b27SJose E. Roman for(i=0; i<ia[lsize]-1; i++) 130f3161b27SJose E. Roman ja[i] = ja[i]+1; 131f3161b27SJose E. Roman 132f3161b27SJose E. Roman /* Now copy csr matrix to parms_mat object */ 133f3161b27SJose E. Roman parms_MatSetValues(parms->A,(int)lsize,im,ia,ja,aa,INSERT); 134f3161b27SJose E. Roman 135f3161b27SJose E. Roman /* free memory */ 136f3161b27SJose E. Roman ierr = PetscFree(maptmp);CHKERRQ(ierr); 137f3161b27SJose E. Roman ierr = PetscFree(mapptr);CHKERRQ(ierr); 138f3161b27SJose E. Roman ierr = PetscFree(aa);CHKERRQ(ierr); 139f3161b27SJose E. Roman ierr = PetscFree(ja);CHKERRQ(ierr); 140f3161b27SJose E. Roman ierr = PetscFree(ia);CHKERRQ(ierr); 141f3161b27SJose E. Roman ierr = PetscFree(im);CHKERRQ(ierr); 142f3161b27SJose E. Roman 143f3161b27SJose E. Roman /* setup parms matrix */ 144f3161b27SJose E. Roman parms_MatSetup(parms->A); 145f3161b27SJose E. Roman 146f3161b27SJose E. Roman /* if created, destroy the previous pARMS pc */ 147f3161b27SJose E. Roman if(parms->pc) { 148f3161b27SJose E. Roman parms_PCFree(&parms->pc); 149f3161b27SJose E. Roman parms->pc = PETSC_NULL; 150f3161b27SJose E. Roman } 151f3161b27SJose E. Roman 152f3161b27SJose E. Roman /* Now create pARMS preconditioner object based on A */ 153f3161b27SJose E. Roman parms_PCCreate(&parms->pc,parms->A); 154f3161b27SJose E. Roman 155f3161b27SJose E. Roman /* Transfer options from PC to pARMS */ 156f3161b27SJose E. Roman switch(parms->global) { 157f3161b27SJose E. Roman case 0: parms_PCSetType(parms->pc, PCRAS); break; 158f3161b27SJose E. Roman case 1: parms_PCSetType(parms->pc, PCSCHUR); break; 159f3161b27SJose E. Roman case 2: parms_PCSetType(parms->pc, PCBJ); break; 160f3161b27SJose E. Roman } 161f3161b27SJose E. Roman switch(parms->local) { 162f3161b27SJose E. Roman case 0: parms_PCSetILUType(parms->pc, PCILU0); break; 163f3161b27SJose E. Roman case 1: parms_PCSetILUType(parms->pc, PCILUK); break; 164f3161b27SJose E. Roman case 2: parms_PCSetILUType(parms->pc, PCILUT); break; 165f3161b27SJose E. Roman case 3: parms_PCSetILUType(parms->pc, PCARMS); break; 166f3161b27SJose E. Roman } 167f3161b27SJose E. Roman parms_PCSetInnerEps(parms->pc, parms->solvetol); 168f3161b27SJose E. Roman parms_PCSetNlevels(parms->pc, parms->levels); 169f3161b27SJose E. Roman parms_PCSetPermType(parms->pc, parms->nonsymperm?1:0); 170f3161b27SJose E. Roman parms_PCSetBsize(parms->pc, parms->blocksize); 171f3161b27SJose E. Roman parms_PCSetTolInd(parms->pc, parms->indtol); 172f3161b27SJose E. Roman parms_PCSetInnerKSize(parms->pc, parms->maxdim); 173f3161b27SJose E. Roman parms_PCSetInnerMaxits(parms->pc, parms->maxits); 174f3161b27SJose E. Roman for(i=0; i<8; i++) meth[i] = parms->meth[i]?1:0; 175f3161b27SJose E. Roman parms_PCSetPermScalOptions(parms->pc, &meth[0], 1); 176f3161b27SJose E. Roman parms_PCSetPermScalOptions(parms->pc, &meth[4], 0); 177f3161b27SJose E. Roman parms_PCSetFill(parms->pc, parms->lfil); 178f3161b27SJose E. Roman parms_PCSetTol(parms->pc, parms->droptol); 179f3161b27SJose E. Roman 180f3161b27SJose E. Roman parms_PCSetup(parms->pc); 181f3161b27SJose E. Roman 182f3161b27SJose E. Roman /* Allocate two auxiliary vector of length lsize */ 183f3161b27SJose E. Roman if (parms->lvec0) { ierr = PetscFree(parms->lvec0);CHKERRQ(ierr); } 184f3161b27SJose E. Roman ierr = PetscMalloc(lsize*sizeof(PetscScalar), &parms->lvec0);CHKERRQ(ierr); 185f3161b27SJose E. Roman if (parms->lvec1) { ierr = PetscFree(parms->lvec1);CHKERRQ(ierr); } 186f3161b27SJose E. Roman ierr = PetscMalloc(lsize*sizeof(PetscScalar), &parms->lvec1);CHKERRQ(ierr); 187f3161b27SJose E. Roman PetscFunctionReturn(0); 188f3161b27SJose E. Roman } 189f3161b27SJose E. Roman 190f3161b27SJose E. Roman #undef __FUNCT__ 191f3161b27SJose E. Roman #define __FUNCT__ "PCView_PARMS" 192f3161b27SJose E. Roman static PetscErrorCode PCView_PARMS(PC pc,PetscViewer viewer) 193f3161b27SJose E. Roman { 194f3161b27SJose E. Roman PetscErrorCode ierr; 195f3161b27SJose E. Roman PetscBool iascii; 196f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 197f3161b27SJose E. Roman char *str; 198f3161b27SJose E. Roman double fill_fact; 199f3161b27SJose E. Roman 200f3161b27SJose E. Roman PetscFunctionBegin; 201f3161b27SJose E. Roman ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 202f3161b27SJose E. Roman if (iascii) { 203f3161b27SJose E. Roman parms_PCGetName(parms->pc,&str); 204f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," global preconditioner: %s\n",str);CHKERRQ(ierr); 205f3161b27SJose E. Roman parms_PCILUGetName(parms->pc,&str); 206f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," local preconditioner: %s\n",str);CHKERRQ(ierr); 207f3161b27SJose E. Roman parms_PCGetRatio(parms->pc,&fill_fact); 208f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," non-zero elements/original non-zero entries: %-4.2f\n",fill_fact);CHKERRQ(ierr); 209f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Tolerance for local solve: %g\n",parms->solvetol);CHKERRQ(ierr); 210f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Number of levels: %d\n",parms->levels);CHKERRQ(ierr); 211f3161b27SJose E. Roman if (parms->nonsymperm) { 212f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using nonsymmetric permutation\n");CHKERRQ(ierr); 213f3161b27SJose E. Roman } 214f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Block size: %d\n",parms->blocksize);CHKERRQ(ierr); 215f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Tolerance for independent sets: %g\n",parms->indtol);CHKERRQ(ierr); 216f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Inner Krylov dimension: %d\n",parms->maxdim);CHKERRQ(ierr); 217f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Maximum number of inner iterations: %d\n",parms->maxits);CHKERRQ(ierr); 218f3161b27SJose E. Roman if (parms->meth[0]) { 219f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using nonsymmetric permutation for interlevel blocks\n");CHKERRQ(ierr); 220f3161b27SJose E. Roman } 221f3161b27SJose E. Roman if (parms->meth[1]) { 222f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using column permutation for interlevel blocks\n");CHKERRQ(ierr); 223f3161b27SJose E. Roman } 224f3161b27SJose E. Roman if (parms->meth[2]) { 225f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using row scaling for interlevel blocks\n");CHKERRQ(ierr); 226f3161b27SJose E. Roman } 227f3161b27SJose E. Roman if (parms->meth[3]) { 228f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using column scaling for interlevel blocks\n");CHKERRQ(ierr); 229f3161b27SJose E. Roman } 230f3161b27SJose E. Roman if (parms->meth[4]) { 231f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using nonsymmetric permutation for last level blocks\n");CHKERRQ(ierr); 232f3161b27SJose E. Roman } 233f3161b27SJose E. Roman if (parms->meth[5]) { 234f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using column permutation for last level blocks\n");CHKERRQ(ierr); 235f3161b27SJose E. Roman } 236f3161b27SJose E. Roman if (parms->meth[6]) { 237f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using row scaling for last level blocks\n");CHKERRQ(ierr); 238f3161b27SJose E. Roman } 239f3161b27SJose E. Roman if (parms->meth[7]) { 240f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," Using column scaling for last level blocks\n");CHKERRQ(ierr); 241f3161b27SJose E. Roman } 242f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," amount of fill-in for ilut, iluk and arms: %d\n",parms->lfil[0]);CHKERRQ(ierr); 243f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," amount of fill-in for schur: %d\n",parms->lfil[4]);CHKERRQ(ierr); 244f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," amount of fill-in for ILUT L and U: %d\n",parms->lfil[5]);CHKERRQ(ierr); 245f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," drop tolerance for L, U, L^{-1}F and EU^{-1}: %g\n",parms->droptol[0]);CHKERRQ(ierr); 246f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," drop tolerance for schur complement at each level: %g\n",parms->droptol[4]);CHKERRQ(ierr); 247f3161b27SJose E. Roman ierr = PetscViewerASCIIPrintf(viewer," drop tolerance for ILUT in last level schur complement: %g\n",parms->droptol[5]);CHKERRQ(ierr); 248f3161b27SJose E. Roman } 249f3161b27SJose E. Roman 250f3161b27SJose E. Roman PetscFunctionReturn(0); 251f3161b27SJose E. Roman } 252f3161b27SJose E. Roman 253f3161b27SJose E. Roman #undef __FUNCT__ 254f3161b27SJose E. Roman #define __FUNCT__ "PCDestroy_PARMS" 255f3161b27SJose E. Roman static PetscErrorCode PCDestroy_PARMS(PC pc) 256f3161b27SJose E. Roman { 257f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 258f3161b27SJose E. Roman PetscErrorCode ierr; 259f3161b27SJose E. Roman 260f3161b27SJose E. Roman PetscFunctionBegin; 261f3161b27SJose E. Roman if(parms->map) { 262f3161b27SJose E. Roman parms_MapFree(&parms->map); 263f3161b27SJose E. Roman } 264f3161b27SJose E. Roman if(parms->A) { 265f3161b27SJose E. Roman parms_MatFree(&parms->A); 266f3161b27SJose E. Roman } 267f3161b27SJose E. Roman if(parms->pc) { 268f3161b27SJose E. Roman parms_PCFree(&parms->pc); 269f3161b27SJose E. Roman } 270f3161b27SJose E. Roman if(parms->lvec0) { 271f3161b27SJose E. Roman ierr = PetscFree(parms->lvec0); CHKERRQ(ierr); 272f3161b27SJose E. Roman } 273f3161b27SJose E. Roman if(parms->lvec1) { 274f3161b27SJose E. Roman ierr = PetscFree(parms->lvec1); CHKERRQ(ierr); 275f3161b27SJose E. Roman } 276f3161b27SJose E. Roman ierr = PetscFree(pc->data);CHKERRQ(ierr); 277f3161b27SJose E. Roman 278f3161b27SJose E. Roman ierr = PetscObjectChangeTypeName((PetscObject)pc,0);CHKERRQ(ierr); 279f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetGlobal_C","",PETSC_NULL);CHKERRQ(ierr); 280f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetLocal_C","",PETSC_NULL);CHKERRQ(ierr); 281f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetSolveTolerances_C","",PETSC_NULL);CHKERRQ(ierr); 282f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetSolveRestart_C","",PETSC_NULL);CHKERRQ(ierr); 283f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetNonsymPerm_C","",PETSC_NULL);CHKERRQ(ierr); 284f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetFill_C","",PETSC_NULL);CHKERRQ(ierr); 285f3161b27SJose E. Roman PetscFunctionReturn(0); 286f3161b27SJose E. Roman } 287f3161b27SJose E. Roman 288f3161b27SJose E. Roman #undef __FUNCT__ 289f3161b27SJose E. Roman #define __FUNCT__ "PCSetFromOptions_PARMS" 290f3161b27SJose E. Roman static PetscErrorCode PCSetFromOptions_PARMS(PC pc) 291f3161b27SJose E. Roman { 292f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 293f3161b27SJose E. Roman PetscBool flag; 294f3161b27SJose E. Roman PCPARMSGlobalType global; 295f3161b27SJose E. Roman PCPARMSLocalType local; 296f3161b27SJose E. Roman PetscErrorCode ierr; 297f3161b27SJose E. Roman 298f3161b27SJose E. Roman PetscFunctionBegin; 299f3161b27SJose E. Roman ierr = PetscOptionsHead("PARMS Options");CHKERRQ(ierr); 300f3161b27SJose E. Roman ierr = PetscOptionsEnum("-pc_parms_global","Global preconditioner","PCPARMSSetGlobal",PCPARMSGlobalTypes,(PetscEnum)parms->global,(PetscEnum*)&global,&flag);CHKERRQ(ierr); 301f3161b27SJose E. Roman if (flag) { ierr = PCPARMSSetGlobal(pc,global);CHKERRQ(ierr); } 302f3161b27SJose E. Roman ierr = PetscOptionsEnum("-pc_parms_local","Local preconditioner","PCPARMSSetLocal",PCPARMSLocalTypes,(PetscEnum)parms->local,(PetscEnum*)&local,&flag);CHKERRQ(ierr); 303f3161b27SJose E. Roman if (flag) { ierr = PCPARMSSetLocal(pc,local);CHKERRQ(ierr); } 304f3161b27SJose E. Roman ierr = PetscOptionsReal("-pc_parms_solve_tol","Tolerance for local solve","PCPARMSSetSolveTolerances",parms->solvetol,&parms->solvetol,&flag);CHKERRQ(ierr); 305f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_levels","Number of levels","None",parms->levels,&parms->levels,&flag);CHKERRQ(ierr); 306f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_nonsymmetric_perm","Use nonsymmetric permutation","PCPARMSSetNonsymPerm",parms->nonsymperm,&parms->nonsymperm,&flag);CHKERRQ(ierr); 307f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_blocksize","Block size","None",parms->blocksize,&parms->blocksize,&flag);CHKERRQ(ierr); 308f3161b27SJose E. Roman ierr = PetscOptionsReal("-pc_parms_ind_tol","Tolerance for independent sets","None",parms->indtol,&parms->indtol,&flag);CHKERRQ(ierr); 309f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_max_dim","Inner Krylov dimension","PCPARMSSetSolveRestart",parms->maxdim,&parms->maxdim,&flag);CHKERRQ(ierr); 310f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_max_it","Maximum number of inner iterations","PCPARMSSetSolveTolerances",parms->maxits,&parms->maxits,&flag);CHKERRQ(ierr); 311f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_inter_nonsymmetric_perm","nonsymmetric permutation for interlevel blocks","None",parms->meth[0],&parms->meth[0],&flag);CHKERRQ(ierr); 312f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_inter_column_perm","column permutation for interlevel blocks","None",parms->meth[1],&parms->meth[1],&flag);CHKERRQ(ierr); 313f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_inter_row_scaling","row scaling for interlevel blocks","None",parms->meth[2],&parms->meth[2],&flag);CHKERRQ(ierr); 314f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_inter_column_scaling","column scaling for interlevel blocks","None",parms->meth[3],&parms->meth[3],&flag);CHKERRQ(ierr); 315f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_last_nonsymmetric_perm","nonsymmetric permutation for last level blocks","None",parms->meth[4],&parms->meth[4],&flag);CHKERRQ(ierr); 316f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_last_column_perm","column permutation for last level blocks","None",parms->meth[5],&parms->meth[5],&flag);CHKERRQ(ierr); 317f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_last_row_scaling","row scaling for last level blocks","None",parms->meth[6],&parms->meth[6],&flag);CHKERRQ(ierr); 318f3161b27SJose E. Roman ierr = PetscOptionsBool("-pc_parms_last_column_scaling","column scaling for last level blocks","None",parms->meth[7],&parms->meth[7],&flag);CHKERRQ(ierr); 319f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_lfil_ilu_arms","amount of fill-in for ilut, iluk and arms","PCPARMSSetFill",parms->lfil[0],&parms->lfil[0],&flag);CHKERRQ(ierr); 320f3161b27SJose E. Roman if(flag) parms->lfil[1] = parms->lfil[2] = parms->lfil[3] = parms->lfil[0]; 321f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_lfil_schur","amount of fill-in for schur","PCPARMSSetFill",parms->lfil[4],&parms->lfil[4],&flag);CHKERRQ(ierr); 322f3161b27SJose E. Roman ierr = PetscOptionsInt("-pc_parms_lfil_ilut_L_U","amount of fill-in for ILUT L and U","PCPARMSSetFill",parms->lfil[5],&parms->lfil[5],&flag);CHKERRQ(ierr); 323f3161b27SJose E. Roman if(flag) parms->lfil[6] = parms->lfil[5]; 324f3161b27SJose E. Roman ierr = PetscOptionsReal("-pc_parms_droptol_factors","drop tolerance for L, U, L^{-1}F and EU^{-1}","None",parms->droptol[0],&parms->droptol[0],&flag);CHKERRQ(ierr); 325f3161b27SJose E. Roman ierr = PetscOptionsReal("-pc_parms_droptol_schur_compl","drop tolerance for schur complement at each level","None",parms->droptol[4],&parms->droptol[4],&flag);CHKERRQ(ierr); 326f3161b27SJose E. Roman if(flag) parms->droptol[1] = parms->droptol[2] = parms->droptol[3] = parms->droptol[0]; 327f3161b27SJose E. Roman ierr = PetscOptionsReal("-pc_parms_droptol_last_schur","drop tolerance for ILUT in last level schur complement","None",parms->droptol[5],&parms->droptol[5],&flag);CHKERRQ(ierr); 328f3161b27SJose E. Roman if(flag) parms->droptol[6] = parms->droptol[5]; 329f3161b27SJose E. Roman ierr = PetscOptionsTail();CHKERRQ(ierr); 330f3161b27SJose E. Roman PetscFunctionReturn(0); 331f3161b27SJose E. Roman } 332f3161b27SJose E. Roman 333f3161b27SJose E. Roman #undef __FUNCT__ 334f3161b27SJose E. Roman #define __FUNCT__ "PCApply_PARMS" 335f3161b27SJose E. Roman static PetscErrorCode PCApply_PARMS(PC pc,Vec b,Vec x) 336f3161b27SJose E. Roman { 337f3161b27SJose E. Roman PetscErrorCode ierr; 338f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 339f3161b27SJose E. Roman const PetscScalar *b1; 340f3161b27SJose E. Roman PetscScalar *x1; 341f3161b27SJose E. Roman 342f3161b27SJose E. Roman PetscFunctionBegin; 343f3161b27SJose E. Roman ierr = VecGetArrayRead(b,&b1);CHKERRQ(ierr); 344f3161b27SJose E. Roman ierr = VecGetArray(x,&x1);CHKERRQ(ierr); 345f3161b27SJose E. Roman parms_VecPermAux((PetscScalar*)b1,parms->lvec0,parms->map); 346f3161b27SJose E. Roman parms_PCApply(parms->pc,parms->lvec0,parms->lvec1); 347f3161b27SJose E. Roman parms_VecInvPermAux(parms->lvec1,x1,parms->map); 348f3161b27SJose E. Roman ierr = VecRestoreArrayRead(b,&b1);CHKERRQ(ierr); 349f3161b27SJose E. Roman ierr = VecRestoreArray(x,&x1);CHKERRQ(ierr); 350f3161b27SJose E. Roman PetscFunctionReturn(0); 351f3161b27SJose E. Roman } 352f3161b27SJose E. Roman 353f3161b27SJose E. Roman EXTERN_C_BEGIN 354f3161b27SJose E. Roman #undef __FUNCT__ 355f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetGlobal_PARMS" 356f3161b27SJose E. Roman PetscErrorCode PCPARMSSetGlobal_PARMS(PC pc,PCPARMSGlobalType type) 357f3161b27SJose E. Roman { 358f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 359f3161b27SJose E. Roman 360f3161b27SJose E. Roman PetscFunctionBegin; 361f3161b27SJose E. Roman if (type != parms->global) { 362f3161b27SJose E. Roman parms->global = type; 363f3161b27SJose E. Roman pc->setupcalled = 0; 364f3161b27SJose E. Roman } 365f3161b27SJose E. Roman PetscFunctionReturn(0); 366f3161b27SJose E. Roman } 367f3161b27SJose E. Roman EXTERN_C_END 368f3161b27SJose E. Roman 369f3161b27SJose E. Roman #undef __FUNCT__ 370f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetGlobal" 3715de0dacdSJose E. Roman /*@ 372f3161b27SJose E. Roman PCPARMSSetGlobal - Sets the global preconditioner to be used in PARMS. 373f3161b27SJose E. Roman 374f3161b27SJose E. Roman Collective on PC 375f3161b27SJose E. Roman 376f3161b27SJose E. Roman Input Parameters: 377f3161b27SJose E. Roman + pc - the preconditioner context 378f3161b27SJose E. Roman - type - the global preconditioner type, one of 379f3161b27SJose E. Roman .vb 380f3161b27SJose E. Roman PC_PARMS_GLOBAL_RAS - Restricted additive Schwarz 381f3161b27SJose E. Roman PC_PARMS_GLOBAL_SCHUR - Schur complement 382f3161b27SJose E. Roman PC_PARMS_GLOBAL_BJ - Block Jacobi 383f3161b27SJose E. Roman .ve 384f3161b27SJose E. Roman 385f3161b27SJose E. Roman Options Database Keys: 386f3161b27SJose E. Roman -pc_parms_global [ras,schur,bj] - Sets global preconditioner 387f3161b27SJose E. Roman 388f3161b27SJose E. Roman Level: intermediate 389f3161b27SJose E. Roman 390f3161b27SJose E. Roman Notes: 391f3161b27SJose E. Roman See the pARMS function parms_PCSetType for more information. 392f3161b27SJose E. Roman 393f3161b27SJose E. Roman .seealso: PCPARMS, PCPARMSSetLocal() 394f3161b27SJose E. Roman @*/ 395f3161b27SJose E. Roman PetscErrorCode PCPARMSSetGlobal(PC pc,PCPARMSGlobalType type) 396f3161b27SJose E. Roman { 397f3161b27SJose E. Roman PetscErrorCode ierr; 398f3161b27SJose E. Roman 399f3161b27SJose E. Roman PetscFunctionBegin; 400f3161b27SJose E. Roman PetscValidHeaderSpecific(pc,PC_CLASSID,1); 401f3161b27SJose E. Roman PetscValidLogicalCollectiveEnum(pc,type,2); 402f3161b27SJose E. Roman ierr = PetscTryMethod(pc,"PCPARMSSetGlobal_C",(PC,PCPARMSGlobalType),(pc,type));CHKERRQ(ierr); 403f3161b27SJose E. Roman PetscFunctionReturn(0); 404f3161b27SJose E. Roman } 405f3161b27SJose E. Roman 406f3161b27SJose E. Roman EXTERN_C_BEGIN 407f3161b27SJose E. Roman #undef __FUNCT__ 408f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetLocal_PARMS" 409f3161b27SJose E. Roman PetscErrorCode PCPARMSSetLocal_PARMS(PC pc,PCPARMSLocalType type) 410f3161b27SJose E. Roman { 411f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 412f3161b27SJose E. Roman 413f3161b27SJose E. Roman PetscFunctionBegin; 414f3161b27SJose E. Roman if (type != parms->local) { 415f3161b27SJose E. Roman parms->local = type; 416f3161b27SJose E. Roman pc->setupcalled = 0; 417f3161b27SJose E. Roman } 418f3161b27SJose E. Roman PetscFunctionReturn(0); 419f3161b27SJose E. Roman } 420f3161b27SJose E. Roman EXTERN_C_END 421f3161b27SJose E. Roman 422f3161b27SJose E. Roman #undef __FUNCT__ 423f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetLocal" 4245de0dacdSJose E. Roman /*@ 425f3161b27SJose E. Roman PCPARMSSetLocal - Sets the local preconditioner to be used in PARMS. 426f3161b27SJose E. Roman 427f3161b27SJose E. Roman Collective on PC 428f3161b27SJose E. Roman 429f3161b27SJose E. Roman Input Parameters: 430f3161b27SJose E. Roman + pc - the preconditioner context 431f3161b27SJose E. Roman - type - the local preconditioner type, one of 432f3161b27SJose E. Roman .vb 433f3161b27SJose E. Roman PC_PARMS_LOCAL_ILU0 - ILU0 preconditioner 434f3161b27SJose E. Roman PC_PARMS_LOCAL_ILUK - ILU(k) preconditioner 435f3161b27SJose E. Roman PC_PARMS_LOCAL_ILUT - ILUT preconditioner 436f3161b27SJose E. Roman PC_PARMS_LOCAL_ARMS - ARMS preconditioner 437f3161b27SJose E. Roman .ve 438f3161b27SJose E. Roman 439f3161b27SJose E. Roman Options Database Keys: 440f3161b27SJose E. Roman -pc_parms_local [ilu0,iluk,ilut,arms] - Sets local preconditioner 441f3161b27SJose E. Roman 442f3161b27SJose E. Roman Level: intermediate 443f3161b27SJose E. Roman 444f3161b27SJose E. Roman Notes: 445f3161b27SJose E. Roman For the ARMS preconditioner, one can use either the symmetric ARMS or the non-symmetric 446f3161b27SJose E. Roman variant (ARMS-ddPQ) by setting the permutation type with PCPARMSSetNonsymPerm(). 447f3161b27SJose E. Roman 448f3161b27SJose E. Roman See the pARMS function parms_PCILUSetType for more information. 449f3161b27SJose E. Roman 450f3161b27SJose E. Roman .seealso: PCPARMS, PCPARMSSetGlobal(), PCPARMSSetNonsymPerm() 451f3161b27SJose E. Roman 452f3161b27SJose E. Roman @*/ 453f3161b27SJose E. Roman PetscErrorCode PCPARMSSetLocal(PC pc,PCPARMSLocalType type) 454f3161b27SJose E. Roman { 455f3161b27SJose E. Roman PetscErrorCode ierr; 456f3161b27SJose E. Roman 457f3161b27SJose E. Roman PetscFunctionBegin; 458f3161b27SJose E. Roman PetscValidHeaderSpecific(pc,PC_CLASSID,1); 459f3161b27SJose E. Roman PetscValidLogicalCollectiveEnum(pc,type,2); 460f3161b27SJose E. Roman ierr = PetscTryMethod(pc,"PCPARMSSetLocal_C",(PC,PCPARMSLocalType),(pc,type));CHKERRQ(ierr); 461f3161b27SJose E. Roman PetscFunctionReturn(0); 462f3161b27SJose E. Roman } 463f3161b27SJose E. Roman 464f3161b27SJose E. Roman EXTERN_C_BEGIN 465f3161b27SJose E. Roman #undef __FUNCT__ 466f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetSolveTolerances_PARMS" 467f3161b27SJose E. Roman PetscErrorCode PCPARMSSetSolveTolerances_PARMS(PC pc,PetscReal tol,PetscInt maxits) 468f3161b27SJose E. Roman { 469f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 470f3161b27SJose E. Roman 471f3161b27SJose E. Roman PetscFunctionBegin; 472f3161b27SJose E. Roman 473f3161b27SJose E. Roman if (tol != parms->solvetol) { 474f3161b27SJose E. Roman parms->solvetol = tol; 475f3161b27SJose E. Roman pc->setupcalled = 0; 476f3161b27SJose E. Roman } 477f3161b27SJose E. Roman if (maxits != parms->maxits) { 478f3161b27SJose E. Roman parms->maxits = maxits; 479f3161b27SJose E. Roman pc->setupcalled = 0; 480f3161b27SJose E. Roman } 481f3161b27SJose E. Roman 482f3161b27SJose E. Roman PetscFunctionReturn(0); 483f3161b27SJose E. Roman } 484f3161b27SJose E. Roman EXTERN_C_END 485f3161b27SJose E. Roman 486f3161b27SJose E. Roman #undef __FUNCT__ 487f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetSolveTolerances" 4885de0dacdSJose E. Roman /*@ 489f3161b27SJose E. Roman PCPARMSSetSolveTolerances - Sets the convergence tolerance and the maximum iterations for the 490f3161b27SJose E. Roman inner GMRES solver, when the Schur global preconditioner is used. 491f3161b27SJose E. Roman 492f3161b27SJose E. Roman Collective on PC 493f3161b27SJose E. Roman 494f3161b27SJose E. Roman Input Parameters: 495f3161b27SJose E. Roman + pc - the preconditioner context 496f3161b27SJose E. Roman . tol - the convergence tolerance 497f3161b27SJose E. Roman - maxits - the maximum number of iterations to use 498f3161b27SJose E. Roman 499f3161b27SJose E. Roman Options Database Keys: 500f3161b27SJose E. Roman + -pc_parms_solve_tol - set the tolerance for local solve 501f3161b27SJose E. Roman - -pc_parms_max_it - set the maximum number of inner iterations 502f3161b27SJose E. Roman 503f3161b27SJose E. Roman Level: intermediate 504f3161b27SJose E. Roman 505f3161b27SJose E. Roman Notes: 506f3161b27SJose E. Roman See the pARMS functions parms_PCSetInnerEps and parms_PCSetInnerMaxits for more information. 507f3161b27SJose E. Roman 508f3161b27SJose E. Roman .seealso: PCPARMS, PCPARMSSetSolveRestart() 509f3161b27SJose E. Roman @*/ 510f3161b27SJose E. Roman PetscErrorCode PCPARMSSetSolveTolerances(PC pc,PetscReal tol,PetscInt maxits) 511f3161b27SJose E. Roman { 512f3161b27SJose E. Roman PetscErrorCode ierr; 513f3161b27SJose E. Roman 514f3161b27SJose E. Roman PetscFunctionBegin; 515f3161b27SJose E. Roman PetscValidHeaderSpecific(pc,PC_CLASSID,1); 516f3161b27SJose E. Roman ierr = PetscTryMethod(pc,"PCPARMSSetSolveTolerances_C",(PC,PetscReal,PetscInt),(pc,tol,maxits));CHKERRQ(ierr); 517f3161b27SJose E. Roman PetscFunctionReturn(0); 518f3161b27SJose E. Roman } 519f3161b27SJose E. Roman 520f3161b27SJose E. Roman EXTERN_C_BEGIN 521f3161b27SJose E. Roman #undef __FUNCT__ 522f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetSolveRestart_PARMS" 523f3161b27SJose E. Roman PetscErrorCode PCPARMSSetSolveRestart_PARMS(PC pc,PetscInt restart) 524f3161b27SJose E. Roman { 525f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 526f3161b27SJose E. Roman 527f3161b27SJose E. Roman PetscFunctionBegin; 528f3161b27SJose E. Roman 529f3161b27SJose E. Roman if (restart != parms->maxdim) { 530f3161b27SJose E. Roman parms->maxdim = restart; 531f3161b27SJose E. Roman pc->setupcalled = 0; 532f3161b27SJose E. Roman } 533f3161b27SJose E. Roman 534f3161b27SJose E. Roman PetscFunctionReturn(0); 535f3161b27SJose E. Roman } 536f3161b27SJose E. Roman EXTERN_C_END 537f3161b27SJose E. Roman 538f3161b27SJose E. Roman #undef __FUNCT__ 539f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetSolveRestart" 5405de0dacdSJose E. Roman /*@ 541f3161b27SJose E. Roman PCPARMSSetSolveRestart - Sets the number of iterations at which the 542f3161b27SJose E. Roman inner GMRES solver restarts. 543f3161b27SJose E. Roman 544f3161b27SJose E. Roman Collective on PC 545f3161b27SJose E. Roman 546f3161b27SJose E. Roman Input Parameters: 547f3161b27SJose E. Roman + pc - the preconditioner context 548f3161b27SJose E. Roman - restart - maximum dimension of the Krylov subspace 549f3161b27SJose E. Roman 550f3161b27SJose E. Roman Options Database Keys: 551f3161b27SJose E. Roman . -pc_parms_max_dim - sets the inner Krylov dimension 552f3161b27SJose E. Roman 553f3161b27SJose E. Roman Level: intermediate 554f3161b27SJose E. Roman 555f3161b27SJose E. Roman Notes: 556f3161b27SJose E. Roman See the pARMS function parms_PCSetInnerKSize for more information. 557f3161b27SJose E. Roman 558f3161b27SJose E. Roman .seealso: PCPARMS, PCPARMSSetSolveTolerances() 559f3161b27SJose E. Roman @*/ 560f3161b27SJose E. Roman PetscErrorCode PCPARMSSetSolveRestart(PC pc,PetscInt restart) 561f3161b27SJose E. Roman { 562f3161b27SJose E. Roman PetscErrorCode ierr; 563f3161b27SJose E. Roman 564f3161b27SJose E. Roman PetscFunctionBegin; 565f3161b27SJose E. Roman PetscValidHeaderSpecific(pc,PC_CLASSID,1); 566f3161b27SJose E. Roman ierr = PetscTryMethod(pc,"PCPARMSSetSolveRestart_C",(PC,PetscInt),(pc,restart));CHKERRQ(ierr); 567f3161b27SJose E. Roman PetscFunctionReturn(0); 568f3161b27SJose E. Roman } 569f3161b27SJose E. Roman 570f3161b27SJose E. Roman EXTERN_C_BEGIN 571f3161b27SJose E. Roman #undef __FUNCT__ 572f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetNonsymPerm_PARMS" 573f3161b27SJose E. Roman PetscErrorCode PCPARMSSetNonsymPerm_PARMS(PC pc,PetscBool nonsym) 574f3161b27SJose E. Roman { 575f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 576f3161b27SJose E. Roman 577f3161b27SJose E. Roman PetscFunctionBegin; 5785de0dacdSJose E. Roman if ((nonsym && !parms->nonsymperm) || (!nonsym && parms->nonsymperm)) { 579f3161b27SJose E. Roman parms->nonsymperm = nonsym; 580f3161b27SJose E. Roman pc->setupcalled = 0; 581f3161b27SJose E. Roman } 582f3161b27SJose E. Roman PetscFunctionReturn(0); 583f3161b27SJose E. Roman } 584f3161b27SJose E. Roman EXTERN_C_END 585f3161b27SJose E. Roman 586f3161b27SJose E. Roman #undef __FUNCT__ 587f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetNonsymPerm" 5885de0dacdSJose E. Roman /*@ 589f3161b27SJose E. Roman PCPARMSSetNonsymPerm - Sets the type of permutation for the ARMS preconditioner: the standard 590f3161b27SJose E. Roman symmetric ARMS or the non-symmetric ARMS (ARMS-ddPQ). 591f3161b27SJose E. Roman 592f3161b27SJose E. Roman Collective on PC 593f3161b27SJose E. Roman 594f3161b27SJose E. Roman Input Parameters: 595f3161b27SJose E. Roman + pc - the preconditioner context 596f3161b27SJose E. Roman - nonsym - PETSC_TRUE indicates the non-symmetric ARMS is used; 597f3161b27SJose E. Roman PETSC_FALSE indicates the symmetric ARMS is used 598f3161b27SJose E. Roman 599f3161b27SJose E. Roman Options Database Keys: 600f3161b27SJose E. Roman . -pc_parms_nonsymmetric_perm - sets the use of nonsymmetric permutation 601f3161b27SJose E. Roman 602f3161b27SJose E. Roman Level: intermediate 603f3161b27SJose E. Roman 604f3161b27SJose E. Roman Notes: 605f3161b27SJose E. Roman See the pARMS function parms_PCSetPermType for more information. 606f3161b27SJose E. Roman 607f3161b27SJose E. Roman .seealso: PCPARMS 608f3161b27SJose E. Roman @*/ 609f3161b27SJose E. Roman PetscErrorCode PCPARMSSetNonsymPerm(PC pc,PetscBool nonsym) 610f3161b27SJose E. Roman { 611f3161b27SJose E. Roman PetscErrorCode ierr; 612f3161b27SJose E. Roman 613f3161b27SJose E. Roman PetscFunctionBegin; 614f3161b27SJose E. Roman PetscValidHeaderSpecific(pc,PC_CLASSID,1); 615f3161b27SJose E. Roman ierr = PetscTryMethod(pc,"PCPARMSSetNonsymPerm_C",(PC,PetscBool),(pc,nonsym));CHKERRQ(ierr); 616f3161b27SJose E. Roman PetscFunctionReturn(0); 617f3161b27SJose E. Roman } 618f3161b27SJose E. Roman 619f3161b27SJose E. Roman EXTERN_C_BEGIN 620f3161b27SJose E. Roman #undef __FUNCT__ 621f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetFill_PARMS" 622f3161b27SJose E. Roman PetscErrorCode PCPARMSSetFill_PARMS(PC pc,PetscInt lfil0,PetscInt lfil1,PetscInt lfil2) 623f3161b27SJose E. Roman { 624f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS*)pc->data; 625f3161b27SJose E. Roman 626f3161b27SJose E. Roman PetscFunctionBegin; 627f3161b27SJose E. Roman if (lfil0 != parms->lfil[0] || lfil0 != parms->lfil[1] || lfil0 != parms->lfil[2] || lfil0 != parms->lfil[3]) { 628f3161b27SJose E. Roman parms->lfil[1] = parms->lfil[2] = parms->lfil[3] = parms->lfil[0] = lfil0; 629f3161b27SJose E. Roman pc->setupcalled = 0; 630f3161b27SJose E. Roman } 631f3161b27SJose E. Roman if (lfil1 != parms->lfil[4]) { 632f3161b27SJose E. Roman parms->lfil[4] = lfil1; 633f3161b27SJose E. Roman pc->setupcalled = 0; 634f3161b27SJose E. Roman } 635f3161b27SJose E. Roman if (lfil2 != parms->lfil[5] || lfil2 != parms->lfil[6]) { 636f3161b27SJose E. Roman parms->lfil[5] = parms->lfil[6] = lfil2; 637f3161b27SJose E. Roman pc->setupcalled = 0; 638f3161b27SJose E. Roman } 639f3161b27SJose E. Roman PetscFunctionReturn(0); 640f3161b27SJose E. Roman } 641f3161b27SJose E. Roman EXTERN_C_END 642f3161b27SJose E. Roman 643f3161b27SJose E. Roman #undef __FUNCT__ 644f3161b27SJose E. Roman #define __FUNCT__ "PCPARMSSetFill" 6455de0dacdSJose E. Roman /*@ 646f3161b27SJose E. Roman PCPARMSSetFill - Sets the fill-in parameters for ILUT, ILUK and ARMS preconditioners. 647f3161b27SJose E. Roman Consider the original matrix A = [B F; E C] and the approximate version 648f3161b27SJose E. Roman M = [LB 0; E/UB I]*[UB LB\F; 0 S]. 649f3161b27SJose E. Roman 650f3161b27SJose E. Roman Collective on PC 651f3161b27SJose E. Roman 652f3161b27SJose E. Roman Input Parameters: 653f3161b27SJose E. Roman + pc - the preconditioner context 654f3161b27SJose E. Roman . fil0 - the level of fill-in kept in LB, UB, E/UB and LB\F 655f3161b27SJose E. Roman . fil1 - the level of fill-in kept in S 656f3161b27SJose E. Roman - fil2 - the level of fill-in kept in the L and U parts of the LU factorization of S 657f3161b27SJose E. Roman 658f3161b27SJose E. Roman Options Database Keys: 659f3161b27SJose E. Roman + -pc_parms_lfil_ilu_arms - set the amount of fill-in for ilut, iluk and arms 660f3161b27SJose E. Roman . -pc_parms_lfil_schur - set the amount of fill-in for schur 661f3161b27SJose E. Roman - -pc_parms_lfil_ilut_L_U - set the amount of fill-in for ILUT L and U 662f3161b27SJose E. Roman 663f3161b27SJose E. Roman Level: intermediate 664f3161b27SJose E. Roman 665f3161b27SJose E. Roman Notes: 666f3161b27SJose E. Roman See the pARMS function parms_PCSetFill for more information. 667f3161b27SJose E. Roman 668f3161b27SJose E. Roman .seealso: PCPARMS 669f3161b27SJose E. Roman @*/ 670f3161b27SJose E. Roman PetscErrorCode PCPARMSSetFill(PC pc,PetscInt lfil0,PetscInt lfil1,PetscInt lfil2) 671f3161b27SJose E. Roman { 672f3161b27SJose E. Roman PetscErrorCode ierr; 673f3161b27SJose E. Roman 674f3161b27SJose E. Roman PetscFunctionBegin; 675f3161b27SJose E. Roman PetscValidHeaderSpecific(pc,PC_CLASSID,1); 676f3161b27SJose E. Roman ierr = PetscTryMethod(pc,"PCPARMSSetFill_C",(PC,PetscInt,PetscInt,PetscInt),(pc,lfil0,lfil1,lfil2));CHKERRQ(ierr); 677f3161b27SJose E. Roman PetscFunctionReturn(0); 678f3161b27SJose E. Roman } 679f3161b27SJose E. Roman 680f3161b27SJose E. Roman /*MC 681f3161b27SJose E. Roman PCPARMS - Allows the use of the parallel Algebraic Recursive Multilevel Solvers 682f3161b27SJose E. Roman available in the package pARMS 683f3161b27SJose E. Roman 684f3161b27SJose E. Roman Options Database Keys: 685f3161b27SJose E. Roman + -pc_parms_global - one of ras, schur, bj 686f3161b27SJose E. Roman . -pc_parms_local - one of ilu0, iluk, ilut, arms 687f3161b27SJose E. Roman . -pc_parms_solve_tol - set the tolerance for local solve 688f3161b27SJose E. Roman . -pc_parms_levels - set the number of levels 689f3161b27SJose E. Roman . -pc_parms_nonsymmetric_perm - set the use of nonsymmetric permutation 690f3161b27SJose E. Roman . -pc_parms_blocksize - set the block size 691f3161b27SJose E. Roman . -pc_parms_ind_tol - set the tolerance for independent sets 692f3161b27SJose E. Roman . -pc_parms_max_dim - set the inner krylov dimension 693f3161b27SJose E. Roman . -pc_parms_max_it - set the maximum number of inner iterations 6944b62eef3SJose E. Roman . -pc_parms_inter_nonsymmetric_perm - set the use of nonsymmetric permutation for interlevel blocks 695f3161b27SJose E. Roman . -pc_parms_inter_column_perm - set the use of column permutation for interlevel blocks 696f3161b27SJose E. Roman . -pc_parms_inter_row_scaling - set the use of row scaling for interlevel blocks 697f3161b27SJose E. Roman . -pc_parms_inter_column_scaling - set the use of column scaling for interlevel blocks 6984b62eef3SJose E. Roman . -pc_parms_last_nonsymmetric_perm - set the use of nonsymmetric permutation for last level blocks 699f3161b27SJose E. Roman . -pc_parms_last_column_perm - set the use of column permutation for last level blocks 700f3161b27SJose E. Roman . -pc_parms_last_row_scaling - set the use of row scaling for last level blocks 701f3161b27SJose E. Roman . -pc_parms_last_column_scaling - set the use of column scaling for last level blocks 702f3161b27SJose E. Roman . -pc_parms_lfil_ilu_arms - set the amount of fill-in for ilut, iluk and arms 703f3161b27SJose E. Roman . -pc_parms_lfil_schur - set the amount of fill-in for schur 704f3161b27SJose E. Roman . -pc_parms_lfil_ilut_L_U - set the amount of fill-in for ILUT L and U 705f3161b27SJose E. Roman . -pc_parms_droptol_factors - set the drop tolerance for L, U, L^{-1}F and EU^{-1} 706f3161b27SJose E. Roman . -pc_parms_droptol_schur_compl - set the drop tolerance for schur complement at each level 707f3161b27SJose E. Roman - -pc_parms_droptol_last_schur - set the drop tolerance for ILUT in last level schur complement 708f3161b27SJose E. Roman 709f3161b27SJose E. Roman IMPORTANT: 710f3161b27SJose E. Roman Unless configured appropriately, this preconditioner performs an inexact solve 711f3161b27SJose E. Roman as part of the preconditioner application. Therefore, it must be used in combination 712f3161b27SJose E. Roman with flexible variants of iterative solvers, such as KSPFGMRES or KSPCGR. 713f3161b27SJose E. Roman 714f3161b27SJose E. Roman Level: intermediate 715f3161b27SJose E. Roman 716f3161b27SJose E. Roman .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC 717f3161b27SJose E. Roman M*/ 718f3161b27SJose E. Roman 719f3161b27SJose E. Roman EXTERN_C_BEGIN 720f3161b27SJose E. Roman #undef __FUNCT__ 721f3161b27SJose E. Roman #define __FUNCT__ "PCCreate_PARMS" 722f3161b27SJose E. Roman PetscErrorCode PCCreate_PARMS(PC pc) 723f3161b27SJose E. Roman { 724f3161b27SJose E. Roman PC_PARMS *parms; 725f3161b27SJose E. Roman PetscErrorCode ierr; 726f3161b27SJose E. Roman 727f3161b27SJose E. Roman PetscFunctionBegin; 728f3161b27SJose E. Roman ierr = PetscNewLog(pc,PC_PARMS,&parms);CHKERRQ(ierr); 729f3161b27SJose E. Roman parms->map = 0; 730f3161b27SJose E. Roman parms->A = 0; 731f3161b27SJose E. Roman parms->pc = 0; 732abd6c125SJose E. Roman parms->global = PC_PARMS_GLOBAL_RAS; 733f3161b27SJose E. Roman parms->local = PC_PARMS_LOCAL_ARMS; 734f3161b27SJose E. Roman parms->levels = 10; 735f3161b27SJose E. Roman parms->nonsymperm = PETSC_TRUE; 736f3161b27SJose E. Roman parms->blocksize = 250; 737abd6c125SJose E. Roman parms->maxdim = 0; 738abd6c125SJose E. Roman parms->maxits = 0; 7394b62eef3SJose E. Roman parms->meth[0] = PETSC_FALSE; 7404b62eef3SJose E. Roman parms->meth[1] = PETSC_FALSE; 7414b62eef3SJose E. Roman parms->meth[2] = PETSC_FALSE; 7424b62eef3SJose E. Roman parms->meth[3] = PETSC_FALSE; 7434b62eef3SJose E. Roman parms->meth[4] = PETSC_FALSE; 7444b62eef3SJose E. Roman parms->meth[5] = PETSC_FALSE; 7454b62eef3SJose E. Roman parms->meth[6] = PETSC_FALSE; 7464b62eef3SJose E. Roman parms->meth[7] = PETSC_FALSE; 747f3161b27SJose E. Roman parms->solvetol = 0.01; 748f3161b27SJose E. Roman parms->indtol = 0.4; 749f3161b27SJose E. Roman parms->lfil[0] = parms->lfil[1] = parms->lfil[2] = parms->lfil[3] = 20; 750f3161b27SJose E. Roman parms->lfil[4] = parms->lfil[5] = parms->lfil[6] = 20; 751f3161b27SJose E. Roman parms->droptol[0] = parms->droptol[1] = parms->droptol[2] = parms->droptol[3] = 0.00001; 752f3161b27SJose E. Roman parms->droptol[4] = 0.001; 753f3161b27SJose E. Roman parms->droptol[5] = parms->droptol[6] = 0.001; 754f3161b27SJose E. Roman pc->data = parms; 755f3161b27SJose E. Roman pc->ops->destroy = PCDestroy_PARMS; 756f3161b27SJose E. Roman pc->ops->setfromoptions = PCSetFromOptions_PARMS; 757f3161b27SJose E. Roman pc->ops->setup = PCSetUp_PARMS; 758f3161b27SJose E. Roman pc->ops->apply = PCApply_PARMS; 759f3161b27SJose E. Roman pc->ops->view = PCView_PARMS; 760f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetGlobal_C","PCPARMSSetGlobal_PARMS",PCPARMSSetGlobal_PARMS);CHKERRQ(ierr); 761f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetLocal_C","PCPARMSSetLocal_PARMS",PCPARMSSetLocal_PARMS);CHKERRQ(ierr); 762f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetSolveTolerances_C","PCPARMSSetSolveTolerances_PARMS",PCPARMSSetSolveTolerances_PARMS);CHKERRQ(ierr); 763f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetSolveRestart_C","PCPARMSSetSolveRestart_PARMS",PCPARMSSetSolveRestart_PARMS);CHKERRQ(ierr); 764f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetNonsymPerm_C","PCPARMSSetNonsymPerm_PARMS",PCPARMSSetNonsymPerm_PARMS);CHKERRQ(ierr); 765f3161b27SJose E. Roman ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCPARMSSetFill_C","PCPARMSSetFill_PARMS",PCPARMSSetFill_PARMS);CHKERRQ(ierr); 766f3161b27SJose E. Roman 767f3161b27SJose E. Roman PetscFunctionReturn(0); 768f3161b27SJose E. Roman } 769f3161b27SJose E. Roman EXTERN_C_END 770