xref: /petsc/src/mat/interface/matrix.c (revision c752a4e5f57a3aac85b6ca038ac63f28f9587815)
1 #ifndef lint
2 static char vcid[] = "$Id: matrix.c,v 1.146 1996/02/24 00:02:06 balay Exp bsmith $";
3 #endif
4 
5 /*
6    This is where the abstract matrix operations are defined
7 */
8 
9 #include "petsc.h"
10 #include "matimpl.h"        /*I "mat.h" I*/
11 #include "vec/vecimpl.h"
12 #include "pinclude/pviewer.h"
13 #include "draw.h"
14 
15 /*@C
16    MatGetReordering - Gets a reordering for a matrix to reduce fill or to
17    improve numerical stability of LU factorization.
18 
19    Input Parameters:
20 .  mat - the matrix
21 .  type - type of reordering, one of the following:
22 $      ORDER_NATURAL - Natural
23 $      ORDER_ND - Nested Dissection
24 $      ORDER_1WD - One-way Dissection
25 $      ORDER_RCM - Reverse Cuthill-McGee
26 $      ORDER_QMD - Quotient Minimum Degree
27 
28    Output Parameters:
29 .  rperm - row permutation indices
30 .  cperm - column permutation indices
31 
32    Options Database Keys:
33    To specify the ordering through the options database, use one of
34    the following
35 $    -mat_order natural, -mat_order nd, -mat_order 1wd,
36 $    -mat_order rcm, -mat_order qmd
37 
38    Notes:
39    If the column permutations and row permutations are the same,
40    then MatGetReordering() returns 0 in cperm.
41 
42    The user can define additional orderings; see MatReorderingRegister().
43 
44 .keywords: matrix, set, ordering, factorization, direct, ILU, LU,
45            fill, reordering, natural, Nested Dissection,
46            One-way Dissection, Cholesky, Reverse Cuthill-McGee,
47            Quotient Minimum Degree
48 
49 .seealso:  MatGetReorderingTypeFromOptions(), MatReorderingRegister()
50 @*/
51 int MatGetReordering(Mat mat,MatOrdering type,IS *rperm,IS *cperm)
52 {
53   int         ierr;
54   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
55   if (!mat->assembled) SETERRQ(1,"MatGetReordering:Not for unassembled matrix");
56 
57   if (!mat->ops.getreordering) {*rperm = 0; *cperm = 0; return 0;}
58   PLogEventBegin(MAT_GetReordering,mat,0,0,0);
59   ierr = MatGetReorderingTypeFromOptions(0,&type); CHKERRQ(ierr);
60   ierr = (*mat->ops.getreordering)(mat,type,rperm,cperm); CHKERRQ(ierr);
61   PLogEventEnd(MAT_GetReordering,mat,0,0,0);
62   return 0;
63 }
64 
65 /*@C
66    MatGetRow - Gets a row of a matrix.  You MUST call MatRestoreRow()
67    for each row that you get to ensure that your application does
68    not bleed memory. The user may changes the values in the data
69    structures returned, but this must be done with extreme care since
70    these structures may represent the actual data in the matrix.
71 
72    Input Parameters:
73 .  mat - the matrix
74 .  row - the row to get
75 
76    Output Parameters:
77 .  ncols -  the number of nonzeros in the row
78 .  cols - if nonzero, the column numbers
79 .  vals - if nonzero, the values
80 
81    Notes:
82    This routine is provided for people who need to have direct access
83    to the structure of a matrix.  We hope that we provide enough
84    high-level matrix routines that few users will need it.
85 
86    For better efficiency, set cols and/or vals to zero if you do not
87    wish to extract these quantities.
88 
89 .keywords: matrix, row, get, extract
90 
91 .seealso: MatRestoreRow()
92 @*/
93 int MatGetRow(Mat mat,int row,int *ncols,int **cols,Scalar **vals)
94 {
95   int   ierr;
96   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
97   if (!mat->assembled) SETERRQ(1,"MatGetRow:Not for unassembled matrix");
98   PLogEventBegin(MAT_GetRow,mat,0,0,0);
99   ierr = (*mat->ops.getrow)(mat,row,ncols,cols,vals); CHKERRQ(ierr);
100   PLogEventEnd(MAT_GetRow,mat,0,0,0);
101   return 0;
102 }
103 
104 /*@C
105    MatRestoreRow - Frees any temporary space allocated by MatGetRow().
106 
107    Input Parameters:
108 .  mat - the matrix
109 .  row - the row to get
110 .  ncols, cols - the number of nonzeros and their columns
111 .  vals - if nonzero the column values
112 
113 .keywords: matrix, row, restore
114 
115 .seealso:  MatGetRow()
116 @*/
117 int MatRestoreRow(Mat mat,int row,int *ncols,int **cols,Scalar **vals)
118 {
119   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
120   if (!mat->assembled) SETERRQ(1,"MatRestoreRow:Not for unassembled matrix");
121   if (!mat->ops.restorerow) return 0;
122   return (*mat->ops.restorerow)(mat,row,ncols,cols,vals);
123 }
124 /*@
125    MatView - Visualizes a matrix object.
126 
127    Input Parameters:
128 .  mat - the matrix
129 .  ptr - visualization context
130 
131    Notes:
132    The available visualization contexts include
133 $     STDOUT_VIEWER_SELF - standard output (default)
134 $     STDOUT_VIEWER_WORLD - synchronized standard
135 $       output where only the first processor opens
136 $       the file.  All other processors send their
137 $       data to the first processor to print.
138 
139    The user can open alternative vistualization contexts with
140 $    ViewerFileOpenASCII() - output to a specified file
141 $    ViewerFileOpenBinary() - output in binary to a
142 $         specified file; corresponding input uses MatLoad()
143 $    DrawOpenX() - output nonzero matrix structure to
144 $         an X window display
145 $    ViewerMatlabOpen() - output matrix to Matlab viewer.
146 $         Currently only the sequential dense and AIJ
147 $         matrix types support the Matlab viewer.
148 
149    The user can call ViewerFileSetFormat() to specify the output
150    format of ASCII printed objects (when using STDOUT_VIEWER_SELF,
151    STDOUT_VIEWER_WORLD and ViewerFileOpenASCII).  Available formats include
152 $    FILE_FORMAT_DEFAULT - default, prints matrix contents
153 $    FILE_FORMAT_MATLAB - Matlab format
154 $    FILE_FORMAT_IMPL - implementation-specific format
155 $      (which is in many cases the same as the default)
156 $    FILE_FORMAT_INFO - basic information about the matrix
157 $      size and structure (not the matrix entries)
158 $    FILE_FORMAT_INFO_DETAILED - more detailed information about the
159 $      matrix structure
160 
161 .keywords: matrix, view, visualize, output, print, write, draw
162 
163 .seealso: ViewerFileSetFormat(), ViewerFileOpenASCII(), DrawOpenX(),
164           ViewerMatlabOpen(), ViewerFileOpenBinary(), MatLoad()
165 @*/
166 int MatView(Mat mat,Viewer ptr)
167 {
168   int          format, ierr, rows, cols,nz, nzalloc, mem;
169   FILE         *fd;
170   char         *cstring;
171   PetscObject  vobj = (PetscObject) ptr;
172 
173   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
174   if (!mat->assembled) SETERRQ(1,"MatView:Not for unassembled matrix");
175 
176   if (!ptr) { /* so that viewers may be used from debuggers */
177     ptr = STDOUT_VIEWER_SELF; vobj = (PetscObject) ptr;
178   }
179   ierr = ViewerFileGetFormat_Private(ptr,&format); CHKERRQ(ierr);
180   ierr = ViewerFileGetPointer(ptr,&fd); CHKERRQ(ierr);
181   if (vobj->cookie == VIEWER_COOKIE &&
182       (format == FILE_FORMAT_INFO || format == FILE_FORMAT_INFO_DETAILED) &&
183       (vobj->type == ASCII_FILE_VIEWER || vobj->type == ASCII_FILES_VIEWER)) {
184     MPIU_fprintf(mat->comm,fd,"Matrix Object:\n");
185     ierr = MatGetType(mat,PETSC_NULL,&cstring); CHKERRQ(ierr);
186     ierr = MatGetSize(mat,&rows,&cols); CHKERRQ(ierr);
187     MPIU_fprintf(mat->comm,fd,"  type=%s, rows=%d, cols=%d\n",cstring,rows,cols);
188     if (mat->ops.getinfo) {
189       ierr = MatGetInfo(mat,MAT_GLOBAL_SUM,&nz,&nzalloc,&mem); CHKERRQ(ierr);
190       MPIU_fprintf(mat->comm,fd,"  total: nonzeros=%d, allocated nonzeros=%d\n",nz,nzalloc);
191     }
192   }
193   if (mat->view) {ierr = (*mat->view)((PetscObject)mat,ptr); CHKERRQ(ierr);}
194   return 0;
195 }
196 /*@C
197    MatDestroy - Frees space taken by a matrix.
198 
199    Input Parameter:
200 .  mat - the matrix
201 
202 .keywords: matrix, destroy
203 @*/
204 int MatDestroy(Mat mat)
205 {
206   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
207   return (*mat->destroy)((PetscObject)mat);
208 }
209 /*@
210    MatValidMatrix - Checks whether a matrix object is valid.
211 
212    Input Parameter:
213 .  m - the matrix to check
214 
215    Output Parameter:
216    flg - flag indicating matrix status, either
217 $     1 if matrix is valid;
218 $     0 otherwise.
219 
220 .keywords: matrix, valid
221 @*/
222 int MatValidMatrix(Mat m,int *flg)
223 {
224   if (!m)                           *flg = 0;
225   else if (m->cookie != MAT_COOKIE) *flg = 0;
226   else                              *flg = 1;
227   return 0;
228 }
229 
230 /*@
231    MatSetValues - Inserts or adds a block of values into a matrix.
232    These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd()
233    MUST be called after all calls to MatSetValues() have been completed.
234 
235    Input Parameters:
236 .  mat - the matrix
237 .  v - a logically two-dimensional array of values
238 .  m, indexm - the number of rows and their global indices
239 .  n, indexn - the number of columns and their global indices
240 .  addv - either ADD_VALUES or INSERT_VALUES, where
241 $     ADD_VALUES - adds values to any existing entries
242 $     INSERT_VALUES - replaces existing entries with new values
243 
244    Notes:
245    By default the values, v, are row-oriented and unsorted.
246    See MatSetOptions() for other options.
247 
248    Calls to MatSetValues() with the INSERT_VALUES and ADD_VALUES
249    options cannot be mixed without intervening calls to the assembly
250    routines.
251 
252 .keywords: matrix, insert, add, set, values
253 
254 .seealso: MatSetOptions(), MatAssemblyBegin(), MatAssemblyEnd()
255 @*/
256 int MatSetValues(Mat mat,int m,int *idxm,int n,int *idxn,Scalar *v,
257                                                         InsertMode addv)
258 {
259   int ierr;
260   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
261 
262   if (mat->assembled) {
263     mat->was_assembled = PETSC_TRUE;
264     mat->assembled     = PETSC_FALSE;
265     mat->same_nonzero  = PETSC_TRUE;
266   }
267 
268   PLogEventBegin(MAT_SetValues,mat,0,0,0);
269   ierr = (*mat->ops.setvalues)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr);
270   PLogEventEnd(MAT_SetValues,mat,0,0,0);
271   return 0;
272 }
273 
274 /*@
275    MatGetValues - Gets a block of values from a matrix.
276 
277    Input Parameters:
278 .  mat - the matrix
279 .  v - a logically two-dimensional array for storing the values
280 .  m, indexm - the number of rows and their global indices
281 .  n, indexn - the number of columns and their global indices
282 
283    Notes:
284    The user must allocate space (m*n Scalars) for the values, v.
285    The values, v, are then returned in a row-oriented format,
286    analogous to that used by default in MatSetValues().
287 
288 .keywords: matrix, get, values
289 
290 .seealso: MatGetRow(), MatGetSubmatrix(), MatGetSubmatrices(), MatSetValues()
291 @*/
292 int MatGetValues(Mat mat,int m,int *idxm,int n,int *idxn,Scalar *v)
293 {
294   int ierr;
295 
296   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
297   if (!mat->assembled) SETERRQ(1,"MatGetValues:Not for unassembled matrix");
298 
299   PLogEventBegin(MAT_GetValues,mat,0,0,0);
300   ierr = (*mat->ops.getvalues)(mat,m,idxm,n,idxn,v); CHKERRQ(ierr);
301   PLogEventEnd(MAT_GetValues,mat,0,0,0);
302   return 0;
303 }
304 
305 /* --------------------------------------------------------*/
306 /*@
307    MatMult - Computes matrix-vector product.
308 
309    Input Parameters:
310 .  mat - the matrix
311 .  x   - the vector to be multilplied
312 
313    Output Parameters:
314 .  y - the result
315 
316 .keywords: matrix, multiply, matrix-vector product
317 
318 .seealso: MatMultTrans(), MatMultAdd(), MatMultTransAdd()
319 @*/
320 int MatMult(Mat mat,Vec x,Vec y)
321 {
322   int ierr;
323   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
324   PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE);
325   if (!mat->assembled) SETERRQ(1,"MatMult:Not for unassembled matrix");
326   if (x == y) SETERRQ(1,"MatMult:x and y must be different vectors");
327 
328   PLogEventBegin(MAT_Mult,mat,x,y,0);
329   ierr = (*mat->ops.mult)(mat,x,y); CHKERRQ(ierr);
330   PLogEventEnd(MAT_Mult,mat,x,y,0);
331   return 0;
332 }
333 /*@
334    MatMultTrans - Computes matrix transpose times a vector.
335 
336    Input Parameters:
337 .  mat - the matrix
338 .  x   - the vector to be multilplied
339 
340    Output Parameters:
341 .  y - the result
342 
343 .keywords: matrix, multiply, matrix-vector product, transpose
344 
345 .seealso: MatMult(), MatMultAdd(), MatMultTransAdd()
346 @*/
347 int MatMultTrans(Mat mat,Vec x,Vec y)
348 {
349   int ierr;
350   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
351   PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE);
352   if (!mat->assembled) SETERRQ(1,"MatMultTrans:Not for unassembled matrix");
353   if (x == y) SETERRQ(1,"MatMultTrans:x and y must be different vectors");
354 
355   PLogEventBegin(MAT_MultTrans,mat,x,y,0);
356   ierr = (*mat->ops.multtrans)(mat,x,y); CHKERRQ(ierr);
357   PLogEventEnd(MAT_MultTrans,mat,x,y,0);
358   return 0;
359 }
360 /*@
361     MatMultAdd -  Computes v3 = v2 + A * v1.
362 
363   Input Parameters:
364 .    mat - the matrix
365 .    v1, v2 - the vectors
366 
367   Output Parameters:
368 .    v3 - the result
369 
370 .keywords: matrix, multiply, matrix-vector product, add
371 
372 .seealso: MatMultTrans(), MatMult(), MatMultTransAdd()
373 @*/
374 int MatMultAdd(Mat mat,Vec v1,Vec v2,Vec v3)
375 {
376   int ierr;
377   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(v1,VEC_COOKIE);
378   PETSCVALIDHEADERSPECIFIC(v2,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(v3,VEC_COOKIE);
379   if (!mat->assembled) SETERRQ(1,"MatMultAdd:Not for unassembled matrix");
380 
381   PLogEventBegin(MAT_MultAdd,mat,v1,v2,v3);
382   if (v1 == v3) SETERRQ(1,"MatMultAdd:v1 and v3 must be different vectors");
383   ierr = (*mat->ops.multadd)(mat,v1,v2,v3); CHKERRQ(ierr);
384   PLogEventEnd(MAT_MultAdd,mat,v1,v2,v3);
385   return 0;
386 }
387 /*@
388     MatMultTransAdd - Computes v3 = v2 + A' * v1.
389 
390   Input Parameters:
391 .    mat - the matrix
392 .    v1, v2 - the vectors
393 
394   Output Parameters:
395 .    v3 - the result
396 
397 .keywords: matrix, multiply, matrix-vector product, transpose, add
398 
399 .seealso: MatMultTrans(), MatMultAdd(), MatMult()
400 @*/
401 int MatMultTransAdd(Mat mat,Vec v1,Vec v2,Vec v3)
402 {
403   int ierr;
404   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(v1,VEC_COOKIE);
405   PETSCVALIDHEADERSPECIFIC(v2,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(v3,VEC_COOKIE);
406   if (!mat->assembled) SETERRQ(1,"MatMultTransAdd:Not for unassembled matrix");
407   if (!mat->ops.multtransadd) SETERRQ(PETSC_ERR_SUP,"MatMultTransAdd");
408   if (v1 == v3) SETERRQ(1,"MatMultTransAdd:v1 and v2 must be different vectors");
409 
410   PLogEventBegin(MAT_MultTransAdd,mat,v1,v2,v3);
411   ierr = (*mat->ops.multtransadd)(mat,v1,v2,v3); CHKERRQ(ierr);
412   PLogEventEnd(MAT_MultTransAdd,mat,v1,v2,v3);
413   return 0;
414 }
415 /* ------------------------------------------------------------*/
416 /*@
417    MatGetInfo - Returns information about matrix storage (number of
418    nonzeros, memory).
419 
420    Input Parameters:
421 .  mat - the matrix
422 
423    Output Parameters:
424 .  flag - flag indicating the type of parameters to be returned
425 $    flag = MAT_LOCAL: local matrix
426 $    flag = MAT_GLOBAL_MAX: maximum over all processors
427 $    flag = MAT_GLOBAL_SUM: sum over all processors
428 .   nz - the number of nonzeros
429 .   nzalloc - the number of allocated nonzeros
430 .   mem - the memory used (in bytes)
431 
432 .keywords: matrix, get, info, storage, nonzeros, memory
433 @*/
434 int MatGetInfo(Mat mat,MatInfoType flag,int *nz,int *nzalloc,int *mem)
435 {
436   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
437   if (!mat->ops.getinfo) SETERRQ(PETSC_ERR_SUP,"MatGetInfo");
438   return  (*mat->ops.getinfo)(mat,flag,nz,nzalloc,mem);
439 }
440 /* ----------------------------------------------------------*/
441 /*@
442    MatLUFactor - Performs in-place LU factorization of matrix.
443 
444    Input Parameters:
445 .  mat - the matrix
446 .  row - row permutation
447 .  col - column permutation
448 .  f - expected fill as ratio of original fill.
449 
450 .keywords: matrix, factor, LU, in-place
451 
452 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor()
453 @*/
454 int MatLUFactor(Mat mat,IS row,IS col,double f)
455 {
456   int ierr;
457   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
458   if (!mat->ops.lufactor) SETERRQ(PETSC_ERR_SUP,"MatLUFactor");
459   if (!mat->assembled) SETERRQ(1,"MatLUFactor:Not for unassembled matrix");
460 
461   PLogEventBegin(MAT_LUFactor,mat,row,col,0);
462   ierr = (*mat->ops.lufactor)(mat,row,col,f); CHKERRQ(ierr);
463   PLogEventEnd(MAT_LUFactor,mat,row,col,0);
464   return 0;
465 }
466 /*@
467    MatILUFactor - Performs in-place ILU factorization of matrix.
468 
469    Input Parameters:
470 .  mat - the matrix
471 .  row - row permutation
472 .  col - column permutation
473 .  f - expected fill as ratio of original fill.
474 .  level - number of levels of fill.
475 
476    Note: probably really only in-place when level is zero.
477 .keywords: matrix, factor, ILU, in-place
478 
479 .seealso: MatILUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor()
480 @*/
481 int MatILUFactor(Mat mat,IS row,IS col,double f,int level)
482 {
483   int ierr;
484   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
485   if (!mat->ops.ilufactor) SETERRQ(PETSC_ERR_SUP,"MatILUFactor");
486   if (!mat->assembled) SETERRQ(1,"MatILUFactor:Not for unassembled matrix");
487 
488   PLogEventBegin(MAT_ILUFactor,mat,row,col,0);
489   ierr = (*mat->ops.ilufactor)(mat,row,col,f,level); CHKERRQ(ierr);
490   PLogEventEnd(MAT_ILUFactor,mat,row,col,0);
491   return 0;
492 }
493 
494 /*@
495    MatLUFactorSymbolic - Performs symbolic LU factorization of matrix.
496    Call this routine before calling MatLUFactorNumeric().
497 
498    Input Parameters:
499 .  mat - the matrix
500 .  row, col - row and column permutations
501 .  f - expected fill as ratio of the original number of nonzeros,
502        for example 3.0; choosing this parameter well can result in
503        more efficient use of time and space.
504 
505    Output Parameter:
506 .  fact - new matrix that has been symbolically factored
507 
508    Options Database Key:
509 $     -mat_lu_fill <f>, where f is the fill ratio
510 
511    Notes:
512    See the file $(PETSC_DIR)/Performace for additional information about
513    choosing the fill factor for better efficiency.
514 
515 .keywords: matrix, factor, LU, symbolic, fill
516 
517 .seealso: MatLUFactor(), MatLUFactorNumeric(), MatCholeskyFactor()
518 @*/
519 int MatLUFactorSymbolic(Mat mat,IS row,IS col,double f,Mat *fact)
520 {
521   int ierr,flg;
522   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
523   if (!fact) SETERRQ(1,"MatLUFactorSymbolic:Missing factor matrix argument");
524   if (!mat->ops.lufactorsymbolic) SETERRQ(PETSC_ERR_SUP,"MatLUFactorSymbolic");
525   if (!mat->assembled) SETERRQ(1,"MatLUFactorSymbolic:Not for unassembled matrix");
526 
527   ierr = OptionsGetDouble(PETSC_NULL,"-mat_lu_fill",&f,&flg); CHKERRQ(ierr);
528   PLogEventBegin(MAT_LUFactorSymbolic,mat,row,col,0);
529   ierr = (*mat->ops.lufactorsymbolic)(mat,row,col,f,fact); CHKERRQ(ierr);
530   PLogEventEnd(MAT_LUFactorSymbolic,mat,row,col,0);
531   return 0;
532 }
533 /*@
534    MatLUFactorNumeric - Performs numeric LU factorization of a matrix.
535    Call this routine after first calling MatLUFactorSymbolic().
536 
537    Input Parameters:
538 .  mat - the matrix
539 .  row, col - row and  column permutations
540 
541    Output Parameters:
542 .  fact - symbolically factored matrix that must have been generated
543           by MatLUFactorSymbolic()
544 
545    Notes:
546    See MatLUFactor() for in-place factorization.  See
547    MatCholeskyFactorNumeric() for the symmetric, positive definite case.
548 
549 .keywords: matrix, factor, LU, numeric
550 
551 .seealso: MatLUFactorSymbolic(), MatLUFactor(), MatCholeskyFactor()
552 @*/
553 int MatLUFactorNumeric(Mat mat,Mat *fact)
554 {
555   int ierr,flg;
556 
557   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
558   if (!fact) SETERRQ(1,"MatLUFactorNumeric:Missing factor matrix argument");
559   if (!mat->ops.lufactornumeric) SETERRQ(PETSC_ERR_SUP,"MatLUFactorNumeric");
560   if (!mat->assembled) SETERRQ(1,"MatLUFactorNumeric:Not for unassembled matrix");
561 
562   PLogEventBegin(MAT_LUFactorNumeric,mat,*fact,0,0);
563   ierr = (*mat->ops.lufactornumeric)(mat,fact); CHKERRQ(ierr);
564   PLogEventEnd(MAT_LUFactorNumeric,mat,*fact,0,0);
565   ierr = OptionsHasName(PETSC_NULL,"-mat_view_draw",&flg); CHKERRQ(ierr);
566   if (flg) {
567     Draw    win;
568     ierr = DrawOpenX((*fact)->comm,0,0,0,0,300,300,&win); CHKERRQ(ierr);
569     ierr = MatView(*fact,(Viewer)win); CHKERRQ(ierr);
570     ierr = DrawSyncFlush(win); CHKERRQ(ierr);
571     ierr = DrawDestroy(win); CHKERRQ(ierr);
572   }
573   return 0;
574 }
575 /*@
576    MatCholeskyFactor - Performs in-place Cholesky factorization of a
577    symmetric matrix.
578 
579    Input Parameters:
580 .  mat - the matrix
581 .  perm - row and column permutations
582 .  f - expected fill as ratio of original fill
583 
584    Notes:
585    See MatLUFactor() for the nonsymmetric case.  See also
586    MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric().
587 
588 .keywords: matrix, factor, in-place, Cholesky
589 
590 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric()
591 @*/
592 int MatCholeskyFactor(Mat mat,IS perm,double f)
593 {
594   int ierr;
595   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
596   if (!mat->ops.choleskyfactor) SETERRQ(PETSC_ERR_SUP,"MatCholeskyFactor");
597   if (!mat->assembled) SETERRQ(1,"MatCholeskyFactor:Not for unassembled matrix");
598 
599   PLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0);
600   ierr = (*mat->ops.choleskyfactor)(mat,perm,f); CHKERRQ(ierr);
601   PLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0);
602   return 0;
603 }
604 /*@
605    MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization
606    of a symmetric matrix.
607 
608    Input Parameters:
609 .  mat - the matrix
610 .  perm - row and column permutations
611 .  f - expected fill as ratio of original
612 
613    Output Parameter:
614 .  fact - the factored matrix
615 
616    Notes:
617    See MatLUFactorSymbolic() for the nonsymmetric case.  See also
618    MatCholeskyFactor() and MatCholeskyFactorNumeric().
619 
620 .keywords: matrix, factor, factorization, symbolic, Cholesky
621 
622 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric()
623 @*/
624 int MatCholeskyFactorSymbolic(Mat mat,IS perm,double f,Mat *fact)
625 {
626   int ierr;
627   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
628   if (!fact) SETERRQ(1,"MatCholeskyFactorSymbolic:Missing factor matrix argument");
629   if (!mat->ops.choleskyfactorsymbolic)SETERRQ(PETSC_ERR_SUP,"MatCholeskyFactorSymbolic");
630   if (!mat->assembled) SETERRQ(1,"MatCholeskyFactorSymbolic:Not for unassembled matrix");
631 
632   PLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0);
633   ierr = (*mat->ops.choleskyfactorsymbolic)(mat,perm,f,fact); CHKERRQ(ierr);
634   PLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0);
635   return 0;
636 }
637 /*@
638    MatCholeskyFactorNumeric - Performs numeric Cholesky factorization
639    of a symmetric matrix. Call this routine after first calling
640    MatCholeskyFactorSymbolic().
641 
642    Input Parameter:
643 .  mat - the initial matrix
644 
645    Output Parameter:
646 .  fact - the factored matrix
647 
648 .keywords: matrix, factor, numeric, Cholesky
649 
650 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric()
651 @*/
652 int MatCholeskyFactorNumeric(Mat mat,Mat *fact)
653 {
654   int ierr;
655   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
656   if (!fact) SETERRQ(1,"MatCholeskyFactorNumeric:Missing factor matrix argument");
657   if (!mat->ops.choleskyfactornumeric) SETERRQ(PETSC_ERR_SUP,"MatCholeskyFactorNumeric");
658   if (!mat->assembled) SETERRQ(1,"MatCholeskyFactorNumeric:Not for unassembled matrix");
659 
660   PLogEventBegin(MAT_CholeskyFactorNumeric,mat,*fact,0,0);
661   ierr = (*mat->ops.choleskyfactornumeric)(mat,fact); CHKERRQ(ierr);
662   PLogEventEnd(MAT_CholeskyFactorNumeric,mat,*fact,0,0);
663   return 0;
664 }
665 /* ----------------------------------------------------------------*/
666 /*@
667    MatSolve - Solves A x = b, given a factored matrix.
668 
669    Input Parameters:
670 .  mat - the factored matrix
671 .  b - the right-hand-side vector
672 
673    Output Parameter:
674 .  x - the result vector
675 
676 .keywords: matrix, linear system, solve, LU, Cholesky, triangular solve
677 
678 .seealso: MatSolveAdd(), MatSolveTrans(), MatSolveTransAdd()
679 @*/
680 int MatSolve(Mat mat,Vec b,Vec x)
681 {
682   int ierr;
683   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
684   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
685   if (x == b) SETERRQ(1,"MatSolve:x and y must be different vectors");
686   if (!mat->factor) SETERRQ(1,"MatSolve:Unfactored matrix");
687 
688   if (!mat->ops.solve) SETERRQ(PETSC_ERR_SUP,"MatSolve");
689   PLogEventBegin(MAT_Solve,mat,b,x,0);
690   ierr = (*mat->ops.solve)(mat,b,x); CHKERRQ(ierr);
691   PLogEventEnd(MAT_Solve,mat,b,x,0);
692   return 0;
693 }
694 
695 /* @
696    MatForwardSolve - Solves L x = b, given a factored matrix, A = LU.
697 
698    Input Parameters:
699 .  mat - the factored matrix
700 .  b - the right-hand-side vector
701 
702    Output Parameter:
703 .  x - the result vector
704 
705    Notes:
706    MatSolve() should be used for most applications, as it performs
707    a forward solve followed by a backward solve.
708 
709 .keywords: matrix, forward, LU, Cholesky, triangular solve
710 
711 .seealso: MatSolve(), MatBackwardSolve()
712 @ */
713 int MatForwardSolve(Mat mat,Vec b,Vec x)
714 {
715   int ierr;
716   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
717   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
718   if (x == b) SETERRQ(1,"MatForwardSolve:x and y must be different vectors");
719   if (!mat->factor) SETERRQ(1,"MatForwardSolve:Unfactored matrix");
720   if (!mat->ops.forwardsolve) SETERRQ(PETSC_ERR_SUP,"MatForwardSolve");
721 
722   PLogEventBegin(MAT_ForwardSolve,mat,b,x,0);
723   ierr = (*mat->ops.forwardsolve)(mat,b,x); CHKERRQ(ierr);
724   PLogEventEnd(MAT_ForwardSolve,mat,b,x,0);
725   return 0;
726 }
727 
728 /* @
729    MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU.
730 
731    Input Parameters:
732 .  mat - the factored matrix
733 .  b - the right-hand-side vector
734 
735    Output Parameter:
736 .  x - the result vector
737 
738    Notes:
739    MatSolve() should be used for most applications, as it performs
740    a forward solve followed by a backward solve.
741 
742 .keywords: matrix, backward, LU, Cholesky, triangular solve
743 
744 .seealso: MatSolve(), MatForwardSolve()
745 @ */
746 int MatBackwardSolve(Mat mat,Vec b,Vec x)
747 {
748   int ierr;
749   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
750   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
751   if (x == b) SETERRQ(1,"MatBackwardSolve:x and b must be different vectors");
752   if (!mat->factor) SETERRQ(1,"MatBackwardSolve:Unfactored matrix");
753   if (!mat->ops.backwardsolve) SETERRQ(PETSC_ERR_SUP,"MatBackwardSolve");
754 
755   PLogEventBegin(MAT_BackwardSolve,mat,b,x,0);
756   ierr = (*mat->ops.backwardsolve)(mat,b,x); CHKERRQ(ierr);
757   PLogEventEnd(MAT_BackwardSolve,mat,b,x,0);
758   return 0;
759 }
760 
761 /*@
762    MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix.
763 
764    Input Parameters:
765 .  mat - the factored matrix
766 .  b - the right-hand-side vector
767 .  y - the vector to be added to
768 
769    Output Parameter:
770 .  x - the result vector
771 
772 .keywords: matrix, linear system, solve, LU, Cholesky, add
773 
774 .seealso: MatSolve(), MatSolveTrans(), MatSolveTransAdd()
775 @*/
776 int MatSolveAdd(Mat mat,Vec b,Vec y,Vec x)
777 {
778   Scalar one = 1.0;
779   Vec    tmp;
780   int    ierr;
781   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE);
782   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
783   if (x == b) SETERRQ(1,"MatSolveAdd:x and b must be different vectors");
784   if (!mat->factor) SETERRQ(1,"MatSolveAdd:Unfactored matrix");
785 
786   PLogEventBegin(MAT_SolveAdd,mat,b,x,y);
787   if (mat->ops.solveadd)  {
788     ierr = (*mat->ops.solveadd)(mat,b,y,x); CHKERRQ(ierr);
789   }
790   else {
791     /* do the solve then the add manually */
792     if (x != y) {
793       ierr = MatSolve(mat,b,x); CHKERRQ(ierr);
794       ierr = VecAXPY(&one,y,x); CHKERRQ(ierr);
795     }
796     else {
797       ierr = VecDuplicate(x,&tmp); CHKERRQ(ierr);
798       PLogObjectParent(mat,tmp);
799       ierr = VecCopy(x,tmp); CHKERRQ(ierr);
800       ierr = MatSolve(mat,b,x); CHKERRQ(ierr);
801       ierr = VecAXPY(&one,tmp,x); CHKERRQ(ierr);
802       ierr = VecDestroy(tmp); CHKERRQ(ierr);
803     }
804   }
805   PLogEventEnd(MAT_SolveAdd,mat,b,x,y);
806   return 0;
807 }
808 /*@
809    MatSolveTrans - Solves A' x = b, given a factored matrix.
810 
811    Input Parameters:
812 .  mat - the factored matrix
813 .  b - the right-hand-side vector
814 
815    Output Parameter:
816 .  x - the result vector
817 
818 .keywords: matrix, linear system, solve, LU, Cholesky, transpose
819 
820 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransAdd()
821 @*/
822 int MatSolveTrans(Mat mat,Vec b,Vec x)
823 {
824   int ierr;
825   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
826   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
827   if (!mat->factor) SETERRQ(1,"MatSolveTrans:Unfactored matrix");
828   if (x == b) SETERRQ(1,"MatSolveTrans:x and b must be different vectors");
829   if (!mat->ops.solvetrans) SETERRQ(PETSC_ERR_SUP,"MatSolveTrans");
830 
831   PLogEventBegin(MAT_SolveTrans,mat,b,x,0);
832   ierr = (*mat->ops.solvetrans)(mat,b,x); CHKERRQ(ierr);
833   PLogEventEnd(MAT_SolveTrans,mat,b,x,0);
834   return 0;
835 }
836 /*@
837    MatSolveTransAdd - Computes x = y + inv(trans(A)) b, given a
838                       factored matrix.
839 
840    Input Parameters:
841 .  mat - the factored matrix
842 .  b - the right-hand-side vector
843 .  y - the vector to be added to
844 
845    Output Parameter:
846 .  x - the result vector
847 
848 .keywords: matrix, linear system, solve, LU, Cholesky, transpose, add
849 
850 .seealso: MatSolve(), MatSolveAdd(), MatSolveTrans()
851 @*/
852 int MatSolveTransAdd(Mat mat,Vec b,Vec y,Vec x)
853 {
854   Scalar one = 1.0;
855   int    ierr;
856   Vec    tmp;
857   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE);
858   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
859   if (x == b) SETERRQ(1,"MatSolveTransAdd:x and b must be different vectors");
860   if (!mat->factor) SETERRQ(1,"MatSolveTransAdd:Unfactored matrix");
861 
862   PLogEventBegin(MAT_SolveTransAdd,mat,b,x,y);
863   if (mat->ops.solvetransadd) {
864     ierr = (*mat->ops.solvetransadd)(mat,b,y,x); CHKERRQ(ierr);
865   }
866   else {
867     /* do the solve then the add manually */
868     if (x != y) {
869       ierr = MatSolveTrans(mat,b,x); CHKERRQ(ierr);
870       ierr = VecAXPY(&one,y,x); CHKERRQ(ierr);
871     }
872     else {
873       ierr = VecDuplicate(x,&tmp); CHKERRQ(ierr);
874       PLogObjectParent(mat,tmp);
875       ierr = VecCopy(x,tmp); CHKERRQ(ierr);
876       ierr = MatSolveTrans(mat,b,x); CHKERRQ(ierr);
877       ierr = VecAXPY(&one,tmp,x); CHKERRQ(ierr);
878       ierr = VecDestroy(tmp); CHKERRQ(ierr);
879     }
880   }
881   PLogEventEnd(MAT_SolveTransAdd,mat,b,x,y);
882   return 0;
883 }
884 /* ----------------------------------------------------------------*/
885 
886 /*@
887    MatRelax - Computes one relaxation sweep.
888 
889    Input Parameters:
890 .  mat - the matrix
891 .  b - the right hand side
892 .  omega - the relaxation factor
893 .  flag - flag indicating the type of SOR, one of
894 $     SOR_FORWARD_SWEEP
895 $     SOR_BACKWARD_SWEEP
896 $     SOR_SYMMETRIC_SWEEP (SSOR method)
897 $     SOR_LOCAL_FORWARD_SWEEP
898 $     SOR_LOCAL_BACKWARD_SWEEP
899 $     SOR_LOCAL_SYMMETRIC_SWEEP (local SSOR)
900 $     SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies
901 $       upper/lower triangular part of matrix to
902 $       vector (with omega)
903 $     SOR_ZERO_INITIAL_GUESS - zero initial guess
904 .  shift -  diagonal shift
905 .  its - the number of iterations
906 
907    Output Parameters:
908 .  x - the solution (can contain an initial guess)
909 
910    Notes:
911    SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and
912    SOR_LOCAL_SYMMETRIC_SWEEP perform seperate independent smoothings
913    on each processor.
914 
915    Application programmers will not generally use MatRelax() directly,
916    but instead will employ the SLES/PC interface.
917 
918    Notes for Advanced Users:
919    The flags are implemented as bitwise inclusive or operations.
920    For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP)
921    to specify a zero initial guess for SSOR.
922 
923 .keywords: matrix, relax, relaxation, sweep
924 @*/
925 int MatRelax(Mat mat,Vec b,double omega,MatSORType flag,double shift,
926              int its,Vec x)
927 {
928   int ierr;
929   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
930   PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE);  PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);
931   if (!mat->ops.relax) SETERRQ(PETSC_ERR_SUP,"MatRelax");
932   if (!mat->assembled) SETERRQ(1,"MatRelax:Not for unassembled matrix");
933 
934   PLogEventBegin(MAT_Relax,mat,b,x,0);
935   ierr =(*mat->ops.relax)(mat,b,omega,flag,shift,its,x); CHKERRQ(ierr);
936   PLogEventEnd(MAT_Relax,mat,b,x,0);
937   return 0;
938 }
939 
940 /*
941       Default matrix copy routine.
942 */
943 int MatCopy_Basic(Mat A,Mat B)
944 {
945   int    ierr,i,rstart,rend,nz,*cwork;
946   Scalar *vwork;
947 
948   ierr = MatZeroEntries(B); CHKERRQ(ierr);
949   ierr = MatGetOwnershipRange(A,&rstart,&rend); CHKERRQ(ierr);
950   for (i=rstart; i<rend; i++) {
951     ierr = MatGetRow(A,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
952     ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr);
953     ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
954   }
955   ierr = MatAssemblyBegin(B,FINAL_ASSEMBLY); CHKERRQ(ierr);
956   ierr = MatAssemblyEnd(B,FINAL_ASSEMBLY); CHKERRQ(ierr);
957   return 0;
958 }
959 
960 /*@C
961    MatCopy - Copys a matrix to another matrix.
962 
963    Input Parameters:
964 .  A - the matrix
965 
966    Output Parameter:
967 .  B - where the copy is put
968 
969    Notes:
970    MatCopy() copies the matrix entries of a matrix to another existing
971    matrix (after first zeroing the second matrix).  A related routine is
972    MatConvert(), which first creates a new matrix and then copies the data.
973 
974 .keywords: matrix, copy, convert
975 
976 .seealso: MatConvert()
977 @*/
978 int MatCopy(Mat A,Mat B)
979 {
980   int ierr;
981   PETSCVALIDHEADERSPECIFIC(A,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(B,MAT_COOKIE);
982   if (!A->assembled) SETERRQ(1,"MatCopy:Not for unassembled matrix");
983 
984   PLogEventBegin(MAT_Copy,A,B,0,0);
985   if (A->ops.copy) {
986     ierr = (*A->ops.copy)(A,B); CHKERRQ(ierr);
987   }
988   else { /* generic conversion */
989     ierr = MatCopy_Basic(A,B); CHKERRQ(ierr);
990   }
991   PLogEventEnd(MAT_Copy,A,B,0,0);
992   return 0;
993 }
994 
995 /*@C
996    MatConvert - Converts a matrix to another matrix, either of the same
997    or different type.
998 
999    Input Parameters:
1000 .  mat - the matrix
1001 .  newtype - new matrix type.  Use MATSAME to create a new matrix of the
1002    same type as the original matrix.
1003 
1004    Output Parameter:
1005 .  M - pointer to place new matrix
1006 
1007    Notes:
1008    MatConvert() first creates a new matrix and then copies the data from
1009    the first matrix.  A related routine is MatCopy(), which copies the matrix
1010    entries of one matrix to another already existing matrix context.
1011 
1012 .keywords: matrix, copy, convert
1013 
1014 .seealso: MatCopy()
1015 @*/
1016 int MatConvert(Mat mat,MatType newtype,Mat *M)
1017 {
1018   int ierr;
1019   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1020   if (!M) SETERRQ(1,"MatConvert:Bad new matrix address");
1021   if (!mat->assembled) SETERRQ(1,"MatConvert:Not for unassembled matrix");
1022 
1023   PLogEventBegin(MAT_Convert,mat,0,0,0);
1024   if (newtype == mat->type || newtype == MATSAME) {
1025     if (mat->ops.convertsametype) { /* customized copy */
1026       ierr = (*mat->ops.convertsametype)(mat,M,COPY_VALUES); CHKERRQ(ierr);
1027     }
1028   }
1029   else if (mat->ops.convert) { /* customized conversion */
1030     ierr = (*mat->ops.convert)(mat,newtype,M); CHKERRQ(ierr);
1031   }
1032   else { /* generic conversion */
1033     ierr = MatConvert_Basic(mat,newtype,M); CHKERRQ(ierr);
1034   }
1035   PLogEventEnd(MAT_Convert,mat,0,0,0);
1036   return 0;
1037 }
1038 
1039 /*@
1040    MatGetDiagonal - Gets the diagonal of a matrix.
1041 
1042    Input Parameters:
1043 .  mat - the matrix
1044 
1045    Output Parameters:
1046 .  v - the vector for storing the diagonal
1047 
1048 .keywords: matrix, get, diagonal
1049 @*/
1050 int MatGetDiagonal(Mat mat,Vec v)
1051 {
1052   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(v,VEC_COOKIE);
1053   if (!mat->assembled) SETERRQ(1,"MatGetDiagonal:Not for unassembled matrix");
1054   if (mat->ops.getdiagonal) return (*mat->ops.getdiagonal)(mat,v);
1055   SETERRQ(PETSC_ERR_SUP,"MatGetDiagonal");
1056 }
1057 
1058 /*@C
1059    MatTranspose - Computes an in-place or out-of-place transpose of a matrix.
1060 
1061    Input Parameters:
1062 .  mat - the matrix to transpose
1063 
1064    Output Parameters:
1065 .  B - the transpose (or pass in PETSC_NULL for an in-place transpose)
1066 
1067 .keywords: matrix, transpose
1068 @*/
1069 int MatTranspose(Mat mat,Mat *B)
1070 {
1071   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1072   if (!mat->assembled) SETERRQ(1,"MatTranspose:Not for unassembled matrix");
1073   if (mat->ops.transpose) return (*mat->ops.transpose)(mat,B);
1074   SETERRQ(PETSC_ERR_SUP,"MatTranspose");
1075 }
1076 
1077 /*@
1078    MatEqual - Compares two matrices.  Returns 1 if two matrices are equal.
1079 
1080    Input Parameters:
1081 .  mat1 - the first matrix
1082 .  mat2 - the second matrix
1083 
1084    Output Parameter:
1085 .  flg : 1 if the matrices are equal;
1086          0 otherwise.
1087 
1088 .keywords: matrix, equal, equivalent
1089 @*/
1090 int MatEqual(Mat mat1,Mat mat2,int *flg)
1091 {
1092   PETSCVALIDHEADERSPECIFIC(mat1,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(mat2,MAT_COOKIE);
1093   if (!mat1->assembled) SETERRQ(1,"MatEqual:Not for unassembled matrix");
1094   if (!mat2->assembled) SETERRQ(1,"MatEqual:Not for unassembled matrix");
1095   if (mat1->ops.equal) return (*mat1->ops.equal)(mat1,mat2, flg);
1096   SETERRQ(PETSC_ERR_SUP,"MatEqual");
1097 }
1098 
1099 /*@
1100    MatDiagonalScale - Scales a matrix on the left and right by diagonal
1101    matrices that are stored as vectors.  Either of the two scaling
1102    matrices can be null.
1103 
1104    Input Parameters:
1105 .  mat - the matrix to be scaled
1106 .  l - the left scaling vector
1107 .  r - the right scaling vector
1108 
1109 .keywords: matrix, scale
1110 @*/
1111 int MatDiagonalScale(Mat mat,Vec l,Vec r)
1112 {
1113   int ierr;
1114   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1115   if (!mat->ops.scale) SETERRQ(PETSC_ERR_SUP,"MatDiagonalScale");
1116   if (l) PETSCVALIDHEADERSPECIFIC(l,VEC_COOKIE);
1117   if (r) PETSCVALIDHEADERSPECIFIC(r,VEC_COOKIE);
1118   if (!mat->assembled) SETERRQ(1,"MatDiagonalScale:Not for unassembled matrix");
1119 
1120   PLogEventBegin(MAT_Scale,mat,0,0,0);
1121   ierr = (*mat->ops.diagonalscale)(mat,l,r); CHKERRQ(ierr);
1122   PLogEventEnd(MAT_Scale,mat,0,0,0);
1123   return 0;
1124 }
1125 
1126 /*@
1127    MatScale - Scales a matrix by a number.
1128 
1129    Input Parameters:
1130 .  mat - the matrix to be scaled
1131 .   a  - the number
1132 
1133    Note: the name of this routine MUST change.
1134 .keywords: matrix, scale
1135 @*/
1136 int MatScale(Scalar *a,Mat mat)
1137 {
1138   int ierr;
1139   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1140   if (!mat->ops.scale) SETERRQ(PETSC_ERR_SUP,"MatScale");
1141   if (!mat->assembled) SETERRQ(1,"MatScale:Not for unassembled matrix");
1142 
1143   PLogEventBegin(MAT_Scale,mat,0,0,0);
1144   ierr = (*mat->ops.scale)(a,mat); CHKERRQ(ierr);
1145   PLogEventEnd(MAT_Scale,mat,0,0,0);
1146   return 0;
1147 }
1148 
1149 /*@
1150    MatNorm - Calculates various norms of a matrix.
1151 
1152    Input Parameters:
1153 .  mat - the matrix
1154 .  type - the type of norm, NORM_1, NORM_2, NORM_FROBENIUS, NORM_INFINITY
1155 
1156    Output Parameters:
1157 .  norm - the resulting norm
1158 
1159 .keywords: matrix, norm, Frobenius
1160 @*/
1161 int MatNorm(Mat mat,NormType type,double *norm)
1162 {
1163   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1164   if (!norm) SETERRQ(1,"MatNorm:bad addess for value");
1165   if (!mat->assembled) SETERRQ(1,"MatNorm:Not for unassembled matrix");
1166   if (mat->ops.norm) return (*mat->ops.norm)(mat,type,norm);
1167   SETERRQ(PETSC_ERR_SUP,"MatNorm:Not for this matrix type");
1168 }
1169 
1170 /*@
1171    MatAssemblyBegin - Begins assembling the matrix.  This routine should
1172    be called after completing all calls to MatSetValues().
1173 
1174    Input Parameters:
1175 .  mat - the matrix
1176 .  type - type of assembly, either FLUSH_ASSEMBLY or FINAL_ASSEMBLY
1177 
1178    Notes:
1179    MatSetValues() generally caches the values.  The matrix is ready to
1180    use only after MatAssemblyBegin() and MatAssemblyEnd() have been called.
1181    Use FLUSH_ASSEMBLY when switching between ADD_VALUES and SetValues; use
1182    FINAL_ASSEMBLY for the final assembly before the matrix is used.
1183 
1184 .keywords: matrix, assembly, assemble, begin
1185 
1186 .seealso: MatAssemblyEnd(), MatSetValues()
1187 @*/
1188 int MatAssemblyBegin(Mat mat,MatAssemblyType type)
1189 {
1190   int ierr;
1191   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1192   PLogEventBegin(MAT_AssemblyBegin,mat,0,0,0);
1193   if (mat->ops.assemblybegin){ierr = (*mat->ops.assemblybegin)(mat,type);CHKERRQ(ierr);}
1194   PLogEventEnd(MAT_AssemblyBegin,mat,0,0,0);
1195   return 0;
1196 }
1197 
1198 /*@
1199    MatAssemblyEnd - Completes assembling the matrix.  This routine should
1200    be called after all calls to MatSetValues() and after MatAssemblyBegin().
1201 
1202    Input Parameters:
1203 .  mat - the matrix
1204 .  type - type of assembly, either FLUSH_ASSEMBLY or FINAL_ASSEMBLY
1205 
1206    Options Database Keys:
1207 $  -mat_view_draw : Draw nonzero structure of matrix at conclusion of MatEndAssembly(),
1208                using MatView() and DrawOpenX().
1209 $  -mat_view_info : Prints info on matrix.
1210 $  -mat_view_info_detailed: More detailed information.
1211 $  -mat_view : Prints matrix out in ascii.
1212 $  -mat_view_matlab : Prints matrix out suitable for Matlab(TM).
1213 $  -display <name> : Set display name (default is host)
1214 $  -draw_pause <sec> : Set number of seconds to pause after display
1215 
1216    Note:
1217    MatSetValues() generally caches the values.  The matrix is ready to
1218    use only after MatAssemblyBegin() and MatAssemblyEnd() have been called.
1219    Use FLUSH_ASSEMBLY when switching between ADD_VALUES and SetValues; use
1220    FINAL_ASSEMBLY for the final assembly before the matrix is used.
1221 
1222 .keywords: matrix, assembly, assemble, end
1223 
1224 .seealso: MatAssemblyBegin(), MatSetValues()
1225 @*/
1226 int MatAssemblyEnd(Mat mat,MatAssemblyType type)
1227 {
1228   int        ierr,flg;
1229   static int inassm = 0;
1230 
1231   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1232   inassm++;
1233   PLogEventBegin(MAT_AssemblyEnd,mat,0,0,0);
1234   if (mat->ops.assemblyend) {ierr = (*mat->ops.assemblyend)(mat,type); CHKERRQ(ierr);}
1235   mat->assembled = PETSC_TRUE; mat->num_ass++;
1236   PLogEventEnd(MAT_AssemblyEnd,mat,0,0,0);
1237 
1238   if (inassm == 1) {
1239     ierr = OptionsHasName(PETSC_NULL,"-mat_view_info",&flg); CHKERRQ(ierr);
1240     if (flg) {
1241       Viewer viewer;
1242       ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr);
1243       ierr = ViewerFileSetFormat(viewer,FILE_FORMAT_INFO,0);CHKERRQ(ierr);
1244       ierr = MatView(mat,viewer); CHKERRQ(ierr);
1245       ierr = ViewerDestroy(viewer); CHKERRQ(ierr);
1246     }
1247     ierr = OptionsHasName(PETSC_NULL,"-mat_view_info_detailed",&flg); CHKERRQ(ierr);
1248     if (flg) {
1249       Viewer viewer;
1250       ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr);
1251       ierr = ViewerFileSetFormat(viewer,FILE_FORMAT_INFO_DETAILED,0);CHKERRQ(ierr);
1252       ierr = MatView(mat,viewer); CHKERRQ(ierr);
1253       ierr = ViewerDestroy(viewer); CHKERRQ(ierr);
1254     }
1255     ierr = OptionsHasName(PETSC_NULL,"-mat_view",&flg); CHKERRQ(ierr);
1256     if (flg) {
1257       Viewer viewer;
1258       ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr);
1259       ierr = MatView(mat,viewer); CHKERRQ(ierr);
1260       ierr = ViewerDestroy(viewer); CHKERRQ(ierr);
1261     }
1262     ierr = OptionsHasName(PETSC_NULL,"-mat_view_matlab",&flg); CHKERRQ(ierr);
1263     if (flg) {
1264       Viewer viewer;
1265       ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr);
1266       ierr = ViewerFileSetFormat(viewer,FILE_FORMAT_MATLAB,"M");CHKERRQ(ierr);
1267       ierr = MatView(mat,viewer); CHKERRQ(ierr);
1268       ierr = ViewerDestroy(viewer); CHKERRQ(ierr);
1269     }
1270     ierr = OptionsHasName(PETSC_NULL,"-mat_view_draw",&flg); CHKERRQ(ierr);
1271     if (flg) {
1272       Draw    win;
1273       ierr = DrawOpenX(mat->comm,0,0,0,0,300,300,&win); CHKERRQ(ierr);
1274       ierr = MatView(mat,(Viewer)win); CHKERRQ(ierr);
1275       ierr = DrawSyncFlush(win); CHKERRQ(ierr);
1276       ierr = DrawDestroy(win); CHKERRQ(ierr);
1277     }
1278   }
1279   inassm--;
1280   return 0;
1281 }
1282 
1283 /*@
1284    MatCompress - Tries to store the matrix in as little space as
1285    possible.  May fail if memory is already fully used, since it
1286    tries to allocate new space.
1287 
1288    Input Parameters:
1289 .  mat - the matrix
1290 
1291 .keywords: matrix, compress
1292 @*/
1293 int MatCompress(Mat mat)
1294 {
1295   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1296   if (mat->ops.compress) return (*mat->ops.compress)(mat);
1297   return 0;
1298 }
1299 /*@
1300    MatSetOption - Sets a parameter option for a matrix. Some options
1301    may be specific to certain storage formats.  Some options
1302    determine how values will be inserted (or added). Sorted,
1303    row-oriented input will generally assemble the fastest. The default
1304    is row-oriented, nonsorted input.
1305 
1306    Input Parameters:
1307 .  mat - the matrix
1308 .  option - the option, one of the following:
1309 $    ROW_ORIENTED
1310 $    COLUMN_ORIENTED,
1311 $    ROWS_SORTED,
1312 $    COLUMNS_SORTED,
1313 $    NO_NEW_NONZERO_LOCATIONS,
1314 $    YES_NEW_NONZERO_LOCATIONS,
1315 $    SYMMETRIC_MATRIX,
1316 $    STRUCTURALLY_SYMMETRIC_MATRIX,
1317 $    NO_NEW_DIAGONALS,
1318 $    YES_NEW_DIAGONALS,
1319 $    and possibly others.
1320 
1321    Notes:
1322    Some options are relevant only for particular matrix types and
1323    are thus ignored by others.  Other options are not supported by
1324    certain matrix types and will generate an error message if set.
1325 
1326    If using a Fortran 77 module to compute a matrix, one may need to
1327    use the column-oriented option (or convert to the row-oriented
1328    format).
1329 
1330    NO_NEW_NONZERO_LOCATIONS indicates that any add or insertion
1331    that will generate a new entry in the nonzero structure is ignored.
1332    What this means is if memory is not allocated for this particular
1333    lot, then the insertion is ignored. For dense matrices, where
1334    the entire array is allocated, no entries are ever ignored.
1335 
1336 .keywords: matrix, option, row-oriented, column-oriented, sorted, nonzero
1337 @*/
1338 int MatSetOption(Mat mat,MatOption op)
1339 {
1340   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1341   if (mat->ops.setoption) return (*mat->ops.setoption)(mat,op);
1342   return 0;
1343 }
1344 
1345 /*@
1346    MatZeroEntries - Zeros all entries of a matrix.  For sparse matrices
1347    this routine retains the old nonzero structure.
1348 
1349    Input Parameters:
1350 .  mat - the matrix
1351 
1352 .keywords: matrix, zero, entries
1353 
1354 .seealso: MatZeroRows()
1355 @*/
1356 int MatZeroEntries(Mat mat)
1357 {
1358   int ierr;
1359   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1360   if (!mat->ops.zeroentries) SETERRQ(PETSC_ERR_SUP,"MatZeroEntries");
1361 
1362   PLogEventBegin(MAT_ZeroEntries,mat,0,0,0);
1363   ierr = (*mat->ops.zeroentries)(mat); CHKERRQ(ierr);
1364   PLogEventEnd(MAT_ZeroEntries,mat,0,0,0);
1365   return 0;
1366 }
1367 
1368 /*@
1369    MatZeroRows - Zeros all entries (except possibly the main diagonal)
1370    of a set of rows of a matrix.
1371 
1372    Input Parameters:
1373 .  mat - the matrix
1374 .  is - index set of rows to remove
1375 .  diag - pointer to value put in all diagonals of eliminated rows.
1376           Note that diag is not a pointer to an array, but merely a
1377           pointer to a single value.
1378 
1379    Notes:
1380    For the AIJ matrix formats this removes the old nonzero structure,
1381    but does not release memory.  For the dense and block diagonal
1382    formats this does not alter the nonzero structure.
1383 
1384    The user can set a value in the diagonal entry (or for the AIJ and
1385    row formats can optionally remove the main diagonal entry from the
1386    nonzero structure as well, by passing a null pointer as the final
1387    argument).
1388 
1389 .keywords: matrix, zero, rows, boundary conditions
1390 
1391 .seealso: MatZeroEntries(), MatGetSubMatrix(), MatGetSubMatrixInPlace()
1392 @*/
1393 int MatZeroRows(Mat mat,IS is, Scalar *diag)
1394 {
1395   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1396   if (!mat->assembled) SETERRQ(1,"MatZeroRows:Not for unassembled matrix");
1397   if (mat->ops.zerorows) return (*mat->ops.zerorows)(mat,is,diag);
1398   SETERRQ(PETSC_ERR_SUP,"MatZeroRows");
1399 }
1400 
1401 /*@
1402    MatGetSize - Returns the numbers of rows and columns in a matrix.
1403 
1404    Input Parameter:
1405 .  mat - the matrix
1406 
1407    Output Parameters:
1408 .  m - the number of global rows
1409 .  n - the number of global columns
1410 
1411 .keywords: matrix, dimension, size, rows, columns, global, get
1412 
1413 .seealso: MatGetLocalSize()
1414 @*/
1415 int MatGetSize(Mat mat,int *m,int* n)
1416 {
1417   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1418   if (!m || !n) SETERRQ(1,"MatGetSize:Bad address for result");
1419   return (*mat->ops.getsize)(mat,m,n);
1420 }
1421 
1422 /*@
1423    MatGetLocalSize - Returns the number of rows and columns in a matrix
1424    stored locally.  This information may be implementation dependent, so
1425    use with care.
1426 
1427    Input Parameters:
1428 .  mat - the matrix
1429 
1430    Output Parameters:
1431 .  m - the number of local rows
1432 .  n - the number of local columns
1433 
1434 .keywords: matrix, dimension, size, local, rows, columns, get
1435 
1436 .seealso: MatGetSize()
1437 @*/
1438 int MatGetLocalSize(Mat mat,int *m,int* n)
1439 {
1440   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1441   if (!m || !n) SETERRQ(1,"MatGetLocalSize:Bad address for result");
1442   return (*mat->ops.getlocalsize)(mat,m,n);
1443 }
1444 
1445 /*@
1446    MatGetOwnershipRange - Returns the range of matrix rows owned by
1447    this processor, assuming that the matrix is laid out with the first
1448    n1 rows on the first processor, the next n2 rows on the second, etc.
1449    For certain parallel layouts this range may not be well-defined.
1450 
1451    Input Parameters:
1452 .  mat - the matrix
1453 
1454    Output Parameters:
1455 .  m - the first local row
1456 .  n - one more then the last local row
1457 
1458 .keywords: matrix, get, range, ownership
1459 @*/
1460 int MatGetOwnershipRange(Mat mat,int *m,int* n)
1461 {
1462   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1463   if (!m || !n) SETERRQ(1,"MatGetOwnershipRange:Bad address for result");
1464   if (mat->ops.getownershiprange) return (*mat->ops.getownershiprange)(mat,m,n);
1465   SETERRQ(PETSC_ERR_SUP,"MatGetOwnershipRange");
1466 }
1467 
1468 /*@
1469    MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix.
1470    Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric()
1471    to complete the factorization.
1472 
1473    Input Parameters:
1474 .  mat - the matrix
1475 .  row - row permutation
1476 .  column - column permutation
1477 .  fill - number of levels of fill
1478 .  f - expected fill as ratio of the original number of nonzeros,
1479        for example 3.0; choosing this parameter well can result in
1480        more efficient use of time and space.
1481 
1482    Output Parameters:
1483 .  fact - new matrix that has been symbolically factored
1484 
1485    Options Database Key:
1486 $   -mat_ilu_fill <f>, where f is the fill ratio
1487 
1488    Notes:
1489    See the file $(PETSC_DIR)/Performace for additional information about
1490    choosing the fill factor for better efficiency.
1491 
1492 .keywords: matrix, factor, incomplete, ILU, symbolic, fill
1493 
1494 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric()
1495 @*/
1496 int MatILUFactorSymbolic(Mat mat,IS row,IS col,double f,int fill,Mat *fact)
1497 {
1498   int ierr,flg;
1499 
1500   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1501   if (fill < 0) SETERRQ(1,"MatILUFactorSymbolic:Levels of fill negative");
1502   if (!fact) SETERRQ(1,"MatILUFactorSymbolic:Fact argument is missing");
1503   if (!mat->ops.ilufactorsymbolic) SETERRQ(PETSC_ERR_SUP,"MatILUFactorSymbolic");
1504   if (!mat->assembled) SETERRQ(1,"MatILUFactorSymbolic:Not for unassembled matrix");
1505 
1506   ierr = OptionsGetDouble(PETSC_NULL,"-mat_ilu_fill",&f,&flg); CHKERRQ(ierr);
1507   PLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0);
1508   ierr = (*mat->ops.ilufactorsymbolic)(mat,row,col,f,fill,fact); CHKERRQ(ierr);
1509   PLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0);
1510   return 0;
1511 }
1512 
1513 /*@
1514    MatIncompleteCholeskyFactorSymbolic - Performs symbolic incomplete
1515    Cholesky factorization for a symmetric matrix.  Use
1516    MatCholeskyFactorNumeric() to complete the factorization.
1517 
1518    Input Parameters:
1519 .  mat - the matrix
1520 .  perm - row and column permutation
1521 .  fill - levels of fill
1522 .  f - expected fill as ratio of original fill
1523 
1524    Output Parameter:
1525 .  fact - the factored matrix
1526 
1527    Note:  Currently only no-fill factorization is supported.
1528 
1529 .keywords: matrix, factor, incomplete, ICC, Cholesky, symbolic, fill
1530 
1531 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor()
1532 @*/
1533 int MatIncompleteCholeskyFactorSymbolic(Mat mat,IS perm,double f,int fill,
1534                                         Mat *fact)
1535 {
1536   int ierr;
1537   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1538   if (fill < 0) SETERRQ(1,"MatIncompleteCholeskyFactorSymbolic:Fill negative");
1539   if (!fact) SETERRQ(1,"MatIncompleteCholeskyFactorSymbolic:Missing fact argument");
1540   if (!mat->ops.incompletecholeskyfactorsymbolic)
1541      SETERRQ(PETSC_ERR_SUP,"MatIncompleteCholeskyFactorSymbolic");
1542   if (!mat->assembled)
1543      SETERRQ(1,"MatIncompleteCholeskyFactorSymbolic:Not for unassembled matrix");
1544 
1545   PLogEventBegin(MAT_IncompleteCholeskyFactorSymbolic,mat,perm,0,0);
1546   ierr = (*mat->ops.incompletecholeskyfactorsymbolic)(mat,perm,f,fill,fact);CHKERRQ(ierr);
1547   PLogEventEnd(MAT_IncompleteCholeskyFactorSymbolic,mat,perm,0,0);
1548   return 0;
1549 }
1550 
1551 /*@C
1552    MatGetArray - Returns a pointer to the element values in the matrix.
1553    This routine  is implementation dependent, and may not even work for
1554    certain matrix types.
1555 
1556    Input Parameter:
1557 .  mat - the matrix
1558 
1559    Output Parameter:
1560 .  v - the location of the values
1561 
1562    Fortran Note:
1563    The Fortran interface is slightly different from that given below.
1564    See the users manual and petsc/src/mat/examples for details.
1565 
1566 .keywords: matrix, array, elements, values
1567 @*/
1568 int MatGetArray(Mat mat,Scalar **v)
1569 {
1570   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1571   if (!v) SETERRQ(1,"MatGetArray:Bad input, array pointer location");
1572   if (!mat->ops.getarray) SETERRQ(PETSC_ERR_SUP,"MatGetArraye");
1573   return (*mat->ops.getarray)(mat,v);
1574 }
1575 
1576 /*@C
1577    MatGetSubMatrix - Extracts a submatrix from a matrix. If submat points
1578                      to a valid matrix, it may be reused.
1579 
1580    Input Parameters:
1581 .  mat - the matrix
1582 .  irow, icol - index sets of rows and columns to extract
1583 .  scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX
1584 
1585    Output Parameter:
1586 .  submat - the submatrix
1587 
1588    Notes:
1589    MatGetSubMatrix() can be useful in setting boundary conditions.
1590 
1591    Use MatGetSubMatrices() to extract multiple submatrices.
1592 
1593 .keywords: matrix, get, submatrix, boundary conditions
1594 
1595 .seealso: MatZeroRows(), MatGetSubMatrixInPlace(), MatGetSubMatrices()
1596 @*/
1597 int MatGetSubMatrix(Mat mat,IS irow,IS icol,MatGetSubMatrixCall scall,Mat *submat)
1598 {
1599   int ierr;
1600   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1601   if (scall == MAT_REUSE_MATRIX) {
1602     PETSCVALIDHEADERSPECIFIC(*submat,MAT_COOKIE);
1603   }
1604   if (!mat->ops.getsubmatrix) SETERRQ(PETSC_ERR_SUP,"MatGetSubMatrix");
1605   if (!mat->assembled) SETERRQ(1,"MatGetSubMatrix:Not for unassembled matrix");
1606 
1607   /* PLogEventBegin(MAT_GetSubMatrix,mat,irow,icol,0); */
1608   ierr = (*mat->ops.getsubmatrix)(mat,irow,icol,scall,submat); CHKERRQ(ierr);
1609   /* PLogEventEnd(MAT_GetSubMatrix,mat,irow,icol,0); */
1610   return 0;
1611 }
1612 
1613 /*@C
1614    MatGetSubMatrices - Extracts several submatrices from a matrix. If submat
1615    points to an array of valid matrices, it may be reused.
1616 
1617    Input Parameters:
1618 .  mat - the matrix
1619 .  irow, icol - index sets of rows and columns to extract
1620 
1621    Output Parameter:
1622 .  submat - the submatrices
1623 
1624    Note:
1625    Use MatGetSubMatrix() for extracting a sinble submatrix.
1626 
1627 .keywords: matrix, get, submatrix, submatrices
1628 
1629 .seealso: MatGetSubMatrix()
1630 @*/
1631 int MatGetSubMatrices(Mat mat,int n, IS *irow,IS *icol,MatGetSubMatrixCall scall,
1632                       Mat **submat)
1633 {
1634   int ierr;
1635   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1636   if (!mat->ops.getsubmatrices) SETERRQ(PETSC_ERR_SUP,"MatGetSubMatrices");
1637   if (!mat->assembled) SETERRQ(1,"MatGetSubMatrices:Not for unassembled matrix");
1638 
1639   PLogEventBegin(MAT_GetSubMatrices,mat,0,0,0);
1640   ierr = (*mat->ops.getsubmatrices)(mat,n,irow,icol,scall,submat); CHKERRQ(ierr);
1641   PLogEventEnd(MAT_GetSubMatrices,mat,0,0,0);
1642   return 0;
1643 }
1644 
1645 /*@
1646    MatGetSubMatrixInPlace - Extracts a submatrix from a matrix, returning
1647    the submatrix in place of the original matrix.
1648 
1649    Input Parameters:
1650 .  mat - the matrix
1651 .  irow, icol - index sets of rows and columns to extract
1652 
1653 .keywords: matrix, get, submatrix, boundary conditions, in-place
1654 
1655 .seealso: MatZeroRows(), MatGetSubMatrix()
1656 @*/
1657 int MatGetSubMatrixInPlace(Mat mat,IS irow,IS icol)
1658 {
1659   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1660   if (!mat->assembled) SETERRQ(1,"MatGetSubMatrixInPlace:Not for unassembled matrix");
1661 
1662   if (!mat->ops.getsubmatrixinplace) SETERRQ(PETSC_ERR_SUP,"MatGetSubmatrixInPlace");
1663   return (*mat->ops.getsubmatrixinplace)(mat,irow,icol);
1664 }
1665 
1666 /*@
1667    MatIncreaseOverlap - Given a set of submatrices indicated by index sets,
1668    replaces the index by larger ones that represent submatrices with more
1669    overlap.
1670 
1671    Input Parameters:
1672 .  mat - the matrix
1673 .  n   - the number of index sets
1674 .  is  - the array of pointers to index sets
1675 .  ov  - the additional overlap requested
1676 
1677 .keywords: matrix, overlap, Schwarz
1678 
1679 .seealso: MatGetSubMatrices()
1680 @*/
1681 int MatIncreaseOverlap(Mat mat,int n, IS *is, int ov)
1682 {
1683   int ierr;
1684   PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);
1685   if (!mat->assembled) SETERRQ(1,"MatIncreaseOverlap:Not for unassembled matrix");
1686 
1687   if (ov == 0) return 0;
1688   if (!mat->ops.increaseoverlap) SETERRQ(PETSC_ERR_SUP,"MatIncreaseOverlap");
1689   PLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0);
1690   ierr = (*mat->ops.increaseoverlap)(mat,n,is,ov); CHKERRQ(ierr);
1691   PLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0);
1692   return 0;
1693 }
1694 
1695 /*@
1696    MatPrintHelp - Prints all the options for the matrix.
1697 
1698    Input Parameter:
1699 .  mat - the matrix
1700 
1701    Options Database Keys:
1702 $  -help, -h
1703 
1704 .keywords: mat, help
1705 
1706 .seealso: MatCreate(), MatCreateXXX()
1707 @*/
1708 int MatPrintHelp(Mat mat)
1709 {
1710   static int called = 0;
1711   MPI_Comm   comm = mat->comm;
1712 
1713   if (!called) {
1714     MPIU_printf(comm,"General matrix options:\n");
1715     MPIU_printf(comm,"  -mat_view_info : view basic matrix info during MatAssemblyEnd()\n");
1716     MPIU_printf(comm,"  -mat_view_info_detailed : view detailed matrix info during MatAssemblyEnd()\n");
1717     MPIU_printf(comm,"  -mat_view_draw : draw nonzero matrix structure during MatAssemblyEnd()\n");
1718     MPIU_printf(comm,"      -draw_pause <sec> : set seconds of display pause\n");
1719     MPIU_printf(comm,"      -display <name> : set alternate display\n");
1720     called = 1;
1721   }
1722   if (mat->ops.printhelp) (*mat->ops.printhelp)(mat);
1723   return 0;
1724 }
1725 
1726