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 8af0996ceSBarry Smith #include <petsc/private/pcimpl.h> /*I "petscpc.h" I*/ 9f3161b27SJose E. Roman 10519f805aSKarl Rupp #if defined(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 22aaa7dc30SBarry Smith #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 399371c9d4SSatish Balay static PetscErrorCode PCSetUp_PARMS(PC pc) { 40f3161b27SJose E. Roman Mat pmat; 41f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 42f3161b27SJose E. Roman const PetscInt *mapptr0; 43f3161b27SJose E. Roman PetscInt n, lsize, low, high, i, pos, ncols, length; 44f3161b27SJose E. Roman int *maptmp, *mapptr, *ia, *ja, *ja1, *im; 45f3161b27SJose E. Roman PetscScalar *aa, *aa1; 46f3161b27SJose E. Roman const PetscInt *cols; 47f3161b27SJose E. Roman PetscInt meth[8]; 48f3161b27SJose E. Roman const PetscScalar *values; 49f3161b27SJose E. Roman MatInfo matinfo; 50f3161b27SJose E. Roman PetscMPIInt rank, npro; 51f3161b27SJose E. Roman 52f3161b27SJose E. Roman PetscFunctionBegin; 53f3161b27SJose E. Roman /* Get preconditioner matrix from PETSc and setup pARMS structs */ 549566063dSJacob Faibussowitsch PetscCall(PCGetOperators(pc, NULL, &pmat)); 55ce94432eSBarry Smith MPI_Comm_size(PetscObjectComm((PetscObject)pmat), &npro); 56ce94432eSBarry Smith MPI_Comm_rank(PetscObjectComm((PetscObject)pmat), &rank); 57f3161b27SJose E. Roman 589566063dSJacob Faibussowitsch PetscCall(MatGetSize(pmat, &n, NULL)); 599566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(npro + 1, &mapptr)); 609566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &maptmp)); 619566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRanges(pmat, &mapptr0)); 62f3161b27SJose E. Roman low = mapptr0[rank]; 63f3161b27SJose E. Roman high = mapptr0[rank + 1]; 64f3161b27SJose E. Roman lsize = high - low; 65f3161b27SJose E. Roman 662fa5cd67SKarl Rupp for (i = 0; i < npro + 1; i++) mapptr[i] = mapptr0[i] + 1; 672fa5cd67SKarl Rupp for (i = 0; i < n; i++) maptmp[i] = i + 1; 68f3161b27SJose E. Roman 69f3161b27SJose E. Roman /* if created, destroy the previous map */ 70f3161b27SJose E. Roman if (parms->map) { 71f3161b27SJose E. Roman parms_MapFree(&parms->map); 720298fd71SBarry Smith parms->map = NULL; 73f3161b27SJose E. Roman } 74f3161b27SJose E. Roman 75f3161b27SJose E. Roman /* create pARMS map object */ 76ce94432eSBarry Smith parms_MapCreateFromPtr(&parms->map, (int)n, maptmp, mapptr, PetscObjectComm((PetscObject)pmat), 1, NONINTERLACED); 77f3161b27SJose E. Roman 78f3161b27SJose E. Roman /* if created, destroy the previous pARMS matrix */ 79f3161b27SJose E. Roman if (parms->A) { 80f3161b27SJose E. Roman parms_MatFree(&parms->A); 810298fd71SBarry Smith parms->A = NULL; 82f3161b27SJose E. Roman } 83f3161b27SJose E. Roman 84f3161b27SJose E. Roman /* create pARMS mat object */ 85f3161b27SJose E. Roman parms_MatCreate(&parms->A, parms->map); 86f3161b27SJose E. Roman 87f3161b27SJose E. Roman /* setup and copy csr data structure for pARMS */ 889566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(lsize + 1, &ia)); 89f3161b27SJose E. Roman ia[0] = 1; 909566063dSJacob Faibussowitsch PetscCall(MatGetInfo(pmat, MAT_LOCAL, &matinfo)); 91f3161b27SJose E. Roman length = matinfo.nz_used; 929566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(length, &ja)); 939566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(length, &aa)); 94f3161b27SJose E. Roman 95f3161b27SJose E. Roman for (i = low; i < high; i++) { 96f3161b27SJose E. Roman pos = ia[i - low] - 1; 979566063dSJacob Faibussowitsch PetscCall(MatGetRow(pmat, i, &ncols, &cols, &values)); 98f3161b27SJose E. Roman ia[i - low + 1] = ia[i - low] + ncols; 99f3161b27SJose E. Roman 100f3161b27SJose E. Roman if (ia[i - low + 1] >= length) { 101f3161b27SJose E. Roman length += ncols; 1029566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(length, &ja1)); 1039566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(ja1, ja, ia[i - low] - 1)); 1049566063dSJacob Faibussowitsch PetscCall(PetscFree(ja)); 105f3161b27SJose E. Roman ja = ja1; 1069566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(length, &aa1)); 1079566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(aa1, aa, ia[i - low] - 1)); 1089566063dSJacob Faibussowitsch PetscCall(PetscFree(aa)); 109f3161b27SJose E. Roman aa = aa1; 110f3161b27SJose E. Roman } 1119566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(&ja[pos], cols, ncols)); 1129566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(&aa[pos], values, ncols)); 1139566063dSJacob Faibussowitsch PetscCall(MatRestoreRow(pmat, i, &ncols, &cols, &values)); 114f3161b27SJose E. Roman } 115f3161b27SJose E. Roman 116f3161b27SJose E. Roman /* csr info is for local matrix so initialize im[] locally */ 1179566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(lsize, &im)); 1189566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(im, &maptmp[mapptr[rank] - 1], lsize)); 119f3161b27SJose E. Roman 120f3161b27SJose E. Roman /* 1-based indexing */ 1212fa5cd67SKarl Rupp for (i = 0; i < ia[lsize] - 1; i++) ja[i] = ja[i] + 1; 122f3161b27SJose E. Roman 123f3161b27SJose E. Roman /* Now copy csr matrix to parms_mat object */ 124f3161b27SJose E. Roman parms_MatSetValues(parms->A, (int)lsize, im, ia, ja, aa, INSERT); 125f3161b27SJose E. Roman 126f3161b27SJose E. Roman /* free memory */ 1279566063dSJacob Faibussowitsch PetscCall(PetscFree(maptmp)); 1289566063dSJacob Faibussowitsch PetscCall(PetscFree(mapptr)); 1299566063dSJacob Faibussowitsch PetscCall(PetscFree(aa)); 1309566063dSJacob Faibussowitsch PetscCall(PetscFree(ja)); 1319566063dSJacob Faibussowitsch PetscCall(PetscFree(ia)); 1329566063dSJacob Faibussowitsch PetscCall(PetscFree(im)); 133f3161b27SJose E. Roman 134f3161b27SJose E. Roman /* setup parms matrix */ 135f3161b27SJose E. Roman parms_MatSetup(parms->A); 136f3161b27SJose E. Roman 137f3161b27SJose E. Roman /* if created, destroy the previous pARMS pc */ 138f3161b27SJose E. Roman if (parms->pc) { 139f3161b27SJose E. Roman parms_PCFree(&parms->pc); 1400298fd71SBarry Smith parms->pc = NULL; 141f3161b27SJose E. Roman } 142f3161b27SJose E. Roman 143f3161b27SJose E. Roman /* Now create pARMS preconditioner object based on A */ 144f3161b27SJose E. Roman parms_PCCreate(&parms->pc, parms->A); 145f3161b27SJose E. Roman 146f3161b27SJose E. Roman /* Transfer options from PC to pARMS */ 147f3161b27SJose E. Roman switch (parms->global) { 148f3161b27SJose E. Roman case 0: parms_PCSetType(parms->pc, PCRAS); break; 149f3161b27SJose E. Roman case 1: parms_PCSetType(parms->pc, PCSCHUR); break; 150f3161b27SJose E. Roman case 2: parms_PCSetType(parms->pc, PCBJ); break; 151f3161b27SJose E. Roman } 152f3161b27SJose E. Roman switch (parms->local) { 153f3161b27SJose E. Roman case 0: parms_PCSetILUType(parms->pc, PCILU0); break; 154f3161b27SJose E. Roman case 1: parms_PCSetILUType(parms->pc, PCILUK); break; 155f3161b27SJose E. Roman case 2: parms_PCSetILUType(parms->pc, PCILUT); break; 156f3161b27SJose E. Roman case 3: parms_PCSetILUType(parms->pc, PCARMS); break; 157f3161b27SJose E. Roman } 158f3161b27SJose E. Roman parms_PCSetInnerEps(parms->pc, parms->solvetol); 159f3161b27SJose E. Roman parms_PCSetNlevels(parms->pc, parms->levels); 160f3161b27SJose E. Roman parms_PCSetPermType(parms->pc, parms->nonsymperm ? 1 : 0); 161f3161b27SJose E. Roman parms_PCSetBsize(parms->pc, parms->blocksize); 162f3161b27SJose E. Roman parms_PCSetTolInd(parms->pc, parms->indtol); 163f3161b27SJose E. Roman parms_PCSetInnerKSize(parms->pc, parms->maxdim); 164f3161b27SJose E. Roman parms_PCSetInnerMaxits(parms->pc, parms->maxits); 165f3161b27SJose E. Roman for (i = 0; i < 8; i++) meth[i] = parms->meth[i] ? 1 : 0; 166f3161b27SJose E. Roman parms_PCSetPermScalOptions(parms->pc, &meth[0], 1); 167f3161b27SJose E. Roman parms_PCSetPermScalOptions(parms->pc, &meth[4], 0); 168f3161b27SJose E. Roman parms_PCSetFill(parms->pc, parms->lfil); 169f3161b27SJose E. Roman parms_PCSetTol(parms->pc, parms->droptol); 170f3161b27SJose E. Roman 171f3161b27SJose E. Roman parms_PCSetup(parms->pc); 172f3161b27SJose E. Roman 173f3161b27SJose E. Roman /* Allocate two auxiliary vector of length lsize */ 1749566063dSJacob Faibussowitsch if (parms->lvec0) PetscCall(PetscFree(parms->lvec0)); 1759566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(lsize, &parms->lvec0)); 1769566063dSJacob Faibussowitsch if (parms->lvec1) PetscCall(PetscFree(parms->lvec1)); 1779566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(lsize, &parms->lvec1)); 178f3161b27SJose E. Roman PetscFunctionReturn(0); 179f3161b27SJose E. Roman } 180f3161b27SJose E. Roman 1819371c9d4SSatish Balay static PetscErrorCode PCView_PARMS(PC pc, PetscViewer viewer) { 182f3161b27SJose E. Roman PetscBool iascii; 183f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 184f3161b27SJose E. Roman char *str; 185f3161b27SJose E. Roman double fill_fact; 186f3161b27SJose E. Roman 187f3161b27SJose E. Roman PetscFunctionBegin; 1889566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 189f3161b27SJose E. Roman if (iascii) { 190f3161b27SJose E. Roman parms_PCGetName(parms->pc, &str); 1919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " global preconditioner: %s\n", str)); 192f3161b27SJose E. Roman parms_PCILUGetName(parms->pc, &str); 1939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " local preconditioner: %s\n", str)); 194f3161b27SJose E. Roman parms_PCGetRatio(parms->pc, &fill_fact); 1959566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " non-zero elements/original non-zero entries: %-4.2f\n", fill_fact)); 1969566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Tolerance for local solve: %g\n", parms->solvetol)); 1979566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Number of levels: %d\n", parms->levels)); 198*48a46eb9SPierre Jolivet if (parms->nonsymperm) PetscCall(PetscViewerASCIIPrintf(viewer, " Using nonsymmetric permutation\n")); 1999566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Block size: %d\n", parms->blocksize)); 2009566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Tolerance for independent sets: %g\n", parms->indtol)); 2019566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Inner Krylov dimension: %d\n", parms->maxdim)); 2029566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Maximum number of inner iterations: %d\n", parms->maxits)); 203*48a46eb9SPierre Jolivet if (parms->meth[0]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using nonsymmetric permutation for interlevel blocks\n")); 204*48a46eb9SPierre Jolivet if (parms->meth[1]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using column permutation for interlevel blocks\n")); 205*48a46eb9SPierre Jolivet if (parms->meth[2]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using row scaling for interlevel blocks\n")); 206*48a46eb9SPierre Jolivet if (parms->meth[3]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using column scaling for interlevel blocks\n")); 207*48a46eb9SPierre Jolivet if (parms->meth[4]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using nonsymmetric permutation for last level blocks\n")); 208*48a46eb9SPierre Jolivet if (parms->meth[5]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using column permutation for last level blocks\n")); 209*48a46eb9SPierre Jolivet if (parms->meth[6]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using row scaling for last level blocks\n")); 210*48a46eb9SPierre Jolivet if (parms->meth[7]) PetscCall(PetscViewerASCIIPrintf(viewer, " Using column scaling for last level blocks\n")); 2119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " amount of fill-in for ilut, iluk and arms: %d\n", parms->lfil[0])); 2129566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " amount of fill-in for schur: %d\n", parms->lfil[4])); 2139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " amount of fill-in for ILUT L and U: %d\n", parms->lfil[5])); 2149566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " drop tolerance for L, U, L^{-1}F and EU^{-1}: %g\n", parms->droptol[0])); 2159566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " drop tolerance for schur complement at each level: %g\n", parms->droptol[4])); 2169566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " drop tolerance for ILUT in last level schur complement: %g\n", parms->droptol[5])); 217f3161b27SJose E. Roman } 218f3161b27SJose E. Roman PetscFunctionReturn(0); 219f3161b27SJose E. Roman } 220f3161b27SJose E. Roman 2219371c9d4SSatish Balay static PetscErrorCode PCDestroy_PARMS(PC pc) { 222f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 223f3161b27SJose E. Roman 224f3161b27SJose E. Roman PetscFunctionBegin; 2252fa5cd67SKarl Rupp if (parms->map) parms_MapFree(&parms->map); 2262fa5cd67SKarl Rupp if (parms->A) parms_MatFree(&parms->A); 2272fa5cd67SKarl Rupp if (parms->pc) parms_PCFree(&parms->pc); 2281baa6e33SBarry Smith if (parms->lvec0) PetscCall(PetscFree(parms->lvec0)); 2291baa6e33SBarry Smith if (parms->lvec1) PetscCall(PetscFree(parms->lvec1)); 2309566063dSJacob Faibussowitsch PetscCall(PetscFree(pc->data)); 231f3161b27SJose E. Roman 2329566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)pc, 0)); 2339566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetGlobal_C", NULL)); 2349566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetLocal_C", NULL)); 2359566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetSolveTolerances_C", NULL)); 2369566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetSolveRestart_C", NULL)); 2379566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetNonsymPerm_C", NULL)); 2389566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetFill_C", NULL)); 239f3161b27SJose E. Roman PetscFunctionReturn(0); 240f3161b27SJose E. Roman } 241f3161b27SJose E. Roman 2429371c9d4SSatish Balay static PetscErrorCode PCSetFromOptions_PARMS(PC pc, PetscOptionItems *PetscOptionsObject) { 243f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 244f3161b27SJose E. Roman PetscBool flag; 245f3161b27SJose E. Roman PCPARMSGlobalType global; 246f3161b27SJose E. Roman PCPARMSLocalType local; 247f3161b27SJose E. Roman 248f3161b27SJose E. Roman PetscFunctionBegin; 249d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "PARMS Options"); 2509566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-pc_parms_global", "Global preconditioner", "PCPARMSSetGlobal", PCPARMSGlobalTypes, (PetscEnum)parms->global, (PetscEnum *)&global, &flag)); 2519566063dSJacob Faibussowitsch if (flag) PetscCall(PCPARMSSetGlobal(pc, global)); 2529566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-pc_parms_local", "Local preconditioner", "PCPARMSSetLocal", PCPARMSLocalTypes, (PetscEnum)parms->local, (PetscEnum *)&local, &flag)); 2539566063dSJacob Faibussowitsch if (flag) PetscCall(PCPARMSSetLocal(pc, local)); 2549566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-pc_parms_solve_tol", "Tolerance for local solve", "PCPARMSSetSolveTolerances", parms->solvetol, &parms->solvetol, NULL)); 2559566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_levels", "Number of levels", "None", parms->levels, &parms->levels, NULL)); 2569566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_nonsymmetric_perm", "Use nonsymmetric permutation", "PCPARMSSetNonsymPerm", parms->nonsymperm, &parms->nonsymperm, NULL)); 2579566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_blocksize", "Block size", "None", parms->blocksize, &parms->blocksize, NULL)); 2589566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-pc_parms_ind_tol", "Tolerance for independent sets", "None", parms->indtol, &parms->indtol, NULL)); 2599566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_max_dim", "Inner Krylov dimension", "PCPARMSSetSolveRestart", parms->maxdim, &parms->maxdim, NULL)); 2609566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_max_it", "Maximum number of inner iterations", "PCPARMSSetSolveTolerances", parms->maxits, &parms->maxits, NULL)); 2619566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_inter_nonsymmetric_perm", "nonsymmetric permutation for interlevel blocks", "None", parms->meth[0], &parms->meth[0], NULL)); 2629566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_inter_column_perm", "column permutation for interlevel blocks", "None", parms->meth[1], &parms->meth[1], NULL)); 2639566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_inter_row_scaling", "row scaling for interlevel blocks", "None", parms->meth[2], &parms->meth[2], NULL)); 2649566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_inter_column_scaling", "column scaling for interlevel blocks", "None", parms->meth[3], &parms->meth[3], NULL)); 2659566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_last_nonsymmetric_perm", "nonsymmetric permutation for last level blocks", "None", parms->meth[4], &parms->meth[4], NULL)); 2669566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_last_column_perm", "column permutation for last level blocks", "None", parms->meth[5], &parms->meth[5], NULL)); 2679566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_last_row_scaling", "row scaling for last level blocks", "None", parms->meth[6], &parms->meth[6], NULL)); 2689566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-pc_parms_last_column_scaling", "column scaling for last level blocks", "None", parms->meth[7], &parms->meth[7], NULL)); 2699566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_lfil_ilu_arms", "amount of fill-in for ilut, iluk and arms", "PCPARMSSetFill", parms->lfil[0], &parms->lfil[0], &flag)); 270f3161b27SJose E. Roman if (flag) parms->lfil[1] = parms->lfil[2] = parms->lfil[3] = parms->lfil[0]; 2719566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_lfil_schur", "amount of fill-in for schur", "PCPARMSSetFill", parms->lfil[4], &parms->lfil[4], NULL)); 2729566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-pc_parms_lfil_ilut_L_U", "amount of fill-in for ILUT L and U", "PCPARMSSetFill", parms->lfil[5], &parms->lfil[5], &flag)); 273f3161b27SJose E. Roman if (flag) parms->lfil[6] = parms->lfil[5]; 2749566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-pc_parms_droptol_factors", "drop tolerance for L, U, L^{-1}F and EU^{-1}", "None", parms->droptol[0], &parms->droptol[0], NULL)); 2759566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-pc_parms_droptol_schur_compl", "drop tolerance for schur complement at each level", "None", parms->droptol[4], &parms->droptol[4], &flag)); 276f3161b27SJose E. Roman if (flag) parms->droptol[1] = parms->droptol[2] = parms->droptol[3] = parms->droptol[0]; 2779566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-pc_parms_droptol_last_schur", "drop tolerance for ILUT in last level schur complement", "None", parms->droptol[5], &parms->droptol[5], &flag)); 278f3161b27SJose E. Roman if (flag) parms->droptol[6] = parms->droptol[5]; 279d0609cedSBarry Smith PetscOptionsHeadEnd(); 280f3161b27SJose E. Roman PetscFunctionReturn(0); 281f3161b27SJose E. Roman } 282f3161b27SJose E. Roman 2839371c9d4SSatish Balay static PetscErrorCode PCApply_PARMS(PC pc, Vec b, Vec x) { 284f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 285f3161b27SJose E. Roman const PetscScalar *b1; 286f3161b27SJose E. Roman PetscScalar *x1; 287f3161b27SJose E. Roman 288f3161b27SJose E. Roman PetscFunctionBegin; 2899566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(b, &b1)); 2909566063dSJacob Faibussowitsch PetscCall(VecGetArray(x, &x1)); 291f3161b27SJose E. Roman parms_VecPermAux((PetscScalar *)b1, parms->lvec0, parms->map); 292f3161b27SJose E. Roman parms_PCApply(parms->pc, parms->lvec0, parms->lvec1); 293f3161b27SJose E. Roman parms_VecInvPermAux(parms->lvec1, x1, parms->map); 2949566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(b, &b1)); 2959566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(x, &x1)); 296f3161b27SJose E. Roman PetscFunctionReturn(0); 297f3161b27SJose E. Roman } 298f3161b27SJose E. Roman 2999371c9d4SSatish Balay static PetscErrorCode PCPARMSSetGlobal_PARMS(PC pc, PCPARMSGlobalType type) { 300f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 301f3161b27SJose E. Roman 302f3161b27SJose E. Roman PetscFunctionBegin; 303f3161b27SJose E. Roman if (type != parms->global) { 304f3161b27SJose E. Roman parms->global = type; 305f3161b27SJose E. Roman pc->setupcalled = 0; 306f3161b27SJose E. Roman } 307f3161b27SJose E. Roman PetscFunctionReturn(0); 308f3161b27SJose E. Roman } 309f3161b27SJose E. Roman 3105de0dacdSJose E. Roman /*@ 311f3161b27SJose E. Roman PCPARMSSetGlobal - Sets the global preconditioner to be used in PARMS. 312f3161b27SJose E. Roman 313f3161b27SJose E. Roman Collective on PC 314f3161b27SJose E. Roman 315f3161b27SJose E. Roman Input Parameters: 316f3161b27SJose E. Roman + pc - the preconditioner context 317f3161b27SJose E. Roman - type - the global preconditioner type, one of 318f3161b27SJose E. Roman .vb 319f3161b27SJose E. Roman PC_PARMS_GLOBAL_RAS - Restricted additive Schwarz 320f3161b27SJose E. Roman PC_PARMS_GLOBAL_SCHUR - Schur complement 321f3161b27SJose E. Roman PC_PARMS_GLOBAL_BJ - Block Jacobi 322f3161b27SJose E. Roman .ve 323f3161b27SJose E. Roman 324f3161b27SJose E. Roman Options Database Keys: 325f3161b27SJose E. Roman -pc_parms_global [ras,schur,bj] - Sets global preconditioner 326f3161b27SJose E. Roman 327f3161b27SJose E. Roman Level: intermediate 328f3161b27SJose E. Roman 329f3161b27SJose E. Roman Notes: 330f3161b27SJose E. Roman See the pARMS function parms_PCSetType for more information. 331f3161b27SJose E. Roman 332db781477SPatrick Sanan .seealso: `PCPARMS`, `PCPARMSSetLocal()` 333f3161b27SJose E. Roman @*/ 3349371c9d4SSatish Balay PetscErrorCode PCPARMSSetGlobal(PC pc, PCPARMSGlobalType type) { 335f3161b27SJose E. Roman PetscFunctionBegin; 336f3161b27SJose E. Roman PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 337f3161b27SJose E. Roman PetscValidLogicalCollectiveEnum(pc, type, 2); 338cac4c232SBarry Smith PetscTryMethod(pc, "PCPARMSSetGlobal_C", (PC, PCPARMSGlobalType), (pc, type)); 339f3161b27SJose E. Roman PetscFunctionReturn(0); 340f3161b27SJose E. Roman } 341f3161b27SJose E. Roman 3429371c9d4SSatish Balay static PetscErrorCode PCPARMSSetLocal_PARMS(PC pc, PCPARMSLocalType type) { 343f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 344f3161b27SJose E. Roman 345f3161b27SJose E. Roman PetscFunctionBegin; 346f3161b27SJose E. Roman if (type != parms->local) { 347f3161b27SJose E. Roman parms->local = type; 348f3161b27SJose E. Roman pc->setupcalled = 0; 349f3161b27SJose E. Roman } 350f3161b27SJose E. Roman PetscFunctionReturn(0); 351f3161b27SJose E. Roman } 352f3161b27SJose E. Roman 3535de0dacdSJose E. Roman /*@ 354f3161b27SJose E. Roman PCPARMSSetLocal - Sets the local preconditioner to be used in PARMS. 355f3161b27SJose E. Roman 356f3161b27SJose E. Roman Collective on PC 357f3161b27SJose E. Roman 358f3161b27SJose E. Roman Input Parameters: 359f3161b27SJose E. Roman + pc - the preconditioner context 360f3161b27SJose E. Roman - type - the local preconditioner type, one of 361f3161b27SJose E. Roman .vb 362f3161b27SJose E. Roman PC_PARMS_LOCAL_ILU0 - ILU0 preconditioner 363f3161b27SJose E. Roman PC_PARMS_LOCAL_ILUK - ILU(k) preconditioner 364f3161b27SJose E. Roman PC_PARMS_LOCAL_ILUT - ILUT preconditioner 365f3161b27SJose E. Roman PC_PARMS_LOCAL_ARMS - ARMS preconditioner 366f3161b27SJose E. Roman .ve 367f3161b27SJose E. Roman 368f3161b27SJose E. Roman Options Database Keys: 369f3161b27SJose E. Roman -pc_parms_local [ilu0,iluk,ilut,arms] - Sets local preconditioner 370f3161b27SJose E. Roman 371f3161b27SJose E. Roman Level: intermediate 372f3161b27SJose E. Roman 373f3161b27SJose E. Roman Notes: 374f3161b27SJose E. Roman For the ARMS preconditioner, one can use either the symmetric ARMS or the non-symmetric 375f3161b27SJose E. Roman variant (ARMS-ddPQ) by setting the permutation type with PCPARMSSetNonsymPerm(). 376f3161b27SJose E. Roman 377f3161b27SJose E. Roman See the pARMS function parms_PCILUSetType for more information. 378f3161b27SJose E. Roman 379db781477SPatrick Sanan .seealso: `PCPARMS`, `PCPARMSSetGlobal()`, `PCPARMSSetNonsymPerm()` 380f3161b27SJose E. Roman 381f3161b27SJose E. Roman @*/ 3829371c9d4SSatish Balay PetscErrorCode PCPARMSSetLocal(PC pc, PCPARMSLocalType type) { 383f3161b27SJose E. Roman PetscFunctionBegin; 384f3161b27SJose E. Roman PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 385f3161b27SJose E. Roman PetscValidLogicalCollectiveEnum(pc, type, 2); 386cac4c232SBarry Smith PetscTryMethod(pc, "PCPARMSSetLocal_C", (PC, PCPARMSLocalType), (pc, type)); 387f3161b27SJose E. Roman PetscFunctionReturn(0); 388f3161b27SJose E. Roman } 389f3161b27SJose E. Roman 3909371c9d4SSatish Balay static PetscErrorCode PCPARMSSetSolveTolerances_PARMS(PC pc, PetscReal tol, PetscInt maxits) { 391f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 392f3161b27SJose E. Roman 393f3161b27SJose E. Roman PetscFunctionBegin; 394f3161b27SJose E. Roman if (tol != parms->solvetol) { 395f3161b27SJose E. Roman parms->solvetol = tol; 396f3161b27SJose E. Roman pc->setupcalled = 0; 397f3161b27SJose E. Roman } 398f3161b27SJose E. Roman if (maxits != parms->maxits) { 399f3161b27SJose E. Roman parms->maxits = maxits; 400f3161b27SJose E. Roman pc->setupcalled = 0; 401f3161b27SJose E. Roman } 402f3161b27SJose E. Roman PetscFunctionReturn(0); 403f3161b27SJose E. Roman } 404f3161b27SJose E. Roman 4055de0dacdSJose E. Roman /*@ 406f3161b27SJose E. Roman PCPARMSSetSolveTolerances - Sets the convergence tolerance and the maximum iterations for the 407f3161b27SJose E. Roman inner GMRES solver, when the Schur global preconditioner is used. 408f3161b27SJose E. Roman 409f3161b27SJose E. Roman Collective on PC 410f3161b27SJose E. Roman 411f3161b27SJose E. Roman Input Parameters: 412f3161b27SJose E. Roman + pc - the preconditioner context 413f3161b27SJose E. Roman . tol - the convergence tolerance 414f3161b27SJose E. Roman - maxits - the maximum number of iterations to use 415f3161b27SJose E. Roman 416f3161b27SJose E. Roman Options Database Keys: 417f3161b27SJose E. Roman + -pc_parms_solve_tol - set the tolerance for local solve 418f3161b27SJose E. Roman - -pc_parms_max_it - set the maximum number of inner iterations 419f3161b27SJose E. Roman 420f3161b27SJose E. Roman Level: intermediate 421f3161b27SJose E. Roman 422f3161b27SJose E. Roman Notes: 423f3161b27SJose E. Roman See the pARMS functions parms_PCSetInnerEps and parms_PCSetInnerMaxits for more information. 424f3161b27SJose E. Roman 425db781477SPatrick Sanan .seealso: `PCPARMS`, `PCPARMSSetSolveRestart()` 426f3161b27SJose E. Roman @*/ 4279371c9d4SSatish Balay PetscErrorCode PCPARMSSetSolveTolerances(PC pc, PetscReal tol, PetscInt maxits) { 428f3161b27SJose E. Roman PetscFunctionBegin; 429f3161b27SJose E. Roman PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 430cac4c232SBarry Smith PetscTryMethod(pc, "PCPARMSSetSolveTolerances_C", (PC, PetscReal, PetscInt), (pc, tol, maxits)); 431f3161b27SJose E. Roman PetscFunctionReturn(0); 432f3161b27SJose E. Roman } 433f3161b27SJose E. Roman 4349371c9d4SSatish Balay static PetscErrorCode PCPARMSSetSolveRestart_PARMS(PC pc, PetscInt restart) { 435f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 436f3161b27SJose E. Roman 437f3161b27SJose E. Roman PetscFunctionBegin; 438f3161b27SJose E. Roman if (restart != parms->maxdim) { 439f3161b27SJose E. Roman parms->maxdim = restart; 440f3161b27SJose E. Roman pc->setupcalled = 0; 441f3161b27SJose E. Roman } 442f3161b27SJose E. Roman PetscFunctionReturn(0); 443f3161b27SJose E. Roman } 444f3161b27SJose E. Roman 4455de0dacdSJose E. Roman /*@ 446f3161b27SJose E. Roman PCPARMSSetSolveRestart - Sets the number of iterations at which the 447f3161b27SJose E. Roman inner GMRES solver restarts. 448f3161b27SJose E. Roman 449f3161b27SJose E. Roman Collective on PC 450f3161b27SJose E. Roman 451f3161b27SJose E. Roman Input Parameters: 452f3161b27SJose E. Roman + pc - the preconditioner context 453f3161b27SJose E. Roman - restart - maximum dimension of the Krylov subspace 454f3161b27SJose E. Roman 455f3161b27SJose E. Roman Options Database Keys: 456f3161b27SJose E. Roman . -pc_parms_max_dim - sets the inner Krylov dimension 457f3161b27SJose E. Roman 458f3161b27SJose E. Roman Level: intermediate 459f3161b27SJose E. Roman 460f3161b27SJose E. Roman Notes: 461f3161b27SJose E. Roman See the pARMS function parms_PCSetInnerKSize for more information. 462f3161b27SJose E. Roman 463db781477SPatrick Sanan .seealso: `PCPARMS`, `PCPARMSSetSolveTolerances()` 464f3161b27SJose E. Roman @*/ 4659371c9d4SSatish Balay PetscErrorCode PCPARMSSetSolveRestart(PC pc, PetscInt restart) { 466f3161b27SJose E. Roman PetscFunctionBegin; 467f3161b27SJose E. Roman PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 468cac4c232SBarry Smith PetscTryMethod(pc, "PCPARMSSetSolveRestart_C", (PC, PetscInt), (pc, restart)); 469f3161b27SJose E. Roman PetscFunctionReturn(0); 470f3161b27SJose E. Roman } 471f3161b27SJose E. Roman 4729371c9d4SSatish Balay static PetscErrorCode PCPARMSSetNonsymPerm_PARMS(PC pc, PetscBool nonsym) { 473f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 474f3161b27SJose E. Roman 475f3161b27SJose E. Roman PetscFunctionBegin; 4765de0dacdSJose E. Roman if ((nonsym && !parms->nonsymperm) || (!nonsym && parms->nonsymperm)) { 477f3161b27SJose E. Roman parms->nonsymperm = nonsym; 478f3161b27SJose E. Roman pc->setupcalled = 0; 479f3161b27SJose E. Roman } 480f3161b27SJose E. Roman PetscFunctionReturn(0); 481f3161b27SJose E. Roman } 482f3161b27SJose E. Roman 4835de0dacdSJose E. Roman /*@ 484f3161b27SJose E. Roman PCPARMSSetNonsymPerm - Sets the type of permutation for the ARMS preconditioner: the standard 485f3161b27SJose E. Roman symmetric ARMS or the non-symmetric ARMS (ARMS-ddPQ). 486f3161b27SJose E. Roman 487f3161b27SJose E. Roman Collective on PC 488f3161b27SJose E. Roman 489f3161b27SJose E. Roman Input Parameters: 490f3161b27SJose E. Roman + pc - the preconditioner context 491f3161b27SJose E. Roman - nonsym - PETSC_TRUE indicates the non-symmetric ARMS is used; 492f3161b27SJose E. Roman PETSC_FALSE indicates the symmetric ARMS is used 493f3161b27SJose E. Roman 494f3161b27SJose E. Roman Options Database Keys: 495f3161b27SJose E. Roman . -pc_parms_nonsymmetric_perm - sets the use of nonsymmetric permutation 496f3161b27SJose E. Roman 497f3161b27SJose E. Roman Level: intermediate 498f3161b27SJose E. Roman 499f3161b27SJose E. Roman Notes: 500f3161b27SJose E. Roman See the pARMS function parms_PCSetPermType for more information. 501f3161b27SJose E. Roman 502db781477SPatrick Sanan .seealso: `PCPARMS` 503f3161b27SJose E. Roman @*/ 5049371c9d4SSatish Balay PetscErrorCode PCPARMSSetNonsymPerm(PC pc, PetscBool nonsym) { 505f3161b27SJose E. Roman PetscFunctionBegin; 506f3161b27SJose E. Roman PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 507cac4c232SBarry Smith PetscTryMethod(pc, "PCPARMSSetNonsymPerm_C", (PC, PetscBool), (pc, nonsym)); 508f3161b27SJose E. Roman PetscFunctionReturn(0); 509f3161b27SJose E. Roman } 510f3161b27SJose E. Roman 5119371c9d4SSatish Balay static PetscErrorCode PCPARMSSetFill_PARMS(PC pc, PetscInt lfil0, PetscInt lfil1, PetscInt lfil2) { 512f3161b27SJose E. Roman PC_PARMS *parms = (PC_PARMS *)pc->data; 513f3161b27SJose E. Roman 514f3161b27SJose E. Roman PetscFunctionBegin; 515f3161b27SJose E. Roman if (lfil0 != parms->lfil[0] || lfil0 != parms->lfil[1] || lfil0 != parms->lfil[2] || lfil0 != parms->lfil[3]) { 516f3161b27SJose E. Roman parms->lfil[1] = parms->lfil[2] = parms->lfil[3] = parms->lfil[0] = lfil0; 517f3161b27SJose E. Roman pc->setupcalled = 0; 518f3161b27SJose E. Roman } 519f3161b27SJose E. Roman if (lfil1 != parms->lfil[4]) { 520f3161b27SJose E. Roman parms->lfil[4] = lfil1; 521f3161b27SJose E. Roman pc->setupcalled = 0; 522f3161b27SJose E. Roman } 523f3161b27SJose E. Roman if (lfil2 != parms->lfil[5] || lfil2 != parms->lfil[6]) { 524f3161b27SJose E. Roman parms->lfil[5] = parms->lfil[6] = lfil2; 525f3161b27SJose E. Roman pc->setupcalled = 0; 526f3161b27SJose E. Roman } 527f3161b27SJose E. Roman PetscFunctionReturn(0); 528f3161b27SJose E. Roman } 529f3161b27SJose E. Roman 5305de0dacdSJose E. Roman /*@ 531f3161b27SJose E. Roman PCPARMSSetFill - Sets the fill-in parameters for ILUT, ILUK and ARMS preconditioners. 532f3161b27SJose E. Roman Consider the original matrix A = [B F; E C] and the approximate version 533f3161b27SJose E. Roman M = [LB 0; E/UB I]*[UB LB\F; 0 S]. 534f3161b27SJose E. Roman 535f3161b27SJose E. Roman Collective on PC 536f3161b27SJose E. Roman 537f3161b27SJose E. Roman Input Parameters: 538f3161b27SJose E. Roman + pc - the preconditioner context 539f3161b27SJose E. Roman . fil0 - the level of fill-in kept in LB, UB, E/UB and LB\F 540f3161b27SJose E. Roman . fil1 - the level of fill-in kept in S 541f3161b27SJose E. Roman - fil2 - the level of fill-in kept in the L and U parts of the LU factorization of S 542f3161b27SJose E. Roman 543f3161b27SJose E. Roman Options Database Keys: 544f3161b27SJose E. Roman + -pc_parms_lfil_ilu_arms - set the amount of fill-in for ilut, iluk and arms 545f3161b27SJose E. Roman . -pc_parms_lfil_schur - set the amount of fill-in for schur 546f3161b27SJose E. Roman - -pc_parms_lfil_ilut_L_U - set the amount of fill-in for ILUT L and U 547f3161b27SJose E. Roman 548f3161b27SJose E. Roman Level: intermediate 549f3161b27SJose E. Roman 550f3161b27SJose E. Roman Notes: 551f3161b27SJose E. Roman See the pARMS function parms_PCSetFill for more information. 552f3161b27SJose E. Roman 553db781477SPatrick Sanan .seealso: `PCPARMS` 554f3161b27SJose E. Roman @*/ 5559371c9d4SSatish Balay PetscErrorCode PCPARMSSetFill(PC pc, PetscInt lfil0, PetscInt lfil1, PetscInt lfil2) { 556f3161b27SJose E. Roman PetscFunctionBegin; 557f3161b27SJose E. Roman PetscValidHeaderSpecific(pc, PC_CLASSID, 1); 558cac4c232SBarry Smith PetscTryMethod(pc, "PCPARMSSetFill_C", (PC, PetscInt, PetscInt, PetscInt), (pc, lfil0, lfil1, lfil2)); 559f3161b27SJose E. Roman PetscFunctionReturn(0); 560f3161b27SJose E. Roman } 561f3161b27SJose E. Roman 562f3161b27SJose E. Roman /*MC 563f3161b27SJose E. Roman PCPARMS - Allows the use of the parallel Algebraic Recursive Multilevel Solvers 564f3161b27SJose E. Roman available in the package pARMS 565f3161b27SJose E. Roman 566f3161b27SJose E. Roman Options Database Keys: 567f3161b27SJose E. Roman + -pc_parms_global - one of ras, schur, bj 568f3161b27SJose E. Roman . -pc_parms_local - one of ilu0, iluk, ilut, arms 569f3161b27SJose E. Roman . -pc_parms_solve_tol - set the tolerance for local solve 570f3161b27SJose E. Roman . -pc_parms_levels - set the number of levels 571f3161b27SJose E. Roman . -pc_parms_nonsymmetric_perm - set the use of nonsymmetric permutation 572f3161b27SJose E. Roman . -pc_parms_blocksize - set the block size 573f3161b27SJose E. Roman . -pc_parms_ind_tol - set the tolerance for independent sets 574f3161b27SJose E. Roman . -pc_parms_max_dim - set the inner krylov dimension 575f3161b27SJose E. Roman . -pc_parms_max_it - set the maximum number of inner iterations 5764b62eef3SJose E. Roman . -pc_parms_inter_nonsymmetric_perm - set the use of nonsymmetric permutation for interlevel blocks 577f3161b27SJose E. Roman . -pc_parms_inter_column_perm - set the use of column permutation for interlevel blocks 578f3161b27SJose E. Roman . -pc_parms_inter_row_scaling - set the use of row scaling for interlevel blocks 579f3161b27SJose E. Roman . -pc_parms_inter_column_scaling - set the use of column scaling for interlevel blocks 5804b62eef3SJose E. Roman . -pc_parms_last_nonsymmetric_perm - set the use of nonsymmetric permutation for last level blocks 581f3161b27SJose E. Roman . -pc_parms_last_column_perm - set the use of column permutation for last level blocks 582f3161b27SJose E. Roman . -pc_parms_last_row_scaling - set the use of row scaling for last level blocks 583f3161b27SJose E. Roman . -pc_parms_last_column_scaling - set the use of column scaling for last level blocks 584f3161b27SJose E. Roman . -pc_parms_lfil_ilu_arms - set the amount of fill-in for ilut, iluk and arms 585f3161b27SJose E. Roman . -pc_parms_lfil_schur - set the amount of fill-in for schur 586f3161b27SJose E. Roman . -pc_parms_lfil_ilut_L_U - set the amount of fill-in for ILUT L and U 587f3161b27SJose E. Roman . -pc_parms_droptol_factors - set the drop tolerance for L, U, L^{-1}F and EU^{-1} 588f3161b27SJose E. Roman . -pc_parms_droptol_schur_compl - set the drop tolerance for schur complement at each level 589f3161b27SJose E. Roman - -pc_parms_droptol_last_schur - set the drop tolerance for ILUT in last level schur complement 590f3161b27SJose E. Roman 591f3161b27SJose E. Roman IMPORTANT: 592f3161b27SJose E. Roman Unless configured appropriately, this preconditioner performs an inexact solve 593f3161b27SJose E. Roman as part of the preconditioner application. Therefore, it must be used in combination 594f6a5184aSRichard Tran Mills with flexible variants of iterative solvers, such as KSPFGMRES or KSPGCR. 595f3161b27SJose E. Roman 596f3161b27SJose E. Roman Level: intermediate 597f3161b27SJose E. Roman 598db781477SPatrick Sanan .seealso: `PCCreate()`, `PCSetType()`, `PCType`, `PC` 599f3161b27SJose E. Roman M*/ 600f3161b27SJose E. Roman 6019371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PCCreate_PARMS(PC pc) { 602f3161b27SJose E. Roman PC_PARMS *parms; 603f3161b27SJose E. Roman 604f3161b27SJose E. Roman PetscFunctionBegin; 6059566063dSJacob Faibussowitsch PetscCall(PetscNewLog(pc, &parms)); 6062fa5cd67SKarl Rupp 607f3161b27SJose E. Roman parms->map = 0; 608f3161b27SJose E. Roman parms->A = 0; 609f3161b27SJose E. Roman parms->pc = 0; 610abd6c125SJose E. Roman parms->global = PC_PARMS_GLOBAL_RAS; 611f3161b27SJose E. Roman parms->local = PC_PARMS_LOCAL_ARMS; 612f3161b27SJose E. Roman parms->levels = 10; 613f3161b27SJose E. Roman parms->nonsymperm = PETSC_TRUE; 614f3161b27SJose E. Roman parms->blocksize = 250; 615abd6c125SJose E. Roman parms->maxdim = 0; 616abd6c125SJose E. Roman parms->maxits = 0; 6174b62eef3SJose E. Roman parms->meth[0] = PETSC_FALSE; 6184b62eef3SJose E. Roman parms->meth[1] = PETSC_FALSE; 6194b62eef3SJose E. Roman parms->meth[2] = PETSC_FALSE; 6204b62eef3SJose E. Roman parms->meth[3] = PETSC_FALSE; 6214b62eef3SJose E. Roman parms->meth[4] = PETSC_FALSE; 6224b62eef3SJose E. Roman parms->meth[5] = PETSC_FALSE; 6234b62eef3SJose E. Roman parms->meth[6] = PETSC_FALSE; 6244b62eef3SJose E. Roman parms->meth[7] = PETSC_FALSE; 625f3161b27SJose E. Roman parms->solvetol = 0.01; 626f3161b27SJose E. Roman parms->indtol = 0.4; 627f3161b27SJose E. Roman parms->lfil[0] = parms->lfil[1] = parms->lfil[2] = parms->lfil[3] = 20; 628f3161b27SJose E. Roman parms->lfil[4] = parms->lfil[5] = parms->lfil[6] = 20; 629f3161b27SJose E. Roman parms->droptol[0] = parms->droptol[1] = parms->droptol[2] = parms->droptol[3] = 0.00001; 630f3161b27SJose E. Roman parms->droptol[4] = 0.001; 631f3161b27SJose E. Roman parms->droptol[5] = parms->droptol[6] = 0.001; 6322fa5cd67SKarl Rupp 633f3161b27SJose E. Roman pc->data = parms; 634f3161b27SJose E. Roman pc->ops->destroy = PCDestroy_PARMS; 635f3161b27SJose E. Roman pc->ops->setfromoptions = PCSetFromOptions_PARMS; 636f3161b27SJose E. Roman pc->ops->setup = PCSetUp_PARMS; 637f3161b27SJose E. Roman pc->ops->apply = PCApply_PARMS; 638f3161b27SJose E. Roman pc->ops->view = PCView_PARMS; 6392fa5cd67SKarl Rupp 6409566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetGlobal_C", PCPARMSSetGlobal_PARMS)); 6419566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetLocal_C", PCPARMSSetLocal_PARMS)); 6429566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetSolveTolerances_C", PCPARMSSetSolveTolerances_PARMS)); 6439566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetSolveRestart_C", PCPARMSSetSolveRestart_PARMS)); 6449566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetNonsymPerm_C", PCPARMSSetNonsymPerm_PARMS)); 6459566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)pc, "PCPARMSSetFill_C", PCPARMSSetFill_PARMS)); 646f3161b27SJose E. Roman PetscFunctionReturn(0); 647f3161b27SJose E. Roman } 648