xref: /petsc/src/ksp/pc/impls/parms/parms.c (revision b45d2f2cb7e031d9c0de5873eca80614ca7b863b)
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