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