xref: /petsc/src/mat/interface/matrix.c (revision 08b6dcc09476afde1cce98cc04f33d98301cef47)
1 /*$Id: matrix.c,v 1.414 2001/09/28 18:57:28 balay Exp $*/
2 
3 /*
4    This is where the abstract matrix operations are defined
5 */
6 
7 #include "src/mat/matimpl.h"        /*I "petscmat.h" I*/
8 #include "src/vec/vecimpl.h"
9 
10 /* Logging support */
11 int MAT_COOKIE;
12 int MATSNESMFCTX_COOKIE;
13 int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose;
14 int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose;
15 int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic;
16 int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor;
17 int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin;
18 int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering;
19 int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate;
20 int MAT_FDColoringApply,MAT_Transpose,MAT_FDColoringFunction;
21 
22 #undef __FUNCT__
23 #define __FUNCT__ "MatGetRow"
24 /*@C
25    MatGetRow - Gets a row of a matrix.  You MUST call MatRestoreRow()
26    for each row that you get to ensure that your application does
27    not bleed memory.
28 
29    Not Collective
30 
31    Input Parameters:
32 +  mat - the matrix
33 -  row - the row to get
34 
35    Output Parameters:
36 +  ncols -  the number of nonzeros in the row
37 .  cols - if not NULL, the column numbers
38 -  vals - if not NULL, the values
39 
40    Notes:
41    This routine is provided for people who need to have direct access
42    to the structure of a matrix.  We hope that we provide enough
43    high-level matrix routines that few users will need it.
44 
45    MatGetRow() always returns 0-based column indices, regardless of
46    whether the internal representation is 0-based (default) or 1-based.
47 
48    For better efficiency, set cols and/or vals to PETSC_NULL if you do
49    not wish to extract these quantities.
50 
51    The user can only examine the values extracted with MatGetRow();
52    the values cannot be altered.  To change the matrix entries, one
53    must use MatSetValues().
54 
55    You can only have one call to MatGetRow() outstanding for a particular
56    matrix at a time, per processor. MatGetRow() can only obtained rows
57    associated with the given processor, it cannot get rows from the
58    other processors; for that we suggest using MatGetSubMatrices(), then
59    MatGetRow() on the submatrix. The row indix passed to MatGetRows()
60    is in the global number of rows.
61 
62    Fortran Notes:
63    The calling sequence from Fortran is
64 .vb
65    MatGetRow(matrix,row,ncols,cols,values,ierr)
66          Mat     matrix (input)
67          integer row    (input)
68          integer ncols  (output)
69          integer cols(maxcols) (output)
70          double precision (or double complex) values(maxcols) output
71 .ve
72    where maxcols >= maximum nonzeros in any row of the matrix.
73 
74    Caution:
75    Do not try to change the contents of the output arrays (cols and vals).
76    In some cases, this may corrupt the matrix.
77 
78    Level: advanced
79 
80    Concepts: matrices^row access
81 
82 .seealso: MatRestoreRow(), MatSetValues(), MatGetValues(), MatGetSubmatrices(), MatGetDiagonal()
83 @*/
84 int MatGetRow(Mat mat,int row,int *ncols,int **cols,PetscScalar **vals)
85 {
86   int   ierr;
87 
88   PetscFunctionBegin;
89   PetscValidHeaderSpecific(mat,MAT_COOKIE);
90   PetscValidIntPointer(ncols);
91   PetscValidType(mat);
92   MatPreallocated(mat);
93   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
94   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
95   if (!mat->ops->getrow) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
96   ierr = PetscLogEventBegin(MAT_GetRow,mat,0,0,0);CHKERRQ(ierr);
97   ierr = (*mat->ops->getrow)(mat,row,ncols,cols,vals);CHKERRQ(ierr);
98   ierr = PetscLogEventEnd(MAT_GetRow,mat,0,0,0);CHKERRQ(ierr);
99   PetscFunctionReturn(0);
100 }
101 
102 #undef __FUNCT__
103 #define __FUNCT__ "MatRestoreRow"
104 /*@C
105    MatRestoreRow - Frees any temporary space allocated by MatGetRow().
106 
107    Not Collective
108 
109    Input Parameters:
110 +  mat - the matrix
111 .  row - the row to get
112 .  ncols, cols - the number of nonzeros and their columns
113 -  vals - if nonzero the column values
114 
115    Notes:
116    This routine should be called after you have finished examining the entries.
117 
118    Fortran Notes:
119    The calling sequence from Fortran is
120 .vb
121    MatRestoreRow(matrix,row,ncols,cols,values,ierr)
122       Mat     matrix (input)
123       integer row    (input)
124       integer ncols  (output)
125       integer cols(maxcols) (output)
126       double precision (or double complex) values(maxcols) output
127 .ve
128    Where maxcols >= maximum nonzeros in any row of the matrix.
129 
130    In Fortran MatRestoreRow() MUST be called after MatGetRow()
131    before another call to MatGetRow() can be made.
132 
133    Level: advanced
134 
135 .seealso:  MatGetRow()
136 @*/
137 int MatRestoreRow(Mat mat,int row,int *ncols,int **cols,PetscScalar **vals)
138 {
139   int ierr;
140 
141   PetscFunctionBegin;
142   PetscValidHeaderSpecific(mat,MAT_COOKIE);
143   PetscValidIntPointer(ncols);
144   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
145   if (!mat->ops->restorerow) PetscFunctionReturn(0);
146   ierr = (*mat->ops->restorerow)(mat,row,ncols,cols,vals);CHKERRQ(ierr);
147   PetscFunctionReturn(0);
148 }
149 
150 #undef __FUNCT__
151 #define __FUNCT__ "MatView"
152 /*@C
153    MatView - Visualizes a matrix object.
154 
155    Collective on Mat
156 
157    Input Parameters:
158 +  mat - the matrix
159 -  ptr - visualization context
160 
161   Notes:
162   The available visualization contexts include
163 +    PETSC_VIEWER_STDOUT_SELF - standard output (default)
164 .    PETSC_VIEWER_STDOUT_WORLD - synchronized standard
165         output where only the first processor opens
166         the file.  All other processors send their
167         data to the first processor to print.
168 -     PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure
169 
170    The user can open alternative visualization contexts with
171 +    PetscViewerASCIIOpen() - Outputs matrix to a specified file
172 .    PetscViewerBinaryOpen() - Outputs matrix in binary to a
173          specified file; corresponding input uses MatLoad()
174 .    PetscViewerDrawOpen() - Outputs nonzero matrix structure to
175          an X window display
176 -    PetscViewerSocketOpen() - Outputs matrix to Socket viewer.
177          Currently only the sequential dense and AIJ
178          matrix types support the Socket viewer.
179 
180    The user can call PetscViewerSetFormat() to specify the output
181    format of ASCII printed objects (when using PETSC_VIEWER_STDOUT_SELF,
182    PETSC_VIEWER_STDOUT_WORLD and PetscViewerASCIIOpen).  Available formats include
183 +    PETSC_VIEWER_ASCII_DEFAULT - default, prints matrix contents
184 .    PETSC_VIEWER_ASCII_MATLAB - prints matrix contents in Matlab format
185 .    PETSC_VIEWER_ASCII_DENSE - prints entire matrix including zeros
186 .    PETSC_VIEWER_ASCII_COMMON - prints matrix contents, using a sparse
187          format common among all matrix types
188 .    PETSC_VIEWER_ASCII_IMPL - prints matrix contents, using an implementation-specific
189          format (which is in many cases the same as the default)
190 .    PETSC_VIEWER_ASCII_INFO - prints basic information about the matrix
191          size and structure (not the matrix entries)
192 .    PETSC_VIEWER_ASCII_INFO_DETAIL - prints more detailed information about
193          the matrix structure
194 
195    Options Database Keys:
196 +  -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly()
197 .  -mat_view_info_detailed - Prints more detailed info
198 .  -mat_view - Prints matrix in ASCII format
199 .  -mat_view_matlab - Prints matrix in Matlab format
200 .  -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX().
201 .  -display <name> - Sets display name (default is host)
202 .  -draw_pause <sec> - Sets number of seconds to pause after display
203 .  -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual)
204 .  -viewer_socket_machine <machine>
205 .  -viewer_socket_port <port>
206 .  -mat_view_binary - save matrix to file in binary format
207 -  -viewer_binary_filename <name>
208    Level: beginner
209 
210    Concepts: matrices^viewing
211    Concepts: matrices^plotting
212    Concepts: matrices^printing
213 
214 .seealso: PetscViewerSetFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(),
215           PetscViewerSocketOpen(), PetscViewerBinaryOpen(), MatLoad()
216 @*/
217 int MatView(Mat mat,PetscViewer viewer)
218 {
219   int               ierr,rows,cols;
220   PetscTruth        isascii;
221   char              *cstr;
222   PetscViewerFormat format;
223 
224   PetscFunctionBegin;
225   PetscValidHeaderSpecific(mat,MAT_COOKIE);
226   PetscValidType(mat);
227   MatPreallocated(mat);
228   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(mat->comm);
229   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE);
230   PetscCheckSameComm(mat,viewer);
231   if (!mat->assembled) SETERRQ(1,"Must call MatAssemblyBegin/End() before viewing matrix");
232 
233   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
234   if (isascii) {
235     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
236     if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
237       if (mat->prefix) {
238         ierr = PetscViewerASCIIPrintf(viewer,"Matrix Object:(%s)\n",mat->prefix);CHKERRQ(ierr);
239       } else {
240         ierr = PetscViewerASCIIPrintf(viewer,"Matrix Object:\n");CHKERRQ(ierr);
241       }
242       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
243       ierr = MatGetType(mat,&cstr);CHKERRQ(ierr);
244       ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr);
245       ierr = PetscViewerASCIIPrintf(viewer,"type=%s, rows=%d, cols=%d\n",cstr,rows,cols);CHKERRQ(ierr);
246       if (mat->ops->getinfo) {
247         MatInfo info;
248         ierr = MatGetInfo(mat,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
249         ierr = PetscViewerASCIIPrintf(viewer,"total: nonzeros=%d, allocated nonzeros=%d\n",
250                           (int)info.nz_used,(int)info.nz_allocated);CHKERRQ(ierr);
251       }
252     }
253   }
254   if (mat->ops->view) {
255     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
256     ierr = (*mat->ops->view)(mat,viewer);CHKERRQ(ierr);
257     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
258   } else if (!isascii) {
259     SETERRQ1(1,"Viewer type %s not supported",((PetscObject)viewer)->type_name);
260   }
261   if (isascii) {
262     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
263     if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
264       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
265     }
266   }
267   PetscFunctionReturn(0);
268 }
269 
270 #undef __FUNCT__
271 #define __FUNCT__ "MatScaleSystem"
272 /*@C
273    MatScaleSystem - Scale a vector solution and right hand side to
274    match the scaling of a scaled matrix.
275 
276    Collective on Mat
277 
278    Input Parameter:
279 +  mat - the matrix
280 .  x - solution vector (or PETSC_NULL)
281 -  b - right hand side vector (or PETSC_NULL)
282 
283 
284    Notes:
285    For AIJ, BAIJ, and BDiag matrix formats, the matrices are not
286    internally scaled, so this does nothing. For MPIROWBS it
287    permutes and diagonally scales.
288 
289    The SLES methods automatically call this routine when required
290    (via PCPreSolve()) so it is rarely used directly.
291 
292    Level: Developer
293 
294    Concepts: matrices^scaling
295 
296 .seealso: MatUseScaledForm(), MatUnScaleSystem()
297 @*/
298 int MatScaleSystem(Mat mat,Vec x,Vec b)
299 {
300   int ierr;
301 
302   PetscFunctionBegin;
303   PetscValidHeaderSpecific(mat,MAT_COOKIE);
304   PetscValidType(mat);
305   MatPreallocated(mat);
306   if (x) {PetscValidHeaderSpecific(x,VEC_COOKIE);PetscCheckSameComm(mat,x);}
307   if (b) {PetscValidHeaderSpecific(b,VEC_COOKIE);PetscCheckSameComm(mat,b);}
308 
309   if (mat->ops->scalesystem) {
310     ierr = (*mat->ops->scalesystem)(mat,x,b);CHKERRQ(ierr);
311   }
312   PetscFunctionReturn(0);
313 }
314 
315 #undef __FUNCT__
316 #define __FUNCT__ "MatUnScaleSystem"
317 /*@C
318    MatUnScaleSystem - Unscales a vector solution and right hand side to
319    match the original scaling of a scaled matrix.
320 
321    Collective on Mat
322 
323    Input Parameter:
324 +  mat - the matrix
325 .  x - solution vector (or PETSC_NULL)
326 -  b - right hand side vector (or PETSC_NULL)
327 
328 
329    Notes:
330    For AIJ, BAIJ, and BDiag matrix formats, the matrices are not
331    internally scaled, so this does nothing. For MPIROWBS it
332    permutes and diagonally scales.
333 
334    The SLES methods automatically call this routine when required
335    (via PCPreSolve()) so it is rarely used directly.
336 
337    Level: Developer
338 
339 .seealso: MatUseScaledForm(), MatScaleSystem()
340 @*/
341 int MatUnScaleSystem(Mat mat,Vec x,Vec b)
342 {
343   int ierr;
344 
345   PetscFunctionBegin;
346   PetscValidHeaderSpecific(mat,MAT_COOKIE);
347   PetscValidType(mat);
348   MatPreallocated(mat);
349   if (x) {PetscValidHeaderSpecific(x,VEC_COOKIE);PetscCheckSameComm(mat,x);}
350   if (b) {PetscValidHeaderSpecific(b,VEC_COOKIE);PetscCheckSameComm(mat,b);}
351   if (mat->ops->unscalesystem) {
352     ierr = (*mat->ops->unscalesystem)(mat,x,b);CHKERRQ(ierr);
353   }
354   PetscFunctionReturn(0);
355 }
356 
357 #undef __FUNCT__
358 #define __FUNCT__ "MatUseScaledForm"
359 /*@C
360    MatUseScaledForm - For matrix storage formats that scale the
361    matrix (for example MPIRowBS matrices are diagonally scaled on
362    assembly) indicates matrix operations (MatMult() etc) are
363    applied using the scaled matrix.
364 
365    Collective on Mat
366 
367    Input Parameter:
368 +  mat - the matrix
369 -  scaled - PETSC_TRUE for applying the scaled, PETSC_FALSE for
370             applying the original matrix
371 
372    Notes:
373    For scaled matrix formats, applying the original, unscaled matrix
374    will be slightly more expensive
375 
376    Level: Developer
377 
378 .seealso: MatScaleSystem(), MatUnScaleSystem()
379 @*/
380 int MatUseScaledForm(Mat mat,PetscTruth scaled)
381 {
382   int ierr;
383 
384   PetscFunctionBegin;
385   PetscValidHeaderSpecific(mat,MAT_COOKIE);
386   PetscValidType(mat);
387   MatPreallocated(mat);
388   if (mat->ops->usescaledform) {
389     ierr = (*mat->ops->usescaledform)(mat,scaled);CHKERRQ(ierr);
390   }
391   PetscFunctionReturn(0);
392 }
393 
394 #undef __FUNCT__
395 #define __FUNCT__ "MatDestroy"
396 /*@C
397    MatDestroy - Frees space taken by a matrix.
398 
399    Collective on Mat
400 
401    Input Parameter:
402 .  A - the matrix
403 
404    Level: beginner
405 
406 @*/
407 int MatDestroy(Mat A)
408 {
409   int ierr;
410 
411   PetscFunctionBegin;
412   PetscValidHeaderSpecific(A,MAT_COOKIE);
413   PetscValidType(A);
414   MatPreallocated(A);
415   if (--A->refct > 0) PetscFunctionReturn(0);
416 
417   /* if memory was published with AMS then destroy it */
418   ierr = PetscObjectDepublish(A);CHKERRQ(ierr);
419   if (A->mapping) {
420     ierr = ISLocalToGlobalMappingDestroy(A->mapping);CHKERRQ(ierr);
421   }
422   if (A->bmapping) {
423     ierr = ISLocalToGlobalMappingDestroy(A->bmapping);CHKERRQ(ierr);
424   }
425   if (A->rmap) {
426     ierr = PetscMapDestroy(A->rmap);CHKERRQ(ierr);
427   }
428   if (A->cmap) {
429     ierr = PetscMapDestroy(A->cmap);CHKERRQ(ierr);
430   }
431 
432   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
433   PetscLogObjectDestroy(A);
434   PetscHeaderDestroy(A);
435   PetscFunctionReturn(0);
436 }
437 
438 #undef __FUNCT__
439 #define __FUNCT__ "MatValid"
440 /*@
441    MatValid - Checks whether a matrix object is valid.
442 
443    Collective on Mat
444 
445    Input Parameter:
446 .  m - the matrix to check
447 
448    Output Parameter:
449    flg - flag indicating matrix status, either
450    PETSC_TRUE if matrix is valid, or PETSC_FALSE otherwise.
451 
452    Level: developer
453 
454    Concepts: matrices^validity
455 @*/
456 int MatValid(Mat m,PetscTruth *flg)
457 {
458   PetscFunctionBegin;
459   PetscValidIntPointer(flg);
460   if (!m)                           *flg = PETSC_FALSE;
461   else if (m->cookie != MAT_COOKIE) *flg = PETSC_FALSE;
462   else                              *flg = PETSC_TRUE;
463   PetscFunctionReturn(0);
464 }
465 
466 #undef __FUNCT__
467 #define __FUNCT__ "MatSetValues"
468 /*@
469    MatSetValues - Inserts or adds a block of values into a matrix.
470    These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd()
471    MUST be called after all calls to MatSetValues() have been completed.
472 
473    Not Collective
474 
475    Input Parameters:
476 +  mat - the matrix
477 .  v - a logically two-dimensional array of values
478 .  m, idxm - the number of rows and their global indices
479 .  n, idxn - the number of columns and their global indices
480 -  addv - either ADD_VALUES or INSERT_VALUES, where
481    ADD_VALUES adds values to any existing entries, and
482    INSERT_VALUES replaces existing entries with new values
483 
484    Notes:
485    By default the values, v, are row-oriented and unsorted.
486    See MatSetOption() for other options.
487 
488    Calls to MatSetValues() with the INSERT_VALUES and ADD_VALUES
489    options cannot be mixed without intervening calls to the assembly
490    routines.
491 
492    MatSetValues() uses 0-based row and column numbers in Fortran
493    as well as in C.
494 
495    Negative indices may be passed in idxm and idxn, these rows and columns are
496    simply ignored. This allows easily inserting element stiffness matrices
497    with homogeneous Dirchlet boundary conditions that you don't want represented
498    in the matrix.
499 
500    Efficiency Alert:
501    The routine MatSetValuesBlocked() may offer much better efficiency
502    for users of block sparse formats (MATSEQBAIJ and MATMPIBAIJ).
503 
504    Level: beginner
505 
506    Concepts: matrices^putting entries in
507 
508 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal()
509 @*/
510 int MatSetValues(Mat mat,int m,int *idxm,int n,int *idxn,PetscScalar *v,InsertMode addv)
511 {
512   int ierr;
513 
514   PetscFunctionBegin;
515   if (!m || !n) PetscFunctionReturn(0); /* no values to insert */
516   PetscValidHeaderSpecific(mat,MAT_COOKIE);
517   PetscValidType(mat);
518   MatPreallocated(mat);
519   PetscValidIntPointer(idxm);
520   PetscValidIntPointer(idxn);
521   PetscValidScalarPointer(v);
522   if (mat->insertmode == NOT_SET_VALUES) {
523     mat->insertmode = addv;
524   }
525 #if defined(PETSC_USE_BOPT_g)
526   else if (mat->insertmode != addv) {
527     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values");
528   }
529   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
530 #endif
531 
532   if (mat->assembled) {
533     mat->was_assembled = PETSC_TRUE;
534     mat->assembled     = PETSC_FALSE;
535   }
536   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
537   if (!mat->ops->setvalues) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
538   ierr = (*mat->ops->setvalues)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr);
539   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
540   PetscFunctionReturn(0);
541 }
542 
543 #undef __FUNCT__
544 #define __FUNCT__ "MatSetValuesStencil"
545 /*@C
546    MatSetValuesStencil - Inserts or adds a block of values into a matrix.
547      Using structured grid indexing
548 
549    Not Collective
550 
551    Input Parameters:
552 +  mat - the matrix
553 .  v - a logically two-dimensional array of values
554 .  m - number of rows being entered
555 .  idxm - grid coordinates (and component number when dof > 1) for matrix rows being entered
556 .  n - number of columns being entered
557 .  idxn - grid coordinates (and component number when dof > 1) for matrix columns being entered
558 -  addv - either ADD_VALUES or INSERT_VALUES, where
559    ADD_VALUES adds values to any existing entries, and
560    INSERT_VALUES replaces existing entries with new values
561 
562    Notes:
563    By default the values, v, are row-oriented and unsorted.
564    See MatSetOption() for other options.
565 
566    Calls to MatSetValuesStencil() with the INSERT_VALUES and ADD_VALUES
567    options cannot be mixed without intervening calls to the assembly
568    routines.
569 
570    The grid coordinates are across the entire grid, not just the local portion
571 
572    MatSetValuesStencil() uses 0-based row and column numbers in Fortran
573    as well as in C.
574 
575    In order to use this routine you must either obtain the matrix with DAGetMatrix()
576    or call MatSetLocalToGlobalMapping() and MatSetStencil() first.
577 
578    In Fortran idxm and idxn should be declared as
579 $     MatStencil idxm(4,m),idxn(4,n)
580    and the values inserted using
581 $    idxm(MatStencil_i,1) = i
582 $    idxm(MatStencil_j,1) = j
583 $    idxm(MatStencil_k,1) = k
584 $    idxm(MatStencil_c,1) = c
585    etc
586 
587    Negative indices may be passed in idxm and idxn, these rows and columns are
588    simply ignored. This allows easily inserting element stiffness matrices
589    with homogeneous Dirchlet boundary conditions that you don't want represented
590    in the matrix.
591 
592    Inspired by the structured grid interface to the HYPRE package
593    (http://www.llnl.gov/CASC/hypre)
594 
595    Efficiency Alert:
596    The routine MatSetValuesBlockedStencil() may offer much better efficiency
597    for users of block sparse formats (MATSEQBAIJ and MATMPIBAIJ).
598 
599    Level: beginner
600 
601    Concepts: matrices^putting entries in
602 
603 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal()
604           MatSetValues(), MatSetValuesBlockedStencil(), MatSetStencil(), DAGetMatrix()
605 @*/
606 int MatSetValuesStencil(Mat mat,int m,MatStencil *idxm,int n,MatStencil *idxn,PetscScalar *v,InsertMode addv)
607 {
608   int j,i,ierr,jdxm[128],jdxn[256],dim = mat->stencil.dim,*dims = mat->stencil.dims+1,tmp;
609   int *starts = mat->stencil.starts,*dxm = (int*)idxm,*dxn = (int*)idxn,sdim = dim - (1 - (int)mat->stencil.noc);
610 
611   PetscFunctionBegin;
612   if (!m || !n) PetscFunctionReturn(0); /* no values to insert */
613   PetscValidHeaderSpecific(mat,MAT_COOKIE);
614   PetscValidType(mat);
615   PetscValidIntPointer(idxm);
616   PetscValidIntPointer(idxn);
617   PetscValidScalarPointer(v);
618 
619   if (m > 128) SETERRQ1(1,"Can only set 128 rows at a time; trying to set %d",m);
620   if (n > 128) SETERRQ1(1,"Can only set 256 columns at a time; trying to set %d",n);
621 
622   for (i=0; i<m; i++) {
623     for (j=0; j<3-sdim; j++) dxm++;
624     tmp = *dxm++ - starts[0];
625     for (j=0; j<dim-1; j++) {
626       tmp = tmp*dims[j] + *dxm++ - starts[j+1];
627     }
628     if (mat->stencil.noc) dxm++;
629     jdxm[i] = tmp;
630   }
631   for (i=0; i<n; i++) {
632     for (j=0; j<3-sdim; j++) dxn++;
633     tmp = *dxn++ - starts[0];
634     for (j=0; j<dim-1; j++) {
635       tmp = tmp*dims[j] + *dxn++ - starts[j+1];
636     }
637     if (mat->stencil.noc) dxn++;
638     jdxn[i] = tmp;
639   }
640   ierr = MatSetValuesLocal(mat,m,jdxm,n,jdxn,v,addv);CHKERRQ(ierr);
641   PetscFunctionReturn(0);
642 }
643 
644 #undef __FUNCT__
645 #define __FUNCT__ "MatSetStencil"
646 /*@
647    MatSetStencil - Sets the grid information for setting values into a matrix via
648         MatSetStencil()
649 
650    Not Collective
651 
652    Input Parameters:
653 +  mat - the matrix
654 .  dim - dimension of the grid 1,2, or 3
655 .  dims - number of grid points in x, y, and z direction, including ghost points on your processor
656 .  starts - starting point of ghost nodes on your processor in x, y, and z direction
657 -  dof - number of degrees of freedom per node
658 
659 
660    Inspired by the structured grid interface to the HYPRE package
661    (www.llnl.gov/CASC/hyper)
662 
663    Level: beginner
664 
665    Concepts: matrices^putting entries in
666 
667 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal()
668           MatSetValues(), MatSetValuesBlockedStencil(), MatSetValuesStencil()
669 @*/
670 int MatSetStencil(Mat mat,int dim,int *dims,int *starts,int dof)
671 {
672   int i;
673 
674   PetscFunctionBegin;
675   PetscValidHeaderSpecific(mat,MAT_COOKIE);
676   PetscValidIntPointer(dims);
677   PetscValidIntPointer(starts);
678 
679   mat->stencil.dim = dim + (dof > 1);
680   for (i=0; i<dim; i++) {
681     mat->stencil.dims[i]   = dims[dim-i-1];      /* copy the values in backwards */
682     mat->stencil.starts[i] = starts[dim-i-1];
683   }
684   mat->stencil.dims[dim]   = dof;
685   mat->stencil.starts[dim] = 0;
686   mat->stencil.noc         = (PetscTruth)(dof == 1);
687   PetscFunctionReturn(0);
688 }
689 
690 #undef __FUNCT__
691 #define __FUNCT__ "MatSetValuesBlocked"
692 /*@
693    MatSetValuesBlocked - Inserts or adds a block of values into a matrix.
694 
695    Not Collective
696 
697    Input Parameters:
698 +  mat - the matrix
699 .  v - a logically two-dimensional array of values
700 .  m, idxm - the number of block rows and their global block indices
701 .  n, idxn - the number of block columns and their global block indices
702 -  addv - either ADD_VALUES or INSERT_VALUES, where
703    ADD_VALUES adds values to any existing entries, and
704    INSERT_VALUES replaces existing entries with new values
705 
706    Notes:
707    By default the values, v, are row-oriented and unsorted. So the layout of
708    v is the same as for MatSetValues(). See MatSetOption() for other options.
709 
710    Calls to MatSetValuesBlocked() with the INSERT_VALUES and ADD_VALUES
711    options cannot be mixed without intervening calls to the assembly
712    routines.
713 
714    MatSetValuesBlocked() uses 0-based row and column numbers in Fortran
715    as well as in C.
716 
717    Negative indices may be passed in idxm and idxn, these rows and columns are
718    simply ignored. This allows easily inserting element stiffness matrices
719    with homogeneous Dirchlet boundary conditions that you don't want represented
720    in the matrix.
721 
722    Each time an entry is set within a sparse matrix via MatSetValues(),
723    internal searching must be done to determine where to place the the
724    data in the matrix storage space.  By instead inserting blocks of
725    entries via MatSetValuesBlocked(), the overhead of matrix assembly is
726    reduced.
727 
728    Restrictions:
729    MatSetValuesBlocked() is currently supported only for the block AIJ
730    matrix format (MATSEQBAIJ and MATMPIBAIJ, which are created via
731    MatCreateSeqBAIJ() and MatCreateMPIBAIJ()).
732 
733    Level: intermediate
734 
735    Concepts: matrices^putting entries in blocked
736 
737 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesBlockedLocal()
738 @*/
739 int MatSetValuesBlocked(Mat mat,int m,int *idxm,int n,int *idxn,PetscScalar *v,InsertMode addv)
740 {
741   int ierr;
742 
743   PetscFunctionBegin;
744   if (!m || !n) PetscFunctionReturn(0); /* no values to insert */
745   PetscValidHeaderSpecific(mat,MAT_COOKIE);
746   PetscValidType(mat);
747   MatPreallocated(mat);
748   PetscValidIntPointer(idxm);
749   PetscValidIntPointer(idxn);
750   PetscValidScalarPointer(v);
751   if (mat->insertmode == NOT_SET_VALUES) {
752     mat->insertmode = addv;
753   }
754 #if defined(PETSC_USE_BOPT_g)
755   else if (mat->insertmode != addv) {
756     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values");
757   }
758   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
759 #endif
760 
761   if (mat->assembled) {
762     mat->was_assembled = PETSC_TRUE;
763     mat->assembled     = PETSC_FALSE;
764   }
765   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
766   if (!mat->ops->setvaluesblocked) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
767   ierr = (*mat->ops->setvaluesblocked)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr);
768   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
769   PetscFunctionReturn(0);
770 }
771 
772 /*MC
773    MatSetValue - Set a single entry into a matrix.
774 
775    Synopsis:
776    int MatSetValue(Mat m,int row,int col,PetscScalar value,InsertMode mode);
777 
778    Not collective
779 
780    Input Parameters:
781 +  m - the matrix
782 .  row - the row location of the entry
783 .  col - the column location of the entry
784 .  value - the value to insert
785 -  mode - either INSERT_VALUES or ADD_VALUES
786 
787    Notes:
788    For efficiency one should use MatSetValues() and set several or many
789    values simultaneously if possible.
790 
791    Note that VecSetValue() does NOT return an error code (since this
792    is checked internally).
793 
794    Level: beginner
795 
796 .seealso: MatSetValues()
797 M*/
798 
799 #undef __FUNCT__
800 #define __FUNCT__ "MatGetValues"
801 /*@
802    MatGetValues - Gets a block of values from a matrix.
803 
804    Not Collective; currently only returns a local block
805 
806    Input Parameters:
807 +  mat - the matrix
808 .  v - a logically two-dimensional array for storing the values
809 .  m, idxm - the number of rows and their global indices
810 -  n, idxn - the number of columns and their global indices
811 
812    Notes:
813    The user must allocate space (m*n PetscScalars) for the values, v.
814    The values, v, are then returned in a row-oriented format,
815    analogous to that used by default in MatSetValues().
816 
817    MatGetValues() uses 0-based row and column numbers in
818    Fortran as well as in C.
819 
820    MatGetValues() requires that the matrix has been assembled
821    with MatAssemblyBegin()/MatAssemblyEnd().  Thus, calls to
822    MatSetValues() and MatGetValues() CANNOT be made in succession
823    without intermediate matrix assembly.
824 
825    Level: advanced
826 
827    Concepts: matrices^accessing values
828 
829 .seealso: MatGetRow(), MatGetSubmatrices(), MatSetValues()
830 @*/
831 int MatGetValues(Mat mat,int m,int *idxm,int n,int *idxn,PetscScalar *v)
832 {
833   int ierr;
834 
835   PetscFunctionBegin;
836   PetscValidHeaderSpecific(mat,MAT_COOKIE);
837   PetscValidType(mat);
838   MatPreallocated(mat);
839   PetscValidIntPointer(idxm);
840   PetscValidIntPointer(idxn);
841   PetscValidScalarPointer(v);
842   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
843   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
844   if (!mat->ops->getvalues) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
845 
846   ierr = PetscLogEventBegin(MAT_GetValues,mat,0,0,0);CHKERRQ(ierr);
847   ierr = (*mat->ops->getvalues)(mat,m,idxm,n,idxn,v);CHKERRQ(ierr);
848   ierr = PetscLogEventEnd(MAT_GetValues,mat,0,0,0);CHKERRQ(ierr);
849   PetscFunctionReturn(0);
850 }
851 
852 #undef __FUNCT__
853 #define __FUNCT__ "MatSetLocalToGlobalMapping"
854 /*@
855    MatSetLocalToGlobalMapping - Sets a local-to-global numbering for use by
856    the routine MatSetValuesLocal() to allow users to insert matrix entries
857    using a local (per-processor) numbering.
858 
859    Not Collective
860 
861    Input Parameters:
862 +  x - the matrix
863 -  mapping - mapping created with ISLocalToGlobalMappingCreate()
864              or ISLocalToGlobalMappingCreateIS()
865 
866    Level: intermediate
867 
868    Concepts: matrices^local to global mapping
869    Concepts: local to global mapping^for matrices
870 
871 .seealso:  MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesLocal()
872 @*/
873 int MatSetLocalToGlobalMapping(Mat x,ISLocalToGlobalMapping mapping)
874 {
875   int ierr;
876   PetscFunctionBegin;
877   PetscValidHeaderSpecific(x,MAT_COOKIE);
878   PetscValidType(x);
879   MatPreallocated(x);
880   PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE);
881   if (x->mapping) {
882     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Mapping already set for matrix");
883   }
884 
885   if (x->ops->setlocaltoglobalmapping) {
886     ierr = (*x->ops->setlocaltoglobalmapping)(x,mapping);CHKERRQ(ierr);
887   } else {
888     x->mapping = mapping;
889     ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr);
890   }
891   PetscFunctionReturn(0);
892 }
893 
894 #undef __FUNCT__
895 #define __FUNCT__ "MatSetLocalToGlobalMappingBlock"
896 /*@
897    MatSetLocalToGlobalMappingBlock - Sets a local-to-global numbering for use
898    by the routine MatSetValuesBlockedLocal() to allow users to insert matrix
899    entries using a local (per-processor) numbering.
900 
901    Not Collective
902 
903    Input Parameters:
904 +  x - the matrix
905 -  mapping - mapping created with ISLocalToGlobalMappingCreate() or
906              ISLocalToGlobalMappingCreateIS()
907 
908    Level: intermediate
909 
910    Concepts: matrices^local to global mapping blocked
911    Concepts: local to global mapping^for matrices, blocked
912 
913 .seealso:  MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesBlockedLocal(),
914            MatSetValuesBlocked(), MatSetValuesLocal()
915 @*/
916 int MatSetLocalToGlobalMappingBlock(Mat x,ISLocalToGlobalMapping mapping)
917 {
918   int ierr;
919   PetscFunctionBegin;
920   PetscValidHeaderSpecific(x,MAT_COOKIE);
921   PetscValidType(x);
922   MatPreallocated(x);
923   PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE);
924   if (x->bmapping) {
925     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Mapping already set for matrix");
926   }
927 
928   x->bmapping = mapping;
929   ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr);
930   PetscFunctionReturn(0);
931 }
932 
933 #undef __FUNCT__
934 #define __FUNCT__ "MatSetValuesLocal"
935 /*@
936    MatSetValuesLocal - Inserts or adds values into certain locations of a matrix,
937    using a local ordering of the nodes.
938 
939    Not Collective
940 
941    Input Parameters:
942 +  x - the matrix
943 .  nrow, irow - number of rows and their local indices
944 .  ncol, icol - number of columns and their local indices
945 .  y -  a logically two-dimensional array of values
946 -  addv - either INSERT_VALUES or ADD_VALUES, where
947    ADD_VALUES adds values to any existing entries, and
948    INSERT_VALUES replaces existing entries with new values
949 
950    Notes:
951    Before calling MatSetValuesLocal(), the user must first set the
952    local-to-global mapping by calling MatSetLocalToGlobalMapping().
953 
954    Calls to MatSetValuesLocal() with the INSERT_VALUES and ADD_VALUES
955    options cannot be mixed without intervening calls to the assembly
956    routines.
957 
958    These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd()
959    MUST be called after all calls to MatSetValuesLocal() have been completed.
960 
961    Level: intermediate
962 
963    Concepts: matrices^putting entries in with local numbering
964 
965 .seealso:  MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetLocalToGlobalMapping(),
966            MatSetValueLocal()
967 @*/
968 int MatSetValuesLocal(Mat mat,int nrow,int *irow,int ncol,int *icol,PetscScalar *y,InsertMode addv)
969 {
970   int ierr,irowm[2048],icolm[2048];
971 
972   PetscFunctionBegin;
973   PetscValidHeaderSpecific(mat,MAT_COOKIE);
974   PetscValidType(mat);
975   MatPreallocated(mat);
976   PetscValidIntPointer(irow);
977   PetscValidIntPointer(icol);
978   PetscValidScalarPointer(y);
979 
980   if (mat->insertmode == NOT_SET_VALUES) {
981     mat->insertmode = addv;
982   }
983 #if defined(PETSC_USE_BOPT_g)
984   else if (mat->insertmode != addv) {
985     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values");
986   }
987   if (!mat->ops->setvalueslocal && (nrow > 2048 || ncol > 2048)) {
988     SETERRQ2(PETSC_ERR_SUP,"Number column/row indices must be <= 2048: are %d %d",nrow,ncol);
989   }
990   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
991 #endif
992 
993   if (mat->assembled) {
994     mat->was_assembled = PETSC_TRUE;
995     mat->assembled     = PETSC_FALSE;
996   }
997   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
998   if (!mat->ops->setvalueslocal) {
999     ierr = ISLocalToGlobalMappingApply(mat->mapping,nrow,irow,irowm);CHKERRQ(ierr);
1000     ierr = ISLocalToGlobalMappingApply(mat->mapping,ncol,icol,icolm);CHKERRQ(ierr);
1001     ierr = (*mat->ops->setvalues)(mat,nrow,irowm,ncol,icolm,y,addv);CHKERRQ(ierr);
1002   } else {
1003     ierr = (*mat->ops->setvalueslocal)(mat,nrow,irow,ncol,icol,y,addv);CHKERRQ(ierr);
1004   }
1005   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
1006   PetscFunctionReturn(0);
1007 }
1008 
1009 #undef __FUNCT__
1010 #define __FUNCT__ "MatSetValuesBlockedLocal"
1011 /*@
1012    MatSetValuesBlockedLocal - Inserts or adds values into certain locations of a matrix,
1013    using a local ordering of the nodes a block at a time.
1014 
1015    Not Collective
1016 
1017    Input Parameters:
1018 +  x - the matrix
1019 .  nrow, irow - number of rows and their local indices
1020 .  ncol, icol - number of columns and their local indices
1021 .  y -  a logically two-dimensional array of values
1022 -  addv - either INSERT_VALUES or ADD_VALUES, where
1023    ADD_VALUES adds values to any existing entries, and
1024    INSERT_VALUES replaces existing entries with new values
1025 
1026    Notes:
1027    Before calling MatSetValuesBlockedLocal(), the user must first set the
1028    local-to-global mapping by calling MatSetLocalToGlobalMappingBlock(),
1029    where the mapping MUST be set for matrix blocks, not for matrix elements.
1030 
1031    Calls to MatSetValuesBlockedLocal() with the INSERT_VALUES and ADD_VALUES
1032    options cannot be mixed without intervening calls to the assembly
1033    routines.
1034 
1035    These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd()
1036    MUST be called after all calls to MatSetValuesBlockedLocal() have been completed.
1037 
1038    Level: intermediate
1039 
1040    Concepts: matrices^putting blocked values in with local numbering
1041 
1042 .seealso:  MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesLocal(), MatSetLocalToGlobalMappingBlock(), MatSetValuesBlocked()
1043 @*/
1044 int MatSetValuesBlockedLocal(Mat mat,int nrow,int *irow,int ncol,int *icol,PetscScalar *y,InsertMode addv)
1045 {
1046   int ierr,irowm[2048],icolm[2048];
1047 
1048   PetscFunctionBegin;
1049   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1050   PetscValidType(mat);
1051   MatPreallocated(mat);
1052   PetscValidIntPointer(irow);
1053   PetscValidIntPointer(icol);
1054   PetscValidScalarPointer(y);
1055   if (mat->insertmode == NOT_SET_VALUES) {
1056     mat->insertmode = addv;
1057   }
1058 #if defined(PETSC_USE_BOPT_g)
1059   else if (mat->insertmode != addv) {
1060     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values");
1061   }
1062   if (!mat->bmapping) {
1063     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Local to global never set with MatSetLocalToGlobalMappingBlock()");
1064   }
1065   if (nrow > 2048 || ncol > 2048) {
1066     SETERRQ2(PETSC_ERR_SUP,"Number column/row indices must be <= 2048: are %d %d",nrow,ncol);
1067   }
1068   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1069 #endif
1070 
1071   if (mat->assembled) {
1072     mat->was_assembled = PETSC_TRUE;
1073     mat->assembled     = PETSC_FALSE;
1074   }
1075   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
1076   ierr = ISLocalToGlobalMappingApply(mat->bmapping,nrow,irow,irowm);CHKERRQ(ierr);
1077   ierr = ISLocalToGlobalMappingApply(mat->bmapping,ncol,icol,icolm);CHKERRQ(ierr);
1078   ierr = (*mat->ops->setvaluesblocked)(mat,nrow,irowm,ncol,icolm,y,addv);CHKERRQ(ierr);
1079   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
1080   PetscFunctionReturn(0);
1081 }
1082 
1083 /* --------------------------------------------------------*/
1084 #undef __FUNCT__
1085 #define __FUNCT__ "MatMult"
1086 /*@
1087    MatMult - Computes the matrix-vector product, y = Ax.
1088 
1089    Collective on Mat and Vec
1090 
1091    Input Parameters:
1092 +  mat - the matrix
1093 -  x   - the vector to be multilplied
1094 
1095    Output Parameters:
1096 .  y - the result
1097 
1098    Notes:
1099    The vectors x and y cannot be the same.  I.e., one cannot
1100    call MatMult(A,y,y).
1101 
1102    Level: beginner
1103 
1104    Concepts: matrix-vector product
1105 
1106 .seealso: MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd()
1107 @*/
1108 int MatMult(Mat mat,Vec x,Vec y)
1109 {
1110   int ierr;
1111 
1112   PetscFunctionBegin;
1113   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1114   PetscValidType(mat);
1115   MatPreallocated(mat);
1116   PetscValidHeaderSpecific(x,VEC_COOKIE);
1117   PetscValidHeaderSpecific(y,VEC_COOKIE);
1118 
1119   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1120   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1121   if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors");
1122 #ifndef PETSC_HAVE_CONSTRAINTS
1123   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1124   if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N);
1125   if (mat->m != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: local dim %d %d",mat->m,y->n);
1126 #endif
1127 
1128   if (mat->nullsp) {
1129     ierr = MatNullSpaceRemove(mat->nullsp,x,&x);CHKERRQ(ierr);
1130   }
1131 
1132   ierr = PetscLogEventBegin(MAT_Mult,mat,x,y,0);CHKERRQ(ierr);
1133   ierr = (*mat->ops->mult)(mat,x,y);CHKERRQ(ierr);
1134   ierr = PetscLogEventEnd(MAT_Mult,mat,x,y,0);CHKERRQ(ierr);
1135 
1136   if (mat->nullsp) {
1137     ierr = MatNullSpaceRemove(mat->nullsp,y,PETSC_NULL);CHKERRQ(ierr);
1138   }
1139   PetscFunctionReturn(0);
1140 }
1141 
1142 #undef __FUNCT__
1143 #define __FUNCT__ "MatMultTranspose"
1144 /*@
1145    MatMultTranspose - Computes matrix transpose times a vector.
1146 
1147    Collective on Mat and Vec
1148 
1149    Input Parameters:
1150 +  mat - the matrix
1151 -  x   - the vector to be multilplied
1152 
1153    Output Parameters:
1154 .  y - the result
1155 
1156    Notes:
1157    The vectors x and y cannot be the same.  I.e., one cannot
1158    call MatMultTranspose(A,y,y).
1159 
1160    Level: beginner
1161 
1162    Concepts: matrix vector product^transpose
1163 
1164 .seealso: MatMult(), MatMultAdd(), MatMultTransposeAdd()
1165 @*/
1166 int MatMultTranspose(Mat mat,Vec x,Vec y)
1167 {
1168   int ierr;
1169   PetscTruth flg1, flg2;
1170 
1171   PetscFunctionBegin;
1172   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1173   PetscValidType(mat);
1174   MatPreallocated(mat);
1175   PetscValidHeaderSpecific(x,VEC_COOKIE);
1176   PetscValidHeaderSpecific(y,VEC_COOKIE);
1177 
1178   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1179   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1180   if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors");
1181 #ifndef PETSC_HAVE_CONSTRAINTS
1182   if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N);
1183   if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->N,y->N);
1184 #endif
1185 
1186   if (!mat->ops->multtranspose) SETERRQ(PETSC_ERR_SUP, "Operation not supported");
1187   ierr = PetscLogEventBegin(MAT_MultTranspose,mat,x,y,0);CHKERRQ(ierr);
1188   if (!mat->ops->multtranspose) SETERRQ(PETSC_ERR_SUP,"This matrix type does not have a multiply tranpose defined");
1189 
1190   ierr = PetscTypeCompare((PetscObject)mat,MATSEQSBAIJ,&flg1);
1191   ierr = PetscTypeCompare((PetscObject)mat,MATMPISBAIJ,&flg2);
1192   if (flg1 || flg2) { /* mat is in sbaij format */
1193     ierr = (*mat->ops->mult)(mat,x,y);CHKERRQ(ierr);
1194   } else {
1195     ierr = (*mat->ops->multtranspose)(mat,x,y);CHKERRQ(ierr);
1196   }
1197   ierr = PetscLogEventEnd(MAT_MultTranspose,mat,x,y,0);CHKERRQ(ierr);
1198   PetscFunctionReturn(0);
1199 }
1200 
1201 #undef __FUNCT__
1202 #define __FUNCT__ "MatMultAdd"
1203 /*@
1204     MatMultAdd -  Computes v3 = v2 + A * v1.
1205 
1206     Collective on Mat and Vec
1207 
1208     Input Parameters:
1209 +   mat - the matrix
1210 -   v1, v2 - the vectors
1211 
1212     Output Parameters:
1213 .   v3 - the result
1214 
1215     Notes:
1216     The vectors v1 and v3 cannot be the same.  I.e., one cannot
1217     call MatMultAdd(A,v1,v2,v1).
1218 
1219     Level: beginner
1220 
1221     Concepts: matrix vector product^addition
1222 
1223 .seealso: MatMultTranspose(), MatMult(), MatMultTransposeAdd()
1224 @*/
1225 int MatMultAdd(Mat mat,Vec v1,Vec v2,Vec v3)
1226 {
1227   int ierr;
1228 
1229   PetscFunctionBegin;
1230   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1231   PetscValidType(mat);
1232   MatPreallocated(mat);
1233   PetscValidHeaderSpecific(v1,VEC_COOKIE);
1234   PetscValidHeaderSpecific(v2,VEC_COOKIE);
1235   PetscValidHeaderSpecific(v3,VEC_COOKIE);
1236 
1237   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1238   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1239   if (mat->N != v1->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v1: global dim %d %d",mat->N,v1->N);
1240   if (mat->M != v2->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: global dim %d %d",mat->M,v2->N);
1241   if (mat->M != v3->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: global dim %d %d",mat->M,v3->N);
1242   if (mat->m != v3->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: local dim %d %d",mat->m,v3->n);
1243   if (mat->m != v2->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: local dim %d %d",mat->m,v2->n);
1244   if (v1 == v3) SETERRQ(PETSC_ERR_ARG_IDN,"v1 and v3 must be different vectors");
1245 
1246   ierr = PetscLogEventBegin(MAT_MultAdd,mat,v1,v2,v3);CHKERRQ(ierr);
1247   ierr = (*mat->ops->multadd)(mat,v1,v2,v3);CHKERRQ(ierr);
1248   ierr = PetscLogEventEnd(MAT_MultAdd,mat,v1,v2,v3);CHKERRQ(ierr);
1249   PetscFunctionReturn(0);
1250 }
1251 
1252 #undef __FUNCT__
1253 #define __FUNCT__ "MatMultTransposeAdd"
1254 /*@
1255    MatMultTransposeAdd - Computes v3 = v2 + A' * v1.
1256 
1257    Collective on Mat and Vec
1258 
1259    Input Parameters:
1260 +  mat - the matrix
1261 -  v1, v2 - the vectors
1262 
1263    Output Parameters:
1264 .  v3 - the result
1265 
1266    Notes:
1267    The vectors v1 and v3 cannot be the same.  I.e., one cannot
1268    call MatMultTransposeAdd(A,v1,v2,v1).
1269 
1270    Level: beginner
1271 
1272    Concepts: matrix vector product^transpose and addition
1273 
1274 .seealso: MatMultTranspose(), MatMultAdd(), MatMult()
1275 @*/
1276 int MatMultTransposeAdd(Mat mat,Vec v1,Vec v2,Vec v3)
1277 {
1278   int ierr;
1279 
1280   PetscFunctionBegin;
1281   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1282   PetscValidType(mat);
1283   MatPreallocated(mat);
1284   PetscValidHeaderSpecific(v1,VEC_COOKIE);
1285   PetscValidHeaderSpecific(v2,VEC_COOKIE);
1286   PetscValidHeaderSpecific(v3,VEC_COOKIE);
1287 
1288   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1289   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1290   if (!mat->ops->multtransposeadd) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1291   if (v1 == v3) SETERRQ(PETSC_ERR_ARG_IDN,"v1 and v3 must be different vectors");
1292   if (mat->M != v1->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v1: global dim %d %d",mat->M,v1->N);
1293   if (mat->N != v2->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: global dim %d %d",mat->N,v2->N);
1294   if (mat->N != v3->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: global dim %d %d",mat->N,v3->N);
1295 
1296   ierr = PetscLogEventBegin(MAT_MultTransposeAdd,mat,v1,v2,v3);CHKERRQ(ierr);
1297   ierr = (*mat->ops->multtransposeadd)(mat,v1,v2,v3);CHKERRQ(ierr);
1298   ierr = PetscLogEventEnd(MAT_MultTransposeAdd,mat,v1,v2,v3);CHKERRQ(ierr);
1299   PetscFunctionReturn(0);
1300 }
1301 
1302 #undef __FUNCT__
1303 #define __FUNCT__ "MatMultConstrained"
1304 /*@
1305    MatMultConstrained - The inner multiplication routine for a
1306    constrained matrix P^T A P.
1307 
1308    Collective on Mat and Vec
1309 
1310    Input Parameters:
1311 +  mat - the matrix
1312 -  x   - the vector to be multilplied
1313 
1314    Output Parameters:
1315 .  y - the result
1316 
1317    Notes:
1318    The vectors x and y cannot be the same.  I.e., one cannot
1319    call MatMult(A,y,y).
1320 
1321    Level: beginner
1322 
1323 .keywords: matrix, multiply, matrix-vector product, constraint
1324 .seealso: MatMult(), MatMultTrans(), MatMultAdd(), MatMultTransAdd()
1325 @*/
1326 int MatMultConstrained(Mat mat,Vec x,Vec y)
1327 {
1328   int ierr;
1329 
1330   PetscFunctionBegin;
1331   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1332   PetscValidHeaderSpecific(x,VEC_COOKIE);PetscValidHeaderSpecific(y,VEC_COOKIE);
1333   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1334   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1335   if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors");
1336   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1337   if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N);
1338   if (mat->m != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: local dim %d %d",mat->m,y->n);
1339 
1340   ierr = PetscLogEventBegin(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr);
1341   ierr = (*mat->ops->multconstrained)(mat,x,y); CHKERRQ(ierr);
1342   ierr = PetscLogEventEnd(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr);
1343 
1344   PetscFunctionReturn(0);
1345 }
1346 
1347 #undef __FUNCT__
1348 #define __FUNCT__ "MatMultTransposeConstrained"
1349 /*@
1350    MatMultTransposeConstrained - The inner multiplication routine for a
1351    constrained matrix P^T A^T P.
1352 
1353    Collective on Mat and Vec
1354 
1355    Input Parameters:
1356 +  mat - the matrix
1357 -  x   - the vector to be multilplied
1358 
1359    Output Parameters:
1360 .  y - the result
1361 
1362    Notes:
1363    The vectors x and y cannot be the same.  I.e., one cannot
1364    call MatMult(A,y,y).
1365 
1366    Level: beginner
1367 
1368 .keywords: matrix, multiply, matrix-vector product, constraint
1369 .seealso: MatMult(), MatMultTrans(), MatMultAdd(), MatMultTransAdd()
1370 @*/
1371 int MatMultTransposeConstrained(Mat mat,Vec x,Vec y)
1372 {
1373   int ierr;
1374 
1375   PetscFunctionBegin;
1376   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1377   PetscValidHeaderSpecific(x,VEC_COOKIE);PetscValidHeaderSpecific(y,VEC_COOKIE);
1378   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1379   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1380   if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors");
1381   if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1382   if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N);
1383 
1384   ierr = PetscLogEventBegin(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr);
1385   ierr = (*mat->ops->multtransposeconstrained)(mat,x,y);CHKERRQ(ierr);
1386   ierr = PetscLogEventEnd(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr);
1387 
1388   PetscFunctionReturn(0);
1389 }
1390 /* ------------------------------------------------------------*/
1391 #undef __FUNCT__
1392 #define __FUNCT__ "MatGetInfo"
1393 /*@C
1394    MatGetInfo - Returns information about matrix storage (number of
1395    nonzeros, memory, etc.).
1396 
1397    Collective on Mat if MAT_GLOBAL_MAX or MAT_GLOBAL_SUM is used
1398    as the flag
1399 
1400    Input Parameters:
1401 .  mat - the matrix
1402 
1403    Output Parameters:
1404 +  flag - flag indicating the type of parameters to be returned
1405    (MAT_LOCAL - local matrix, MAT_GLOBAL_MAX - maximum over all processors,
1406    MAT_GLOBAL_SUM - sum over all processors)
1407 -  info - matrix information context
1408 
1409    Notes:
1410    The MatInfo context contains a variety of matrix data, including
1411    number of nonzeros allocated and used, number of mallocs during
1412    matrix assembly, etc.  Additional information for factored matrices
1413    is provided (such as the fill ratio, number of mallocs during
1414    factorization, etc.).  Much of this info is printed to STDOUT
1415    when using the runtime options
1416 $       -log_info -mat_view_info
1417 
1418    Example for C/C++ Users:
1419    See the file ${PETSC_DIR}/include/petscmat.h for a complete list of
1420    data within the MatInfo context.  For example,
1421 .vb
1422       MatInfo info;
1423       Mat     A;
1424       double  mal, nz_a, nz_u;
1425 
1426       MatGetInfo(A,MAT_LOCAL,&info);
1427       mal  = info.mallocs;
1428       nz_a = info.nz_allocated;
1429 .ve
1430 
1431    Example for Fortran Users:
1432    Fortran users should declare info as a double precision
1433    array of dimension MAT_INFO_SIZE, and then extract the parameters
1434    of interest.  See the file ${PETSC_DIR}/include/finclude/petscmat.h
1435    a complete list of parameter names.
1436 .vb
1437       double  precision info(MAT_INFO_SIZE)
1438       double  precision mal, nz_a
1439       Mat     A
1440       integer ierr
1441 
1442       call MatGetInfo(A,MAT_LOCAL,info,ierr)
1443       mal = info(MAT_INFO_MALLOCS)
1444       nz_a = info(MAT_INFO_NZ_ALLOCATED)
1445 .ve
1446 
1447     Level: intermediate
1448 
1449     Concepts: matrices^getting information on
1450 
1451 @*/
1452 int MatGetInfo(Mat mat,MatInfoType flag,MatInfo *info)
1453 {
1454   int ierr;
1455 
1456   PetscFunctionBegin;
1457   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1458   PetscValidType(mat);
1459   MatPreallocated(mat);
1460   PetscValidPointer(info);
1461   if (!mat->ops->getinfo) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1462   ierr = (*mat->ops->getinfo)(mat,flag,info);CHKERRQ(ierr);
1463   PetscFunctionReturn(0);
1464 }
1465 
1466 /* ----------------------------------------------------------*/
1467 #undef __FUNCT__
1468 #define __FUNCT__ "MatILUDTFactor"
1469 /*@C
1470    MatILUDTFactor - Performs a drop tolerance ILU factorization.
1471 
1472    Collective on Mat
1473 
1474    Input Parameters:
1475 +  mat - the matrix
1476 .  info - information about the factorization to be done
1477 .  row - row permutation
1478 -  col - column permutation
1479 
1480    Output Parameters:
1481 .  fact - the factored matrix
1482 
1483    Level: developer
1484 
1485    Notes:
1486    Most users should employ the simplified SLES interface for linear solvers
1487    instead of working directly with matrix algebra routines such as this.
1488    See, e.g., SLESCreate().
1489 
1490    This is currently only supported for the SeqAIJ matrix format using code
1491    from Yousef Saad's SPARSEKIT2  package (translated to C with f2c) and/or
1492    Matlab. SPARSEKIT2 is copyrighted by Yousef Saad with the GNU copyright
1493    and thus can be distributed with PETSc.
1494 
1495     Concepts: matrices^ILUDT factorization
1496 
1497 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), MatILUInfo
1498 @*/
1499 int MatILUDTFactor(Mat mat,MatILUInfo *info,IS row,IS col,Mat *fact)
1500 {
1501   int ierr;
1502 
1503   PetscFunctionBegin;
1504   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1505   PetscValidType(mat);
1506   MatPreallocated(mat);
1507   PetscValidPointer(fact);
1508   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1509   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1510   if (!mat->ops->iludtfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1511 
1512   ierr = PetscLogEventBegin(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr);
1513   ierr = (*mat->ops->iludtfactor)(mat,info,row,col,fact);CHKERRQ(ierr);
1514   ierr = PetscLogEventEnd(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr);
1515 
1516   PetscFunctionReturn(0);
1517 }
1518 
1519 #undef __FUNCT__
1520 #define __FUNCT__ "MatLUFactor"
1521 /*@
1522    MatLUFactor - Performs in-place LU factorization of matrix.
1523 
1524    Collective on Mat
1525 
1526    Input Parameters:
1527 +  mat - the matrix
1528 .  row - row permutation
1529 .  col - column permutation
1530 -  info - options for factorization, includes
1531 $          fill - expected fill as ratio of original fill.
1532 $          dtcol - pivot tolerance (0 no pivot, 1 full column pivoting)
1533 $                   Run with the option -log_info to determine an optimal value to use
1534 
1535    Notes:
1536    Most users should employ the simplified SLES interface for linear solvers
1537    instead of working directly with matrix algebra routines such as this.
1538    See, e.g., SLESCreate().
1539 
1540    This changes the state of the matrix to a factored matrix; it cannot be used
1541    for example with MatSetValues() unless one first calls MatSetUnfactored().
1542 
1543    Level: developer
1544 
1545    Concepts: matrices^LU factorization
1546 
1547 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(),
1548           MatGetOrdering(), MatSetUnfactored(), MatLUInfo
1549 
1550 @*/
1551 int MatLUFactor(Mat mat,IS row,IS col,MatLUInfo *info)
1552 {
1553   int ierr;
1554 
1555   PetscFunctionBegin;
1556   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1557   PetscValidType(mat);
1558   MatPreallocated(mat);
1559   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1560   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1561   if (!mat->ops->lufactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1562 
1563   ierr = PetscLogEventBegin(MAT_LUFactor,mat,row,col,0);CHKERRQ(ierr);
1564   ierr = (*mat->ops->lufactor)(mat,row,col,info);CHKERRQ(ierr);
1565   ierr = PetscLogEventEnd(MAT_LUFactor,mat,row,col,0);CHKERRQ(ierr);
1566   PetscFunctionReturn(0);
1567 }
1568 
1569 #undef __FUNCT__
1570 #define __FUNCT__ "MatILUFactor"
1571 /*@
1572    MatILUFactor - Performs in-place ILU factorization of matrix.
1573 
1574    Collective on Mat
1575 
1576    Input Parameters:
1577 +  mat - the matrix
1578 .  row - row permutation
1579 .  col - column permutation
1580 -  info - structure containing
1581 $      levels - number of levels of fill.
1582 $      expected fill - as ratio of original fill.
1583 $      1 or 0 - indicating force fill on diagonal (improves robustness for matrices
1584                 missing diagonal entries)
1585 
1586    Notes:
1587    Probably really in-place only when level of fill is zero, otherwise allocates
1588    new space to store factored matrix and deletes previous memory.
1589 
1590    Most users should employ the simplified SLES interface for linear solvers
1591    instead of working directly with matrix algebra routines such as this.
1592    See, e.g., SLESCreate().
1593 
1594    Level: developer
1595 
1596    Concepts: matrices^ILU factorization
1597 
1598 .seealso: MatILUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), MatILUInfo
1599 @*/
1600 int MatILUFactor(Mat mat,IS row,IS col,MatILUInfo *info)
1601 {
1602   int ierr;
1603 
1604   PetscFunctionBegin;
1605   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1606   PetscValidType(mat);
1607   MatPreallocated(mat);
1608   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square");
1609   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1610   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1611   if (!mat->ops->ilufactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1612 
1613   ierr = PetscLogEventBegin(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr);
1614   ierr = (*mat->ops->ilufactor)(mat,row,col,info);CHKERRQ(ierr);
1615   ierr = PetscLogEventEnd(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr);
1616   PetscFunctionReturn(0);
1617 }
1618 
1619 #undef __FUNCT__
1620 #define __FUNCT__ "MatLUFactorSymbolic"
1621 /*@
1622    MatLUFactorSymbolic - Performs symbolic LU factorization of matrix.
1623    Call this routine before calling MatLUFactorNumeric().
1624 
1625    Collective on Mat
1626 
1627    Input Parameters:
1628 +  mat - the matrix
1629 .  row, col - row and column permutations
1630 -  info - options for factorization, includes
1631 $          fill - expected fill as ratio of original fill.
1632 $          dtcol - pivot tolerance (0 no pivot, 1 full column pivoting)
1633 $                   Run with the option -log_info to determine an optimal value to use
1634 
1635    Output Parameter:
1636 .  fact - new matrix that has been symbolically factored
1637 
1638    Notes:
1639    See the users manual for additional information about
1640    choosing the fill factor for better efficiency.
1641 
1642    Most users should employ the simplified SLES interface for linear solvers
1643    instead of working directly with matrix algebra routines such as this.
1644    See, e.g., SLESCreate().
1645 
1646    Level: developer
1647 
1648    Concepts: matrices^LU symbolic factorization
1649 
1650 .seealso: MatLUFactor(), MatLUFactorNumeric(), MatCholeskyFactor(), MatLUInfo
1651 @*/
1652 int MatLUFactorSymbolic(Mat mat,IS row,IS col,MatLUInfo *info,Mat *fact)
1653 {
1654   int ierr;
1655 
1656   PetscFunctionBegin;
1657   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1658   PetscValidType(mat);
1659   MatPreallocated(mat);
1660   PetscValidPointer(fact);
1661   PetscValidHeaderSpecific(row,IS_COOKIE);
1662   PetscValidHeaderSpecific(col,IS_COOKIE);
1663   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1664   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1665   if (!mat->ops->lufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s  symbolic LU",mat->type_name);
1666 
1667   ierr = PetscLogEventBegin(MAT_LUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr);
1668   ierr = (*mat->ops->lufactorsymbolic)(mat,row,col,info,fact);CHKERRQ(ierr);
1669   ierr = PetscLogEventEnd(MAT_LUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr);
1670   PetscFunctionReturn(0);
1671 }
1672 
1673 #undef __FUNCT__
1674 #define __FUNCT__ "MatLUFactorNumeric"
1675 /*@
1676    MatLUFactorNumeric - Performs numeric LU factorization of a matrix.
1677    Call this routine after first calling MatLUFactorSymbolic().
1678 
1679    Collective on Mat
1680 
1681    Input Parameters:
1682 +  mat - the matrix
1683 -  fact - the matrix generated for the factor, from MatLUFactorSymbolic()
1684 
1685    Notes:
1686    See MatLUFactor() for in-place factorization.  See
1687    MatCholeskyFactorNumeric() for the symmetric, positive definite case.
1688 
1689    Most users should employ the simplified SLES interface for linear solvers
1690    instead of working directly with matrix algebra routines such as this.
1691    See, e.g., SLESCreate().
1692 
1693    Level: developer
1694 
1695    Concepts: matrices^LU numeric factorization
1696 
1697 .seealso: MatLUFactorSymbolic(), MatLUFactor(), MatCholeskyFactor()
1698 @*/
1699 int MatLUFactorNumeric(Mat mat,Mat *fact)
1700 {
1701   int        ierr;
1702 
1703   PetscFunctionBegin;
1704   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1705   PetscValidType(mat);
1706   MatPreallocated(mat);
1707   PetscValidPointer(fact);
1708   PetscValidHeaderSpecific(*fact,MAT_COOKIE);
1709   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1710   if (mat->M != (*fact)->M || mat->N != (*fact)->N) {
1711     SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dimensions are different %d should = %d %d should = %d",
1712             mat->M,(*fact)->M,mat->N,(*fact)->N);
1713   }
1714   if (!(*fact)->ops->lufactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1715 
1716   ierr = PetscLogEventBegin(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1717   ierr = (*(*fact)->ops->lufactornumeric)(mat,fact);CHKERRQ(ierr);
1718   ierr = PetscLogEventEnd(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1719 
1720   ierr = MatView_Private(*fact);CHKERRQ(ierr);
1721   PetscFunctionReturn(0);
1722 }
1723 
1724 #undef __FUNCT__
1725 #define __FUNCT__ "MatCholeskyFactor"
1726 /*@
1727    MatCholeskyFactor - Performs in-place Cholesky factorization of a
1728    symmetric matrix.
1729 
1730    Collective on Mat
1731 
1732    Input Parameters:
1733 +  mat - the matrix
1734 .  perm - row and column permutations
1735 -  f - expected fill as ratio of original fill
1736 
1737    Notes:
1738    See MatLUFactor() for the nonsymmetric case.  See also
1739    MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric().
1740 
1741    Most users should employ the simplified SLES interface for linear solvers
1742    instead of working directly with matrix algebra routines such as this.
1743    See, e.g., SLESCreate().
1744 
1745    Level: developer
1746 
1747    Concepts: matrices^Cholesky factorization
1748 
1749 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric()
1750           MatGetOrdering()
1751 
1752 @*/
1753 int MatCholeskyFactor(Mat mat,IS perm,PetscReal f)
1754 {
1755   int ierr;
1756 
1757   PetscFunctionBegin;
1758   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1759   PetscValidType(mat);
1760   MatPreallocated(mat);
1761   PetscValidHeaderSpecific(perm,IS_COOKIE);
1762   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square");
1763   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1764   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1765   if (!mat->ops->choleskyfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1766 
1767   ierr = PetscLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr);
1768   ierr = (*mat->ops->choleskyfactor)(mat,perm,f);CHKERRQ(ierr);
1769   ierr = PetscLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr);
1770   PetscFunctionReturn(0);
1771 }
1772 
1773 #undef __FUNCT__
1774 #define __FUNCT__ "MatCholeskyFactorSymbolic"
1775 /*@
1776    MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization
1777    of a symmetric matrix.
1778 
1779    Collective on Mat
1780 
1781    Input Parameters:
1782 +  mat - the matrix
1783 .  perm - row and column permutations
1784 -  f - expected fill as ratio of original
1785 
1786    Output Parameter:
1787 .  fact - the factored matrix
1788 
1789    Notes:
1790    See MatLUFactorSymbolic() for the nonsymmetric case.  See also
1791    MatCholeskyFactor() and MatCholeskyFactorNumeric().
1792 
1793    Most users should employ the simplified SLES interface for linear solvers
1794    instead of working directly with matrix algebra routines such as this.
1795    See, e.g., SLESCreate().
1796 
1797    Level: developer
1798 
1799    Concepts: matrices^Cholesky symbolic factorization
1800 
1801 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric()
1802           MatGetOrdering()
1803 
1804 @*/
1805 int MatCholeskyFactorSymbolic(Mat mat,IS perm,PetscReal f,Mat *fact)
1806 {
1807   int ierr;
1808 
1809   PetscFunctionBegin;
1810   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1811   PetscValidType(mat);
1812   MatPreallocated(mat);
1813   PetscValidPointer(fact);
1814   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square");
1815   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1816   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1817   if (!mat->ops->choleskyfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1818 
1819   ierr = PetscLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
1820   ierr = (*mat->ops->choleskyfactorsymbolic)(mat,perm,f,fact);CHKERRQ(ierr);
1821   ierr = PetscLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
1822   PetscFunctionReturn(0);
1823 }
1824 
1825 #undef __FUNCT__
1826 #define __FUNCT__ "MatCholeskyFactorNumeric"
1827 /*@
1828    MatCholeskyFactorNumeric - Performs numeric Cholesky factorization
1829    of a symmetric matrix. Call this routine after first calling
1830    MatCholeskyFactorSymbolic().
1831 
1832    Collective on Mat
1833 
1834    Input Parameter:
1835 .  mat - the initial matrix
1836 
1837    Output Parameter:
1838 .  fact - the factored matrix
1839 
1840    Notes:
1841    Most users should employ the simplified SLES interface for linear solvers
1842    instead of working directly with matrix algebra routines such as this.
1843    See, e.g., SLESCreate().
1844 
1845    Level: developer
1846 
1847    Concepts: matrices^Cholesky numeric factorization
1848 
1849 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric()
1850 @*/
1851 int MatCholeskyFactorNumeric(Mat mat,Mat *fact)
1852 {
1853   int ierr;
1854 
1855   PetscFunctionBegin;
1856   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1857   PetscValidType(mat);
1858   MatPreallocated(mat);
1859   PetscValidPointer(fact);
1860   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1861   if (!(*fact)->ops->choleskyfactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1862   if (mat->M != (*fact)->M || mat->N != (*fact)->N) {
1863     SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dim %d should = %d %d should = %d",
1864             mat->M,(*fact)->M,mat->N,(*fact)->N);
1865   }
1866 
1867   ierr = PetscLogEventBegin(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1868   ierr = (*(*fact)->ops->choleskyfactornumeric)(mat,fact);CHKERRQ(ierr);
1869   ierr = PetscLogEventEnd(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1870   PetscFunctionReturn(0);
1871 }
1872 
1873 /* ----------------------------------------------------------------*/
1874 #undef __FUNCT__
1875 #define __FUNCT__ "MatSolve"
1876 /*@
1877    MatSolve - Solves A x = b, given a factored matrix.
1878 
1879    Collective on Mat and Vec
1880 
1881    Input Parameters:
1882 +  mat - the factored matrix
1883 -  b - the right-hand-side vector
1884 
1885    Output Parameter:
1886 .  x - the result vector
1887 
1888    Notes:
1889    The vectors b and x cannot be the same.  I.e., one cannot
1890    call MatSolve(A,x,x).
1891 
1892    Notes:
1893    Most users should employ the simplified SLES interface for linear solvers
1894    instead of working directly with matrix algebra routines such as this.
1895    See, e.g., SLESCreate().
1896 
1897    Level: developer
1898 
1899    Concepts: matrices^triangular solves
1900 
1901 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd()
1902 @*/
1903 int MatSolve(Mat mat,Vec b,Vec x)
1904 {
1905   int ierr;
1906 
1907   PetscFunctionBegin;
1908   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1909   PetscValidType(mat);
1910   MatPreallocated(mat);
1911   PetscValidHeaderSpecific(b,VEC_COOKIE);
1912   PetscValidHeaderSpecific(x,VEC_COOKIE);
1913   PetscCheckSameComm(mat,b);
1914   PetscCheckSameComm(mat,x);
1915   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
1916   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
1917   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1918   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
1919   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
1920   if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0);
1921 
1922   if (!mat->ops->solve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1923   ierr = PetscLogEventBegin(MAT_Solve,mat,b,x,0);CHKERRQ(ierr);
1924   ierr = (*mat->ops->solve)(mat,b,x);CHKERRQ(ierr);
1925   ierr = PetscLogEventEnd(MAT_Solve,mat,b,x,0);CHKERRQ(ierr);
1926   PetscFunctionReturn(0);
1927 }
1928 
1929 #undef __FUNCT__
1930 #define __FUNCT__ "MatForwardSolve"
1931 /* @
1932    MatForwardSolve - Solves L x = b, given a factored matrix, A = LU.
1933 
1934    Collective on Mat and Vec
1935 
1936    Input Parameters:
1937 +  mat - the factored matrix
1938 -  b - the right-hand-side vector
1939 
1940    Output Parameter:
1941 .  x - the result vector
1942 
1943    Notes:
1944    MatSolve() should be used for most applications, as it performs
1945    a forward solve followed by a backward solve.
1946 
1947    The vectors b and x cannot be the same.  I.e., one cannot
1948    call MatForwardSolve(A,x,x).
1949 
1950    Most users should employ the simplified SLES interface for linear solvers
1951    instead of working directly with matrix algebra routines such as this.
1952    See, e.g., SLESCreate().
1953 
1954    Level: developer
1955 
1956    Concepts: matrices^forward solves
1957 
1958 .seealso: MatSolve(), MatBackwardSolve()
1959 @ */
1960 int MatForwardSolve(Mat mat,Vec b,Vec x)
1961 {
1962   int ierr;
1963 
1964   PetscFunctionBegin;
1965   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1966   PetscValidType(mat);
1967   MatPreallocated(mat);
1968   PetscValidHeaderSpecific(b,VEC_COOKIE);
1969   PetscValidHeaderSpecific(x,VEC_COOKIE);
1970   PetscCheckSameComm(mat,b);
1971   PetscCheckSameComm(mat,x);
1972   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
1973   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
1974   if (!mat->ops->forwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1975   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1976   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
1977   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
1978 
1979   ierr = PetscLogEventBegin(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr);
1980   ierr = (*mat->ops->forwardsolve)(mat,b,x);CHKERRQ(ierr);
1981   ierr = PetscLogEventEnd(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr);
1982   PetscFunctionReturn(0);
1983 }
1984 
1985 #undef __FUNCT__
1986 #define __FUNCT__ "MatBackwardSolve"
1987 /* @
1988    MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU.
1989 
1990    Collective on Mat and Vec
1991 
1992    Input Parameters:
1993 +  mat - the factored matrix
1994 -  b - the right-hand-side vector
1995 
1996    Output Parameter:
1997 .  x - the result vector
1998 
1999    Notes:
2000    MatSolve() should be used for most applications, as it performs
2001    a forward solve followed by a backward solve.
2002 
2003    The vectors b and x cannot be the same.  I.e., one cannot
2004    call MatBackwardSolve(A,x,x).
2005 
2006    Most users should employ the simplified SLES interface for linear solvers
2007    instead of working directly with matrix algebra routines such as this.
2008    See, e.g., SLESCreate().
2009 
2010    Level: developer
2011 
2012    Concepts: matrices^backward solves
2013 
2014 .seealso: MatSolve(), MatForwardSolve()
2015 @ */
2016 int MatBackwardSolve(Mat mat,Vec b,Vec x)
2017 {
2018   int ierr;
2019 
2020   PetscFunctionBegin;
2021   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2022   PetscValidType(mat);
2023   MatPreallocated(mat);
2024   PetscValidHeaderSpecific(b,VEC_COOKIE);
2025   PetscValidHeaderSpecific(x,VEC_COOKIE);
2026   PetscCheckSameComm(mat,b);
2027   PetscCheckSameComm(mat,x);
2028   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2029   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2030   if (!mat->ops->backwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2031   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
2032   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
2033   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
2034 
2035   ierr = PetscLogEventBegin(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr);
2036   ierr = (*mat->ops->backwardsolve)(mat,b,x);CHKERRQ(ierr);
2037   ierr = PetscLogEventEnd(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr);
2038   PetscFunctionReturn(0);
2039 }
2040 
2041 #undef __FUNCT__
2042 #define __FUNCT__ "MatSolveAdd"
2043 /*@
2044    MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix.
2045 
2046    Collective on Mat and Vec
2047 
2048    Input Parameters:
2049 +  mat - the factored matrix
2050 .  b - the right-hand-side vector
2051 -  y - the vector to be added to
2052 
2053    Output Parameter:
2054 .  x - the result vector
2055 
2056    Notes:
2057    The vectors b and x cannot be the same.  I.e., one cannot
2058    call MatSolveAdd(A,x,y,x).
2059 
2060    Most users should employ the simplified SLES interface for linear solvers
2061    instead of working directly with matrix algebra routines such as this.
2062    See, e.g., SLESCreate().
2063 
2064    Level: developer
2065 
2066    Concepts: matrices^triangular solves
2067 
2068 .seealso: MatSolve(), MatSolveTranspose(), MatSolveTransposeAdd()
2069 @*/
2070 int MatSolveAdd(Mat mat,Vec b,Vec y,Vec x)
2071 {
2072   PetscScalar one = 1.0;
2073   Vec    tmp;
2074   int    ierr;
2075 
2076   PetscFunctionBegin;
2077   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2078   PetscValidType(mat);
2079   MatPreallocated(mat);
2080   PetscValidHeaderSpecific(y,VEC_COOKIE);
2081   PetscValidHeaderSpecific(b,VEC_COOKIE);
2082   PetscValidHeaderSpecific(x,VEC_COOKIE);
2083   PetscCheckSameComm(mat,b);
2084   PetscCheckSameComm(mat,y);
2085   PetscCheckSameComm(mat,x);
2086   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2087   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2088   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
2089   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
2090   if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N);
2091   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
2092   if (x->n != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n);
2093 
2094   ierr = PetscLogEventBegin(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr);
2095   if (mat->ops->solveadd)  {
2096     ierr = (*mat->ops->solveadd)(mat,b,y,x);CHKERRQ(ierr);
2097   } else {
2098     /* do the solve then the add manually */
2099     if (x != y) {
2100       ierr = MatSolve(mat,b,x);CHKERRQ(ierr);
2101       ierr = VecAXPY(&one,y,x);CHKERRQ(ierr);
2102     } else {
2103       ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr);
2104       PetscLogObjectParent(mat,tmp);
2105       ierr = VecCopy(x,tmp);CHKERRQ(ierr);
2106       ierr = MatSolve(mat,b,x);CHKERRQ(ierr);
2107       ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr);
2108       ierr = VecDestroy(tmp);CHKERRQ(ierr);
2109     }
2110   }
2111   ierr = PetscLogEventEnd(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr);
2112   PetscFunctionReturn(0);
2113 }
2114 
2115 #undef __FUNCT__
2116 #define __FUNCT__ "MatSolveTranspose"
2117 /*@
2118    MatSolveTranspose - Solves A' x = b, given a factored matrix.
2119 
2120    Collective on Mat and Vec
2121 
2122    Input Parameters:
2123 +  mat - the factored matrix
2124 -  b - the right-hand-side vector
2125 
2126    Output Parameter:
2127 .  x - the result vector
2128 
2129    Notes:
2130    The vectors b and x cannot be the same.  I.e., one cannot
2131    call MatSolveTranspose(A,x,x).
2132 
2133    Most users should employ the simplified SLES interface for linear solvers
2134    instead of working directly with matrix algebra routines such as this.
2135    See, e.g., SLESCreate().
2136 
2137    Level: developer
2138 
2139    Concepts: matrices^triangular solves
2140 
2141 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransposeAdd()
2142 @*/
2143 int MatSolveTranspose(Mat mat,Vec b,Vec x)
2144 {
2145   int ierr;
2146 
2147   PetscFunctionBegin;
2148   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2149   PetscValidType(mat);
2150   MatPreallocated(mat);
2151   PetscValidHeaderSpecific(b,VEC_COOKIE);
2152   PetscValidHeaderSpecific(x,VEC_COOKIE);
2153   PetscCheckSameComm(mat,b);
2154   PetscCheckSameComm(mat,x);
2155   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2156   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2157   if (!mat->ops->solvetranspose) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s",mat->type_name);
2158   if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N);
2159   if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N);
2160 
2161   ierr = PetscLogEventBegin(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr);
2162   ierr = (*mat->ops->solvetranspose)(mat,b,x);CHKERRQ(ierr);
2163   ierr = PetscLogEventEnd(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr);
2164   PetscFunctionReturn(0);
2165 }
2166 
2167 #undef __FUNCT__
2168 #define __FUNCT__ "MatSolveTransposeAdd"
2169 /*@
2170    MatSolveTransposeAdd - Computes x = y + inv(Transpose(A)) b, given a
2171                       factored matrix.
2172 
2173    Collective on Mat and Vec
2174 
2175    Input Parameters:
2176 +  mat - the factored matrix
2177 .  b - the right-hand-side vector
2178 -  y - the vector to be added to
2179 
2180    Output Parameter:
2181 .  x - the result vector
2182 
2183    Notes:
2184    The vectors b and x cannot be the same.  I.e., one cannot
2185    call MatSolveTransposeAdd(A,x,y,x).
2186 
2187    Most users should employ the simplified SLES interface for linear solvers
2188    instead of working directly with matrix algebra routines such as this.
2189    See, e.g., SLESCreate().
2190 
2191    Level: developer
2192 
2193    Concepts: matrices^triangular solves
2194 
2195 .seealso: MatSolve(), MatSolveAdd(), MatSolveTranspose()
2196 @*/
2197 int MatSolveTransposeAdd(Mat mat,Vec b,Vec y,Vec x)
2198 {
2199   PetscScalar one = 1.0;
2200   int         ierr;
2201   Vec         tmp;
2202 
2203   PetscFunctionBegin;
2204   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2205   PetscValidType(mat);
2206   MatPreallocated(mat);
2207   PetscValidHeaderSpecific(y,VEC_COOKIE);
2208   PetscValidHeaderSpecific(b,VEC_COOKIE);
2209   PetscValidHeaderSpecific(x,VEC_COOKIE);
2210   PetscCheckSameComm(mat,b);
2211   PetscCheckSameComm(mat,y);
2212   PetscCheckSameComm(mat,x);
2213   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2214   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2215   if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N);
2216   if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N);
2217   if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->N,y->N);
2218   if (x->n != y->n)   SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n);
2219 
2220   ierr = PetscLogEventBegin(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr);
2221   if (mat->ops->solvetransposeadd) {
2222     ierr = (*mat->ops->solvetransposeadd)(mat,b,y,x);CHKERRQ(ierr);
2223   } else {
2224     /* do the solve then the add manually */
2225     if (x != y) {
2226       ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr);
2227       ierr = VecAXPY(&one,y,x);CHKERRQ(ierr);
2228     } else {
2229       ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr);
2230       PetscLogObjectParent(mat,tmp);
2231       ierr = VecCopy(x,tmp);CHKERRQ(ierr);
2232       ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr);
2233       ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr);
2234       ierr = VecDestroy(tmp);CHKERRQ(ierr);
2235     }
2236   }
2237   ierr = PetscLogEventEnd(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr);
2238   PetscFunctionReturn(0);
2239 }
2240 /* ----------------------------------------------------------------*/
2241 
2242 #undef __FUNCT__
2243 #define __FUNCT__ "MatRelax"
2244 /*@
2245    MatRelax - Computes one relaxation sweep.
2246 
2247    Collective on Mat and Vec
2248 
2249    Input Parameters:
2250 +  mat - the matrix
2251 .  b - the right hand side
2252 .  omega - the relaxation factor
2253 .  flag - flag indicating the type of SOR (see below)
2254 .  shift -  diagonal shift
2255 -  its - the number of iterations
2256 -  lits - the number of local iterations
2257 
2258    Output Parameters:
2259 .  x - the solution (can contain an initial guess)
2260 
2261    SOR Flags:
2262 .     SOR_FORWARD_SWEEP - forward SOR
2263 .     SOR_BACKWARD_SWEEP - backward SOR
2264 .     SOR_SYMMETRIC_SWEEP - SSOR (symmetric SOR)
2265 .     SOR_LOCAL_FORWARD_SWEEP - local forward SOR
2266 .     SOR_LOCAL_BACKWARD_SWEEP - local forward SOR
2267 .     SOR_LOCAL_SYMMETRIC_SWEEP - local SSOR
2268 .     SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies
2269          upper/lower triangular part of matrix to
2270          vector (with omega)
2271 .     SOR_ZERO_INITIAL_GUESS - zero initial guess
2272 
2273    Notes:
2274    SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and
2275    SOR_LOCAL_SYMMETRIC_SWEEP perform seperate independent smoothings
2276    on each processor.
2277 
2278    Application programmers will not generally use MatRelax() directly,
2279    but instead will employ the SLES/PC interface.
2280 
2281    Notes for Advanced Users:
2282    The flags are implemented as bitwise inclusive or operations.
2283    For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP)
2284    to specify a zero initial guess for SSOR.
2285 
2286    Most users should employ the simplified SLES interface for linear solvers
2287    instead of working directly with matrix algebra routines such as this.
2288    See, e.g., SLESCreate().
2289 
2290    Level: developer
2291 
2292    Concepts: matrices^relaxation
2293    Concepts: matrices^SOR
2294    Concepts: matrices^Gauss-Seidel
2295 
2296 @*/
2297 int MatRelax(Mat mat,Vec b,PetscReal omega,MatSORType flag,PetscReal shift,int its,int lits,Vec x)
2298 {
2299   int ierr;
2300 
2301   PetscFunctionBegin;
2302   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2303   PetscValidType(mat);
2304   MatPreallocated(mat);
2305   PetscValidHeaderSpecific(b,VEC_COOKIE);
2306   PetscValidHeaderSpecific(x,VEC_COOKIE);
2307   PetscCheckSameComm(mat,b);
2308   PetscCheckSameComm(mat,x);
2309   if (!mat->ops->relax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2310   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2311   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2312   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
2313   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
2314   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
2315 
2316   ierr = PetscLogEventBegin(MAT_Relax,mat,b,x,0);CHKERRQ(ierr);
2317   ierr =(*mat->ops->relax)(mat,b,omega,flag,shift,its,lits,x);CHKERRQ(ierr);
2318   ierr = PetscLogEventEnd(MAT_Relax,mat,b,x,0);CHKERRQ(ierr);
2319   PetscFunctionReturn(0);
2320 }
2321 
2322 #undef __FUNCT__
2323 #define __FUNCT__ "MatCopy_Basic"
2324 /*
2325       Default matrix copy routine.
2326 */
2327 int MatCopy_Basic(Mat A,Mat B,MatStructure str)
2328 {
2329   int         ierr,i,rstart,rend,nz,*cwork;
2330   PetscScalar *vwork;
2331 
2332   PetscFunctionBegin;
2333   ierr = MatZeroEntries(B);CHKERRQ(ierr);
2334   ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr);
2335   for (i=rstart; i<rend; i++) {
2336     ierr = MatGetRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
2337     ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr);
2338     ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
2339   }
2340   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2341   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2342   PetscFunctionReturn(0);
2343 }
2344 
2345 #undef __FUNCT__
2346 #define __FUNCT__ "MatCopy"
2347 /*@C
2348    MatCopy - Copys a matrix to another matrix.
2349 
2350    Collective on Mat
2351 
2352    Input Parameters:
2353 +  A - the matrix
2354 -  str - SAME_NONZERO_PATTERN or DIFFERENT_NONZERO_PATTERN
2355 
2356    Output Parameter:
2357 .  B - where the copy is put
2358 
2359    Notes:
2360    If you use SAME_NONZERO_PATTERN then the two matrices had better have the
2361    same nonzero pattern or the routine will crash.
2362 
2363    MatCopy() copies the matrix entries of a matrix to another existing
2364    matrix (after first zeroing the second matrix).  A related routine is
2365    MatConvert(), which first creates a new matrix and then copies the data.
2366 
2367    Level: intermediate
2368 
2369    Concepts: matrices^copying
2370 
2371 .seealso: MatConvert(), MatDuplicate()
2372 
2373 @*/
2374 int MatCopy(Mat A,Mat B,MatStructure str)
2375 {
2376   int ierr;
2377 
2378   PetscFunctionBegin;
2379   PetscValidHeaderSpecific(A,MAT_COOKIE);
2380   PetscValidHeaderSpecific(B,MAT_COOKIE);
2381   PetscValidType(A);
2382   MatPreallocated(A);
2383   PetscValidType(B);
2384   MatPreallocated(B);
2385   PetscCheckSameComm(A,B);
2386   if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2387   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2388   if (A->M != B->M || A->N != B->N) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim (%d,%d) (%d,%d)",A->M,B->M,
2389                                              A->N,B->N);
2390 
2391   ierr = PetscLogEventBegin(MAT_Copy,A,B,0,0);CHKERRQ(ierr);
2392   if (A->ops->copy) {
2393     ierr = (*A->ops->copy)(A,B,str);CHKERRQ(ierr);
2394   } else { /* generic conversion */
2395     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
2396   }
2397   if (A->mapping) {
2398     if (B->mapping) {ierr = ISLocalToGlobalMappingDestroy(B->mapping);CHKERRQ(ierr);B->mapping = 0;}
2399     ierr = MatSetLocalToGlobalMapping(B,A->mapping);CHKERRQ(ierr);
2400   }
2401   if (A->bmapping) {
2402     if (B->bmapping) {ierr = ISLocalToGlobalMappingDestroy(B->bmapping);CHKERRQ(ierr);B->bmapping = 0;}
2403     ierr = MatSetLocalToGlobalMappingBlock(B,A->mapping);CHKERRQ(ierr);
2404   }
2405   ierr = PetscLogEventEnd(MAT_Copy,A,B,0,0);CHKERRQ(ierr);
2406   PetscFunctionReturn(0);
2407 }
2408 
2409 #include "petscsys.h"
2410 PetscTruth MatConvertRegisterAllCalled = PETSC_FALSE;
2411 PetscFList MatConvertList              = 0;
2412 
2413 #undef __FUNCT__
2414 #define __FUNCT__ "MatConvertRegister"
2415 /*@C
2416     MatConvertRegister - Allows one to register a routine that converts a sparse matrix
2417         from one format to another.
2418 
2419   Not Collective
2420 
2421   Input Parameters:
2422 +   type - the type of matrix (defined in include/petscmat.h), for example, MATSEQAIJ.
2423 -   Converter - the function that reads the matrix from the binary file.
2424 
2425   Level: developer
2426 
2427 .seealso: MatConvertRegisterAll(), MatConvert()
2428 
2429 @*/
2430 int MatConvertRegister(char *sname,char *path,char *name,int (*function)(Mat,MatType,Mat*))
2431 {
2432   int  ierr;
2433   char fullname[PETSC_MAX_PATH_LEN];
2434 
2435   PetscFunctionBegin;
2436   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
2437   ierr = PetscFListAdd(&MatConvertList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
2438   PetscFunctionReturn(0);
2439 }
2440 
2441 #undef __FUNCT__
2442 #define __FUNCT__ "MatConvert"
2443 /*@C
2444    MatConvert - Converts a matrix to another matrix, either of the same
2445    or different type.
2446 
2447    Collective on Mat
2448 
2449    Input Parameters:
2450 +  mat - the matrix
2451 -  newtype - new matrix type.  Use MATSAME to create a new matrix of the
2452    same type as the original matrix.
2453 
2454    Output Parameter:
2455 .  M - pointer to place new matrix
2456 
2457    Notes:
2458    MatConvert() first creates a new matrix and then copies the data from
2459    the first matrix.  A related routine is MatCopy(), which copies the matrix
2460    entries of one matrix to another already existing matrix context.
2461 
2462    Level: intermediate
2463 
2464    Concepts: matrices^converting between storage formats
2465 
2466 .seealso: MatCopy(), MatDuplicate()
2467 @*/
2468 int MatConvert(Mat mat,MatType newtype,Mat *M)
2469 {
2470   int        ierr;
2471   PetscTruth sametype,issame,flg;
2472   char       convname[256],mtype[256];
2473 
2474   PetscFunctionBegin;
2475   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2476   PetscValidType(mat);
2477   MatPreallocated(mat);
2478   PetscValidPointer(M);
2479   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2480   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2481 
2482   ierr = PetscOptionsGetString(PETSC_NULL,"-matconvert_type",mtype,256,&flg);CHKERRQ(ierr);
2483   if (flg) {
2484     newtype = mtype;
2485   }
2486   ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2487 
2488   ierr = PetscTypeCompare((PetscObject)mat,newtype,&sametype);CHKERRQ(ierr);
2489   ierr = PetscStrcmp(newtype,"same",&issame);CHKERRQ(ierr);
2490   if ((sametype || issame) && mat->ops->duplicate) {
2491     ierr = (*mat->ops->duplicate)(mat,MAT_COPY_VALUES,M);CHKERRQ(ierr);
2492   } else {
2493     int (*conv)(Mat,MatType,Mat*);
2494     if (!MatConvertRegisterAllCalled) {
2495       ierr = MatConvertRegisterAll(PETSC_NULL);CHKERRQ(ierr);
2496     }
2497     ierr = PetscFListFind(mat->comm,MatConvertList,newtype,(void(**)(void))&conv);CHKERRQ(ierr);
2498     if (conv) {
2499       ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr);
2500     } else {
2501       ierr = PetscStrcpy(convname,"MatConvert_");CHKERRQ(ierr);
2502       ierr = PetscStrcat(convname,mat->type_name);CHKERRQ(ierr);
2503       ierr = PetscStrcat(convname,"_");CHKERRQ(ierr);
2504       ierr = PetscStrcat(convname,newtype);CHKERRQ(ierr);
2505       ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr);
2506       ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr);
2507       if (conv) {
2508         ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr);
2509       } else {
2510         if (mat->ops->convert) {
2511           ierr = (*mat->ops->convert)(mat,newtype,M);CHKERRQ(ierr);
2512         } else {
2513           ierr = MatConvert_Basic(mat,newtype,M);CHKERRQ(ierr);
2514         }
2515       }
2516     }
2517   }
2518   ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2519   PetscFunctionReturn(0);
2520 }
2521 
2522 
2523 #undef __FUNCT__
2524 #define __FUNCT__ "MatDuplicate"
2525 /*@C
2526    MatDuplicate - Duplicates a matrix including the non-zero structure.
2527 
2528    Collective on Mat
2529 
2530    Input Parameters:
2531 +  mat - the matrix
2532 -  op - either MAT_DO_NOT_COPY_VALUES or MAT_COPY_VALUES, cause it to copy nonzero
2533         values as well or not
2534 
2535    Output Parameter:
2536 .  M - pointer to place new matrix
2537 
2538    Level: intermediate
2539 
2540    Concepts: matrices^duplicating
2541 
2542 .seealso: MatCopy(), MatConvert()
2543 @*/
2544 int MatDuplicate(Mat mat,MatDuplicateOption op,Mat *M)
2545 {
2546   int ierr;
2547 
2548   PetscFunctionBegin;
2549   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2550   PetscValidType(mat);
2551   MatPreallocated(mat);
2552   PetscValidPointer(M);
2553   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2554   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2555 
2556   *M  = 0;
2557   ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2558   if (!mat->ops->duplicate) {
2559     SETERRQ(PETSC_ERR_SUP,"Not written for this matrix type");
2560   }
2561   ierr = (*mat->ops->duplicate)(mat,op,M);CHKERRQ(ierr);
2562   if (mat->mapping) {
2563     ierr = MatSetLocalToGlobalMapping(*M,mat->mapping);CHKERRQ(ierr);
2564   }
2565   if (mat->bmapping) {
2566     ierr = MatSetLocalToGlobalMappingBlock(*M,mat->mapping);CHKERRQ(ierr);
2567   }
2568   ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2569   PetscFunctionReturn(0);
2570 }
2571 
2572 #undef __FUNCT__
2573 #define __FUNCT__ "MatGetDiagonal"
2574 /*@
2575    MatGetDiagonal - Gets the diagonal of a matrix.
2576 
2577    Collective on Mat and Vec
2578 
2579    Input Parameters:
2580 +  mat - the matrix
2581 -  v - the vector for storing the diagonal
2582 
2583    Output Parameter:
2584 .  v - the diagonal of the matrix
2585 
2586    Notes:
2587    For the SeqAIJ matrix format, this routine may also be called
2588    on a LU factored matrix; in that case it routines the reciprocal of
2589    the diagonal entries in U. It returns the entries permuted by the
2590    row and column permutation used during the symbolic factorization.
2591 
2592    Level: intermediate
2593 
2594    Concepts: matrices^accessing diagonals
2595 
2596 .seealso: MatGetRow(), MatGetSubmatrices(), MatGetSubmatrix(), MatGetRowMax()
2597 @*/
2598 int MatGetDiagonal(Mat mat,Vec v)
2599 {
2600   int ierr;
2601 
2602   PetscFunctionBegin;
2603   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2604   PetscValidType(mat);
2605   MatPreallocated(mat);
2606   PetscValidHeaderSpecific(v,VEC_COOKIE);
2607   /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */
2608   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2609   if (!mat->ops->getdiagonal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2610 
2611   ierr = (*mat->ops->getdiagonal)(mat,v);CHKERRQ(ierr);
2612   PetscFunctionReturn(0);
2613 }
2614 
2615 #undef __FUNCT__
2616 #define __FUNCT__ "MatGetRowMax"
2617 /*@
2618    MatGetRowMax - Gets the maximum value (in absolute value) of each
2619         row of the matrix
2620 
2621    Collective on Mat and Vec
2622 
2623    Input Parameters:
2624 .  mat - the matrix
2625 
2626    Output Parameter:
2627 .  v - the vector for storing the maximums
2628 
2629    Level: intermediate
2630 
2631    Concepts: matrices^getting row maximums
2632 
2633 .seealso: MatGetDiagonal(), MatGetSubmatrices(), MatGetSubmatrix()
2634 @*/
2635 int MatGetRowMax(Mat mat,Vec v)
2636 {
2637   int ierr;
2638 
2639   PetscFunctionBegin;
2640   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2641   PetscValidType(mat);
2642   MatPreallocated(mat);
2643   PetscValidHeaderSpecific(v,VEC_COOKIE);
2644   /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */
2645   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2646   if (!mat->ops->getrowmax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2647 
2648   ierr = (*mat->ops->getrowmax)(mat,v);CHKERRQ(ierr);
2649   PetscFunctionReturn(0);
2650 }
2651 
2652 #undef __FUNCT__
2653 #define __FUNCT__ "MatTranspose"
2654 /*@C
2655    MatTranspose - Computes an in-place or out-of-place transpose of a matrix.
2656 
2657    Collective on Mat
2658 
2659    Input Parameter:
2660 .  mat - the matrix to transpose
2661 
2662    Output Parameters:
2663 .  B - the transpose (or pass in PETSC_NULL for an in-place transpose)
2664 
2665    Level: intermediate
2666 
2667    Concepts: matrices^transposing
2668 
2669 .seealso: MatMultTranspose(), MatMultTransposeAdd()
2670 @*/
2671 int MatTranspose(Mat mat,Mat *B)
2672 {
2673   int ierr;
2674 
2675   PetscFunctionBegin;
2676   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2677   PetscValidType(mat);
2678   MatPreallocated(mat);
2679   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2680   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2681   if (!mat->ops->transpose) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2682 
2683   ierr = PetscLogEventBegin(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr);
2684   ierr = (*mat->ops->transpose)(mat,B);CHKERRQ(ierr);
2685   ierr = PetscLogEventEnd(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr);
2686   PetscFunctionReturn(0);
2687 }
2688 
2689 #undef __FUNCT__
2690 #define __FUNCT__ "MatPermute"
2691 /*@C
2692    MatPermute - Creates a new matrix with rows and columns permuted from the
2693    original.
2694 
2695    Collective on Mat
2696 
2697    Input Parameters:
2698 +  mat - the matrix to permute
2699 .  row - row permutation, each processor supplies only the permutation for its rows
2700 -  col - column permutation, each processor needs the entire column permutation, that is
2701          this is the same size as the total number of columns in the matrix
2702 
2703    Output Parameters:
2704 .  B - the permuted matrix
2705 
2706    Level: advanced
2707 
2708    Concepts: matrices^permuting
2709 
2710 .seealso: MatGetOrdering()
2711 @*/
2712 int MatPermute(Mat mat,IS row,IS col,Mat *B)
2713 {
2714   int ierr;
2715 
2716   PetscFunctionBegin;
2717   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2718   PetscValidType(mat);
2719   MatPreallocated(mat);
2720   PetscValidHeaderSpecific(row,IS_COOKIE);
2721   PetscValidHeaderSpecific(col,IS_COOKIE);
2722   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2723   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2724   if (!mat->ops->permute) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2725   ierr = (*mat->ops->permute)(mat,row,col,B);CHKERRQ(ierr);
2726   PetscFunctionReturn(0);
2727 }
2728 
2729 #undef __FUNCT__
2730 #define __FUNCT__ "MatPermuteSparsify"
2731 /*@C
2732   MatPermuteSparsify - Creates a new matrix with rows and columns permuted from the
2733   original and sparsified to the prescribed tolerance.
2734 
2735   Collective on Mat
2736 
2737   Input Parameters:
2738 + A    - The matrix to permute
2739 . band - The half-bandwidth of the sparsified matrix, or PETSC_DECIDE
2740 . frac - The half-bandwidth as a fraction of the total size, or 0.0
2741 . tol  - The drop tolerance
2742 . rowp - The row permutation
2743 - colp - The column permutation
2744 
2745   Output Parameter:
2746 . B    - The permuted, sparsified matrix
2747 
2748   Level: advanced
2749 
2750   Note:
2751   The default behavior (band = PETSC_DECIDE and frac = 0.0) is to
2752   restrict the half-bandwidth of the resulting matrix to 5% of the
2753   total matrix size.
2754 
2755 .keywords: matrix, permute, sparsify
2756 
2757 .seealso: MatGetOrdering(), MatPermute()
2758 @*/
2759 int MatPermuteSparsify(Mat A, int band, PetscReal frac, PetscReal tol, IS rowp, IS colp, Mat *B)
2760 {
2761   IS           irowp, icolp;
2762   int         *rows, *cols;
2763   int          M, N, locRowStart, locRowEnd;
2764   int          nz, newNz;
2765   int         *cwork, *cnew;
2766   PetscScalar *vwork, *vnew;
2767   int          bw, size;
2768   int          row, locRow, newRow, col, newCol;
2769   int          ierr;
2770 
2771   PetscFunctionBegin;
2772   PetscValidHeaderSpecific(A,    MAT_COOKIE);
2773   PetscValidHeaderSpecific(rowp, IS_COOKIE);
2774   PetscValidHeaderSpecific(colp, IS_COOKIE);
2775   if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for unassembled matrix");
2776   if (A->factor)     SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for factored matrix");
2777   if (!A->ops->permutesparsify) {
2778     ierr = MatGetSize(A, &M, &N);                                                                         CHKERRQ(ierr);
2779     ierr = MatGetOwnershipRange(A, &locRowStart, &locRowEnd);                                             CHKERRQ(ierr);
2780     ierr = ISGetSize(rowp, &size);                                                                        CHKERRQ(ierr);
2781     if (size != M) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for row permutation, should be %d", size, M);
2782     ierr = ISGetSize(colp, &size);                                                                        CHKERRQ(ierr);
2783     if (size != N) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for column permutation, should be %d", size, N);
2784     ierr = ISInvertPermutation(rowp, 0, &irowp);                                                          CHKERRQ(ierr);
2785     ierr = ISGetIndices(irowp, &rows);                                                                    CHKERRQ(ierr);
2786     ierr = ISInvertPermutation(colp, 0, &icolp);                                                          CHKERRQ(ierr);
2787     ierr = ISGetIndices(icolp, &cols);                                                                    CHKERRQ(ierr);
2788     ierr = PetscMalloc(N * sizeof(int),         &cnew);                                                   CHKERRQ(ierr);
2789     ierr = PetscMalloc(N * sizeof(PetscScalar), &vnew);                                                   CHKERRQ(ierr);
2790 
2791     /* Setup bandwidth to include */
2792     if (band == PETSC_DECIDE) {
2793       if (frac <= 0.0)
2794         bw = (int) (M * 0.05);
2795       else
2796         bw = (int) (M * frac);
2797     } else {
2798       if (band <= 0) SETERRQ(PETSC_ERR_ARG_WRONG, "Bandwidth must be a positive integer");
2799       bw = band;
2800     }
2801 
2802     /* Put values into new matrix */
2803     ierr = MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B);                                                    CHKERRQ(ierr);
2804     for(row = locRowStart, locRow = 0; row < locRowEnd; row++, locRow++) {
2805       ierr = MatGetRow(A, row, &nz, &cwork, &vwork);                                                      CHKERRQ(ierr);
2806       newRow   = rows[locRow]+locRowStart;
2807       for(col = 0, newNz = 0; col < nz; col++) {
2808         newCol = cols[cwork[col]];
2809         if ((newCol >= newRow - bw) && (newCol < newRow + bw) && (PetscAbsScalar(vwork[col]) >= tol)) {
2810           cnew[newNz] = newCol;
2811           vnew[newNz] = vwork[col];
2812           newNz++;
2813         }
2814       }
2815       ierr = MatSetValues(*B, 1, &newRow, newNz, cnew, vnew, INSERT_VALUES);                              CHKERRQ(ierr);
2816       ierr = MatRestoreRow(A, row, &nz, &cwork, &vwork);                                                  CHKERRQ(ierr);
2817     }
2818     ierr = PetscFree(cnew);                                                                               CHKERRQ(ierr);
2819     ierr = PetscFree(vnew);                                                                               CHKERRQ(ierr);
2820     ierr = MatAssemblyBegin(*B, MAT_FINAL_ASSEMBLY);                                                      CHKERRQ(ierr);
2821     ierr = MatAssemblyEnd(*B, MAT_FINAL_ASSEMBLY);                                                        CHKERRQ(ierr);
2822     ierr = ISRestoreIndices(irowp, &rows);                                                                CHKERRQ(ierr);
2823     ierr = ISRestoreIndices(icolp, &cols);                                                                CHKERRQ(ierr);
2824     ierr = ISDestroy(irowp);                                                                              CHKERRQ(ierr);
2825     ierr = ISDestroy(icolp);                                                                              CHKERRQ(ierr);
2826   } else {
2827     ierr = (*A->ops->permutesparsify)(A, band, frac, tol, rowp, colp, B);                                 CHKERRQ(ierr);
2828   }
2829   PetscFunctionReturn(0);
2830 }
2831 
2832 #undef __FUNCT__
2833 #define __FUNCT__ "MatEqual"
2834 /*@
2835    MatEqual - Compares two matrices.
2836 
2837    Collective on Mat
2838 
2839    Input Parameters:
2840 +  A - the first matrix
2841 -  B - the second matrix
2842 
2843    Output Parameter:
2844 .  flg - PETSC_TRUE if the matrices are equal; PETSC_FALSE otherwise.
2845 
2846    Level: intermediate
2847 
2848    Concepts: matrices^equality between
2849 @*/
2850 int MatEqual(Mat A,Mat B,PetscTruth *flg)
2851 {
2852   int ierr;
2853 
2854   PetscFunctionBegin;
2855   PetscValidHeaderSpecific(A,MAT_COOKIE);
2856   PetscValidHeaderSpecific(B,MAT_COOKIE);
2857   PetscValidType(A);
2858   MatPreallocated(A);
2859   PetscValidType(B);
2860   MatPreallocated(B);
2861   PetscValidIntPointer(flg);
2862   PetscCheckSameComm(A,B);
2863   if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2864   if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2865   if (A->M != B->M || A->N != B->N) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim %d %d %d %d",A->M,B->M,A->N,B->N);
2866   if (!A->ops->equal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",A->type_name);
2867   ierr = (*A->ops->equal)(A,B,flg);CHKERRQ(ierr);
2868   PetscFunctionReturn(0);
2869 }
2870 
2871 #undef __FUNCT__
2872 #define __FUNCT__ "MatDiagonalScale"
2873 /*@
2874    MatDiagonalScale - Scales a matrix on the left and right by diagonal
2875    matrices that are stored as vectors.  Either of the two scaling
2876    matrices can be PETSC_NULL.
2877 
2878    Collective on Mat
2879 
2880    Input Parameters:
2881 +  mat - the matrix to be scaled
2882 .  l - the left scaling vector (or PETSC_NULL)
2883 -  r - the right scaling vector (or PETSC_NULL)
2884 
2885    Notes:
2886    MatDiagonalScale() computes A = LAR, where
2887    L = a diagonal matrix, R = a diagonal matrix
2888 
2889    Level: intermediate
2890 
2891    Concepts: matrices^diagonal scaling
2892    Concepts: diagonal scaling of matrices
2893 
2894 .seealso: MatScale()
2895 @*/
2896 int MatDiagonalScale(Mat mat,Vec l,Vec r)
2897 {
2898   int ierr;
2899 
2900   PetscFunctionBegin;
2901   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2902   PetscValidType(mat);
2903   MatPreallocated(mat);
2904   if (!mat->ops->diagonalscale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2905   if (l) {PetscValidHeaderSpecific(l,VEC_COOKIE);PetscCheckSameComm(mat,l);}
2906   if (r) {PetscValidHeaderSpecific(r,VEC_COOKIE);PetscCheckSameComm(mat,r);}
2907   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2908   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2909 
2910   ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2911   ierr = (*mat->ops->diagonalscale)(mat,l,r);CHKERRQ(ierr);
2912   ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2913   PetscFunctionReturn(0);
2914 }
2915 
2916 #undef __FUNCT__
2917 #define __FUNCT__ "MatScale"
2918 /*@
2919     MatScale - Scales all elements of a matrix by a given number.
2920 
2921     Collective on Mat
2922 
2923     Input Parameters:
2924 +   mat - the matrix to be scaled
2925 -   a  - the scaling value
2926 
2927     Output Parameter:
2928 .   mat - the scaled matrix
2929 
2930     Level: intermediate
2931 
2932     Concepts: matrices^scaling all entries
2933 
2934 .seealso: MatDiagonalScale()
2935 @*/
2936 int MatScale(PetscScalar *a,Mat mat)
2937 {
2938   int ierr;
2939 
2940   PetscFunctionBegin;
2941   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2942   PetscValidType(mat);
2943   MatPreallocated(mat);
2944   PetscValidScalarPointer(a);
2945   if (!mat->ops->scale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2946   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2947   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2948 
2949   ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2950   ierr = (*mat->ops->scale)(a,mat);CHKERRQ(ierr);
2951   ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2952   PetscFunctionReturn(0);
2953 }
2954 
2955 #undef __FUNCT__
2956 #define __FUNCT__ "MatNorm"
2957 /*@
2958    MatNorm - Calculates various norms of a matrix.
2959 
2960    Collective on Mat
2961 
2962    Input Parameters:
2963 +  mat - the matrix
2964 -  type - the type of norm, NORM_1, NORM_FROBENIUS, NORM_INFINITY
2965 
2966    Output Parameters:
2967 .  nrm - the resulting norm
2968 
2969    Level: intermediate
2970 
2971    Concepts: matrices^norm
2972    Concepts: norm^of matrix
2973 @*/
2974 int MatNorm(Mat mat,NormType type,PetscReal *nrm)
2975 {
2976   int ierr;
2977 
2978   PetscFunctionBegin;
2979   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2980   PetscValidType(mat);
2981   MatPreallocated(mat);
2982   PetscValidScalarPointer(nrm);
2983 
2984   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2985   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2986   if (!mat->ops->norm) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2987   ierr = (*mat->ops->norm)(mat,type,nrm);CHKERRQ(ierr);
2988   PetscFunctionReturn(0);
2989 }
2990 
2991 /*
2992      This variable is used to prevent counting of MatAssemblyBegin() that
2993    are called from within a MatAssemblyEnd().
2994 */
2995 static int MatAssemblyEnd_InUse = 0;
2996 #undef __FUNCT__
2997 #define __FUNCT__ "MatAssemblyBegin"
2998 /*@
2999    MatAssemblyBegin - Begins assembling the matrix.  This routine should
3000    be called after completing all calls to MatSetValues().
3001 
3002    Collective on Mat
3003 
3004    Input Parameters:
3005 +  mat - the matrix
3006 -  type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY
3007 
3008    Notes:
3009    MatSetValues() generally caches the values.  The matrix is ready to
3010    use only after MatAssemblyBegin() and MatAssemblyEnd() have been called.
3011    Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES
3012    in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before
3013    using the matrix.
3014 
3015    Level: beginner
3016 
3017    Concepts: matrices^assembling
3018 
3019 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssembled()
3020 @*/
3021 int MatAssemblyBegin(Mat mat,MatAssemblyType type)
3022 {
3023   int ierr;
3024 
3025   PetscFunctionBegin;
3026   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3027   PetscValidType(mat);
3028   MatPreallocated(mat);
3029   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix.\nDid you forget to call MatSetUnfactored()?");
3030   if (mat->assembled) {
3031     mat->was_assembled = PETSC_TRUE;
3032     mat->assembled     = PETSC_FALSE;
3033   }
3034   if (!MatAssemblyEnd_InUse) {
3035     ierr = PetscLogEventBegin(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr);
3036     if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);}
3037     ierr = PetscLogEventEnd(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr);
3038   } else {
3039     if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);}
3040   }
3041   PetscFunctionReturn(0);
3042 }
3043 
3044 #undef __FUNCT__
3045 #define __FUNCT__ "MatAssembed"
3046 /*@
3047    MatAssembled - Indicates if a matrix has been assembled and is ready for
3048      use; for example, in matrix-vector product.
3049 
3050    Collective on Mat
3051 
3052    Input Parameter:
3053 .  mat - the matrix
3054 
3055    Output Parameter:
3056 .  assembled - PETSC_TRUE or PETSC_FALSE
3057 
3058    Level: advanced
3059 
3060    Concepts: matrices^assembled?
3061 
3062 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssemblyBegin()
3063 @*/
3064 int MatAssembled(Mat mat,PetscTruth *assembled)
3065 {
3066   PetscFunctionBegin;
3067   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3068   PetscValidType(mat);
3069   MatPreallocated(mat);
3070   *assembled = mat->assembled;
3071   PetscFunctionReturn(0);
3072 }
3073 
3074 #undef __FUNCT__
3075 #define __FUNCT__ "MatView_Private"
3076 /*
3077     Processes command line options to determine if/how a matrix
3078   is to be viewed. Called by MatAssemblyEnd() and MatLoad().
3079 */
3080 int MatView_Private(Mat mat)
3081 {
3082   int               ierr;
3083   PetscTruth        flg;
3084   static PetscTruth incall = PETSC_FALSE;
3085 
3086   PetscFunctionBegin;
3087   if (incall) PetscFunctionReturn(0);
3088   incall = PETSC_TRUE;
3089   ierr = PetscOptionsBegin(mat->comm,mat->prefix,"Matrix Options","Mat");CHKERRQ(ierr);
3090     ierr = PetscOptionsName("-mat_view_info","Information on matrix size","MatView",&flg);CHKERRQ(ierr);
3091     if (flg) {
3092       ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO);CHKERRQ(ierr);
3093       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3094       ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3095     }
3096     ierr = PetscOptionsName("-mat_view_info_detailed","Nonzeros in the matrix","MatView",&flg);CHKERRQ(ierr);
3097     if (flg) {
3098       ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO_DETAIL);CHKERRQ(ierr);
3099       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3100       ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3101     }
3102     ierr = PetscOptionsName("-mat_view","Print matrix to stdout","MatView",&flg);CHKERRQ(ierr);
3103     if (flg) {
3104       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3105     }
3106     ierr = PetscOptionsName("-mat_view_matlab","Print matrix to stdout in a format Matlab can read","MatView",&flg);CHKERRQ(ierr);
3107     if (flg) {
3108       ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr);
3109       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3110       ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3111     }
3112     ierr = PetscOptionsName("-mat_view_socket","Send matrix to socket (can be read from matlab)","MatView",&flg);CHKERRQ(ierr);
3113     if (flg) {
3114       ierr = MatView(mat,PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr);
3115       ierr = PetscViewerFlush(PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr);
3116     }
3117     ierr = PetscOptionsName("-mat_view_binary","Save matrix to file in binary format","MatView",&flg);CHKERRQ(ierr);
3118     if (flg) {
3119       ierr = MatView(mat,PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr);
3120       ierr = PetscViewerFlush(PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr);
3121     }
3122   ierr = PetscOptionsEnd();CHKERRQ(ierr);
3123   /* cannot have inside PetscOptionsBegin() because uses PetscOptionsBegin() */
3124   ierr = PetscOptionsHasName(mat->prefix,"-mat_view_draw",&flg);CHKERRQ(ierr);
3125   if (flg) {
3126     ierr = PetscOptionsHasName(mat->prefix,"-mat_view_contour",&flg);CHKERRQ(ierr);
3127     if (flg) {
3128       PetscViewerPushFormat(PETSC_VIEWER_DRAW_(mat->comm),PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);
3129     }
3130     ierr = MatView(mat,PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr);
3131     ierr = PetscViewerFlush(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr);
3132     if (flg) {
3133       PetscViewerPopFormat(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr);
3134     }
3135   }
3136   incall = PETSC_FALSE;
3137   PetscFunctionReturn(0);
3138 }
3139 
3140 #undef __FUNCT__
3141 #define __FUNCT__ "MatAssemblyEnd"
3142 /*@
3143    MatAssemblyEnd - Completes assembling the matrix.  This routine should
3144    be called after MatAssemblyBegin().
3145 
3146    Collective on Mat
3147 
3148    Input Parameters:
3149 +  mat - the matrix
3150 -  type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY
3151 
3152    Options Database Keys:
3153 +  -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly()
3154 .  -mat_view_info_detailed - Prints more detailed info
3155 .  -mat_view - Prints matrix in ASCII format
3156 .  -mat_view_matlab - Prints matrix in Matlab format
3157 .  -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX().
3158 .  -display <name> - Sets display name (default is host)
3159 .  -draw_pause <sec> - Sets number of seconds to pause after display
3160 .  -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual)
3161 .  -viewer_socket_machine <machine>
3162 .  -viewer_socket_port <port>
3163 .  -mat_view_binary - save matrix to file in binary format
3164 -  -viewer_binary_filename <name>
3165 
3166    Notes:
3167    MatSetValues() generally caches the values.  The matrix is ready to
3168    use only after MatAssemblyBegin() and MatAssemblyEnd() have been called.
3169    Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES
3170    in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before
3171    using the matrix.
3172 
3173    Level: beginner
3174 
3175 .seealso: MatAssemblyBegin(), MatSetValues(), PetscDrawOpenX(), MatView(), MatAssembled(), PetscViewerSocketOpen()
3176 @*/
3177 int MatAssemblyEnd(Mat mat,MatAssemblyType type)
3178 {
3179   int        ierr;
3180   static int inassm = 0;
3181   PetscTruth flg;
3182 
3183   PetscFunctionBegin;
3184   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3185   PetscValidType(mat);
3186   MatPreallocated(mat);
3187 
3188   inassm++;
3189   MatAssemblyEnd_InUse++;
3190   if (MatAssemblyEnd_InUse == 1) { /* Do the logging only the first time through */
3191     ierr = PetscLogEventBegin(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr);
3192     if (mat->ops->assemblyend) {
3193       ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr);
3194     }
3195     ierr = PetscLogEventEnd(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr);
3196   } else {
3197     if (mat->ops->assemblyend) {
3198       ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr);
3199     }
3200   }
3201 
3202   /* Flush assembly is not a true assembly */
3203   if (type != MAT_FLUSH_ASSEMBLY) {
3204     mat->assembled  = PETSC_TRUE; mat->num_ass++;
3205   }
3206   mat->insertmode = NOT_SET_VALUES;
3207   MatAssemblyEnd_InUse--;
3208 
3209   if (inassm == 1 && type != MAT_FLUSH_ASSEMBLY) {
3210     ierr = MatView_Private(mat);CHKERRQ(ierr);
3211   }
3212   inassm--;
3213   ierr = PetscOptionsHasName(mat->prefix,"-help",&flg);CHKERRQ(ierr);
3214   if (flg) {
3215     ierr = MatPrintHelp(mat);CHKERRQ(ierr);
3216   }
3217   PetscFunctionReturn(0);
3218 }
3219 
3220 
3221 #undef __FUNCT__
3222 #define __FUNCT__ "MatCompress"
3223 /*@
3224    MatCompress - Tries to store the matrix in as little space as
3225    possible.  May fail if memory is already fully used, since it
3226    tries to allocate new space.
3227 
3228    Collective on Mat
3229 
3230    Input Parameters:
3231 .  mat - the matrix
3232 
3233    Level: advanced
3234 
3235 @*/
3236 int MatCompress(Mat mat)
3237 {
3238   int ierr;
3239 
3240   PetscFunctionBegin;
3241   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3242   PetscValidType(mat);
3243   MatPreallocated(mat);
3244   if (mat->ops->compress) {ierr = (*mat->ops->compress)(mat);CHKERRQ(ierr);}
3245   PetscFunctionReturn(0);
3246 }
3247 
3248 #undef __FUNCT__
3249 #define __FUNCT__ "MatSetOption"
3250 /*@
3251    MatSetOption - Sets a parameter option for a matrix. Some options
3252    may be specific to certain storage formats.  Some options
3253    determine how values will be inserted (or added). Sorted,
3254    row-oriented input will generally assemble the fastest. The default
3255    is row-oriented, nonsorted input.
3256 
3257    Collective on Mat
3258 
3259    Input Parameters:
3260 +  mat - the matrix
3261 -  option - the option, one of those listed below (and possibly others),
3262              e.g., MAT_ROWS_SORTED, MAT_NEW_NONZERO_LOCATION_ERR
3263 
3264    Options Describing Matrix Structure:
3265 +    MAT_SYMMETRIC - symmetric in terms of both structure and value
3266 -    MAT_STRUCTURALLY_SYMMETRIC - symmetric nonzero structure
3267 
3268    Options For Use with MatSetValues():
3269    Insert a logically dense subblock, which can be
3270 +    MAT_ROW_ORIENTED - row-oriented (default)
3271 .    MAT_COLUMN_ORIENTED - column-oriented
3272 .    MAT_ROWS_SORTED - sorted by row
3273 .    MAT_ROWS_UNSORTED - not sorted by row (default)
3274 .    MAT_COLUMNS_SORTED - sorted by column
3275 -    MAT_COLUMNS_UNSORTED - not sorted by column (default)
3276 
3277    Not these options reflect the data you pass in with MatSetValues(); it has
3278    nothing to do with how the data is stored internally in the matrix
3279    data structure.
3280 
3281    When (re)assembling a matrix, we can restrict the input for
3282    efficiency/debugging purposes.  These options include
3283 +    MAT_NO_NEW_NONZERO_LOCATIONS - additional insertions will not be
3284         allowed if they generate a new nonzero
3285 .    MAT_YES_NEW_NONZERO_LOCATIONS - additional insertions will be allowed
3286 .    MAT_NO_NEW_DIAGONALS - additional insertions will not be allowed if
3287          they generate a nonzero in a new diagonal (for block diagonal format only)
3288 .    MAT_YES_NEW_DIAGONALS - new diagonals will be allowed (for block diagonal format only)
3289 .    MAT_IGNORE_OFF_PROC_ENTRIES - drops off-processor entries
3290 .    MAT_NEW_NONZERO_LOCATION_ERR - generates an error for new matrix entry
3291 -    MAT_USE_HASH_TABLE - uses a hash table to speed up matrix assembly
3292 
3293    Notes:
3294    Some options are relevant only for particular matrix types and
3295    are thus ignored by others.  Other options are not supported by
3296    certain matrix types and will generate an error message if set.
3297 
3298    If using a Fortran 77 module to compute a matrix, one may need to
3299    use the column-oriented option (or convert to the row-oriented
3300    format).
3301 
3302    MAT_NO_NEW_NONZERO_LOCATIONS indicates that any add or insertion
3303    that would generate a new entry in the nonzero structure is instead
3304    ignored.  Thus, if memory has not alredy been allocated for this particular
3305    data, then the insertion is ignored. For dense matrices, in which
3306    the entire array is allocated, no entries are ever ignored.
3307    Set after the first MatAssemblyEnd()
3308 
3309    MAT_NEW_NONZERO_LOCATION_ERR indicates that any add or insertion
3310    that would generate a new entry in the nonzero structure instead produces
3311    an error. (Currently supported for AIJ and BAIJ formats only.)
3312    This is a useful flag when using SAME_NONZERO_PATTERN in calling
3313    SLESSetOperators() to ensure that the nonzero pattern truely does
3314    remain unchanged. Set after the first MatAssemblyEnd()
3315 
3316    MAT_NEW_NONZERO_ALLOCATION_ERR indicates that any add or insertion
3317    that would generate a new entry that has not been preallocated will
3318    instead produce an error. (Currently supported for AIJ and BAIJ formats
3319    only.) This is a useful flag when debugging matrix memory preallocation.
3320 
3321    MAT_IGNORE_OFF_PROC_ENTRIES indicates entries destined for
3322    other processors should be dropped, rather than stashed.
3323    This is useful if you know that the "owning" processor is also
3324    always generating the correct matrix entries, so that PETSc need
3325    not transfer duplicate entries generated on another processor.
3326 
3327    MAT_USE_HASH_TABLE indicates that a hash table be used to improve the
3328    searches during matrix assembly. When this flag is set, the hash table
3329    is created during the first Matrix Assembly. This hash table is
3330    used the next time through, during MatSetVaules()/MatSetVaulesBlocked()
3331    to improve the searching of indices. MAT_NO_NEW_NONZERO_LOCATIONS flag
3332    should be used with MAT_USE_HASH_TABLE flag. This option is currently
3333    supported by MATMPIBAIJ format only.
3334 
3335    MAT_KEEP_ZEROED_ROWS indicates when MatZeroRows() is called the zeroed entries
3336    are kept in the nonzero structure
3337 
3338    MAT_IGNORE_ZERO_ENTRIES - when using ADD_VALUES for AIJ matrices this will stop
3339    zero values from creating a zero location in the matrix
3340 
3341    MAT_USE_INODES - indicates using inode version of the code - works with AIJ and
3342    ROWBS matrix types
3343 
3344    MAT_DO_NOT_USE_INODES - indicates not using inode version of the code - works
3345    with AIJ and ROWBS matrix types
3346 
3347    Level: intermediate
3348 
3349    Concepts: matrices^setting options
3350 
3351 @*/
3352 int MatSetOption(Mat mat,MatOption op)
3353 {
3354   int ierr;
3355 
3356   PetscFunctionBegin;
3357   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3358   PetscValidType(mat);
3359   MatPreallocated(mat);
3360   switch (op) {
3361   case MAT_SYMMETRIC:
3362     mat->symmetric              = PETSC_TRUE;
3363     mat->structurally_symmetric = PETSC_TRUE;
3364     break;
3365   case MAT_STRUCTURALLY_SYMMETRIC:
3366     mat->structurally_symmetric = PETSC_TRUE;
3367     break;
3368   default:
3369     if (mat->ops->setoption) {ierr = (*mat->ops->setoption)(mat,op);CHKERRQ(ierr);}
3370     break;
3371   }
3372   PetscFunctionReturn(0);
3373 }
3374 
3375 #undef __FUNCT__
3376 #define __FUNCT__ "MatZeroEntries"
3377 /*@
3378    MatZeroEntries - Zeros all entries of a matrix.  For sparse matrices
3379    this routine retains the old nonzero structure.
3380 
3381    Collective on Mat
3382 
3383    Input Parameters:
3384 .  mat - the matrix
3385 
3386    Level: intermediate
3387 
3388    Concepts: matrices^zeroing
3389 
3390 .seealso: MatZeroRows()
3391 @*/
3392 int MatZeroEntries(Mat mat)
3393 {
3394   int ierr;
3395 
3396   PetscFunctionBegin;
3397   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3398   PetscValidType(mat);
3399   MatPreallocated(mat);
3400   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3401   if (!mat->ops->zeroentries) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3402 
3403   ierr = PetscLogEventBegin(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr);
3404   ierr = (*mat->ops->zeroentries)(mat);CHKERRQ(ierr);
3405   ierr = PetscLogEventEnd(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr);
3406   PetscFunctionReturn(0);
3407 }
3408 
3409 #undef __FUNCT__
3410 #define __FUNCT__ "MatZeroRows"
3411 /*@C
3412    MatZeroRows - Zeros all entries (except possibly the main diagonal)
3413    of a set of rows of a matrix.
3414 
3415    Collective on Mat
3416 
3417    Input Parameters:
3418 +  mat - the matrix
3419 .  is - index set of rows to remove
3420 -  diag - pointer to value put in all diagonals of eliminated rows.
3421           Note that diag is not a pointer to an array, but merely a
3422           pointer to a single value.
3423 
3424    Notes:
3425    For the AIJ and BAIJ matrix formats this removes the old nonzero structure,
3426    but does not release memory.  For the dense and block diagonal
3427    formats this does not alter the nonzero structure.
3428 
3429    If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure
3430    of the matrix is not changed (even for AIJ and BAIJ matrices) the values are
3431    merely zeroed.
3432 
3433    The user can set a value in the diagonal entry (or for the AIJ and
3434    row formats can optionally remove the main diagonal entry from the
3435    nonzero structure as well, by passing a null pointer (PETSC_NULL
3436    in C or PETSC_NULL_SCALAR in Fortran) as the final argument).
3437 
3438    For the parallel case, all processes that share the matrix (i.e.,
3439    those in the communicator used for matrix creation) MUST call this
3440    routine, regardless of whether any rows being zeroed are owned by
3441    them.
3442 
3443    For the SBAIJ matrix (since only the upper triangular half of the matrix
3444    is stored) the effect of this call is to also zero the corresponding
3445    column.
3446 
3447    Level: intermediate
3448 
3449    Concepts: matrices^zeroing rows
3450 
3451 .seealso: MatZeroEntries(), MatZeroRowsLocal(), MatSetOption()
3452 @*/
3453 int MatZeroRows(Mat mat,IS is,PetscScalar *diag)
3454 {
3455   int ierr;
3456 
3457   PetscFunctionBegin;
3458   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3459   PetscValidType(mat);
3460   MatPreallocated(mat);
3461   PetscValidHeaderSpecific(is,IS_COOKIE);
3462   if (diag) PetscValidScalarPointer(diag);
3463   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3464   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3465   if (!mat->ops->zerorows) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3466 
3467   ierr = (*mat->ops->zerorows)(mat,is,diag);CHKERRQ(ierr);
3468   ierr = MatView_Private(mat);CHKERRQ(ierr);
3469   PetscFunctionReturn(0);
3470 }
3471 
3472 #undef __FUNCT__
3473 #define __FUNCT__ "MatZeroRowsLocal"
3474 /*@C
3475    MatZeroRowsLocal - Zeros all entries (except possibly the main diagonal)
3476    of a set of rows of a matrix; using local numbering of rows.
3477 
3478    Collective on Mat
3479 
3480    Input Parameters:
3481 +  mat - the matrix
3482 .  is - index set of rows to remove
3483 -  diag - pointer to value put in all diagonals of eliminated rows.
3484           Note that diag is not a pointer to an array, but merely a
3485           pointer to a single value.
3486 
3487    Notes:
3488    Before calling MatZeroRowsLocal(), the user must first set the
3489    local-to-global mapping by calling MatSetLocalToGlobalMapping().
3490 
3491    For the AIJ matrix formats this removes the old nonzero structure,
3492    but does not release memory.  For the dense and block diagonal
3493    formats this does not alter the nonzero structure.
3494 
3495    If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure
3496    of the matrix is not changed (even for AIJ and BAIJ matrices) the values are
3497    merely zeroed.
3498 
3499    The user can set a value in the diagonal entry (or for the AIJ and
3500    row formats can optionally remove the main diagonal entry from the
3501    nonzero structure as well, by passing a null pointer (PETSC_NULL
3502    in C or PETSC_NULL_SCALAR in Fortran) as the final argument).
3503 
3504    Level: intermediate
3505 
3506    Concepts: matrices^zeroing
3507 
3508 .seealso: MatZeroEntries(), MatZeroRows(), MatSetLocalToGlobalMapping
3509 @*/
3510 int MatZeroRowsLocal(Mat mat,IS is,PetscScalar *diag)
3511 {
3512   int ierr;
3513   IS  newis;
3514 
3515   PetscFunctionBegin;
3516   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3517   PetscValidType(mat);
3518   MatPreallocated(mat);
3519   PetscValidHeaderSpecific(is,IS_COOKIE);
3520   if (diag) PetscValidScalarPointer(diag);
3521   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3522   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3523 
3524   if (mat->ops->zerorowslocal) {
3525     ierr = (*mat->ops->zerorowslocal)(mat,is,diag);CHKERRQ(ierr);
3526   } else {
3527     if (!mat->mapping) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Need to provide local to global mapping to matrix first");
3528     ierr = ISLocalToGlobalMappingApplyIS(mat->mapping,is,&newis);CHKERRQ(ierr);
3529     ierr = (*mat->ops->zerorows)(mat,newis,diag);CHKERRQ(ierr);
3530     ierr = ISDestroy(newis);CHKERRQ(ierr);
3531   }
3532   PetscFunctionReturn(0);
3533 }
3534 
3535 #undef __FUNCT__
3536 #define __FUNCT__ "MatGetSize"
3537 /*@
3538    MatGetSize - Returns the numbers of rows and columns in a matrix.
3539 
3540    Not Collective
3541 
3542    Input Parameter:
3543 .  mat - the matrix
3544 
3545    Output Parameters:
3546 +  m - the number of global rows
3547 -  n - the number of global columns
3548 
3549    Level: beginner
3550 
3551    Concepts: matrices^size
3552 
3553 .seealso: MatGetLocalSize()
3554 @*/
3555 int MatGetSize(Mat mat,int *m,int* n)
3556 {
3557   PetscFunctionBegin;
3558   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3559   if (m) *m = mat->M;
3560   if (n) *n = mat->N;
3561   PetscFunctionReturn(0);
3562 }
3563 
3564 #undef __FUNCT__
3565 #define __FUNCT__ "MatGetLocalSize"
3566 /*@
3567    MatGetLocalSize - Returns the number of rows and columns in a matrix
3568    stored locally.  This information may be implementation dependent, so
3569    use with care.
3570 
3571    Not Collective
3572 
3573    Input Parameters:
3574 .  mat - the matrix
3575 
3576    Output Parameters:
3577 +  m - the number of local rows
3578 -  n - the number of local columns
3579 
3580    Level: beginner
3581 
3582    Concepts: matrices^local size
3583 
3584 .seealso: MatGetSize()
3585 @*/
3586 int MatGetLocalSize(Mat mat,int *m,int* n)
3587 {
3588   PetscFunctionBegin;
3589   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3590   if (m) *m = mat->m;
3591   if (n) *n = mat->n;
3592   PetscFunctionReturn(0);
3593 }
3594 
3595 #undef __FUNCT__
3596 #define __FUNCT__ "MatGetOwnershipRange"
3597 /*@
3598    MatGetOwnershipRange - Returns the range of matrix rows owned by
3599    this processor, assuming that the matrix is laid out with the first
3600    n1 rows on the first processor, the next n2 rows on the second, etc.
3601    For certain parallel layouts this range may not be well defined.
3602 
3603    Not Collective
3604 
3605    Input Parameters:
3606 .  mat - the matrix
3607 
3608    Output Parameters:
3609 +  m - the global index of the first local row
3610 -  n - one more than the global index of the last local row
3611 
3612    Level: beginner
3613 
3614    Concepts: matrices^row ownership
3615 @*/
3616 int MatGetOwnershipRange(Mat mat,int *m,int* n)
3617 {
3618   int ierr;
3619 
3620   PetscFunctionBegin;
3621   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3622   PetscValidType(mat);
3623   MatPreallocated(mat);
3624   if (m) PetscValidIntPointer(m);
3625   if (n) PetscValidIntPointer(n);
3626   ierr = PetscMapGetLocalRange(mat->rmap,m,n);CHKERRQ(ierr);
3627   PetscFunctionReturn(0);
3628 }
3629 
3630 #undef __FUNCT__
3631 #define __FUNCT__ "MatILUFactorSymbolic"
3632 /*@
3633    MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix.
3634    Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric()
3635    to complete the factorization.
3636 
3637    Collective on Mat
3638 
3639    Input Parameters:
3640 +  mat - the matrix
3641 .  row - row permutation
3642 .  column - column permutation
3643 -  info - structure containing
3644 $      levels - number of levels of fill.
3645 $      expected fill - as ratio of original fill.
3646 $      1 or 0 - indicating force fill on diagonal (improves robustness for matrices
3647                 missing diagonal entries)
3648 
3649    Output Parameters:
3650 .  fact - new matrix that has been symbolically factored
3651 
3652    Notes:
3653    See the users manual for additional information about
3654    choosing the fill factor for better efficiency.
3655 
3656    Most users should employ the simplified SLES interface for linear solvers
3657    instead of working directly with matrix algebra routines such as this.
3658    See, e.g., SLESCreate().
3659 
3660    Level: developer
3661 
3662   Concepts: matrices^symbolic LU factorization
3663   Concepts: matrices^factorization
3664   Concepts: LU^symbolic factorization
3665 
3666 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor()
3667           MatGetOrdering(), MatILUInfo
3668 
3669 @*/
3670 int MatILUFactorSymbolic(Mat mat,IS row,IS col,MatILUInfo *info,Mat *fact)
3671 {
3672   int ierr;
3673 
3674   PetscFunctionBegin;
3675   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3676   PetscValidType(mat);
3677   MatPreallocated(mat);
3678   PetscValidPointer(fact);
3679   PetscValidHeaderSpecific(row,IS_COOKIE);
3680   PetscValidHeaderSpecific(col,IS_COOKIE);
3681   if (info->levels < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Levels of fill negative %d",(int)info->levels);
3682   if (info->fill < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",info->fill);
3683   if (!mat->ops->ilufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s  symbolic ILU",mat->type_name);
3684   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3685   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3686 
3687   ierr = PetscLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr);
3688   ierr = (*mat->ops->ilufactorsymbolic)(mat,row,col,info,fact);CHKERRQ(ierr);
3689   ierr = PetscLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr);
3690   PetscFunctionReturn(0);
3691 }
3692 
3693 #undef __FUNCT__
3694 #define __FUNCT__ "MatICCFactorSymbolic"
3695 /*@
3696    MatICCFactorSymbolic - Performs symbolic incomplete
3697    Cholesky factorization for a symmetric matrix.  Use
3698    MatCholeskyFactorNumeric() to complete the factorization.
3699 
3700    Collective on Mat
3701 
3702    Input Parameters:
3703 +  mat - the matrix
3704 .  perm - row and column permutation
3705 .  fill - levels of fill
3706 -  f - expected fill as ratio of original fill
3707 
3708    Output Parameter:
3709 .  fact - the factored matrix
3710 
3711    Notes:
3712    Currently only no-fill factorization is supported.
3713 
3714    Most users should employ the simplified SLES interface for linear solvers
3715    instead of working directly with matrix algebra routines such as this.
3716    See, e.g., SLESCreate().
3717 
3718    Level: developer
3719 
3720   Concepts: matrices^symbolic incomplete Cholesky factorization
3721   Concepts: matrices^factorization
3722   Concepts: Cholsky^symbolic factorization
3723 
3724 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor()
3725 @*/
3726 int MatICCFactorSymbolic(Mat mat,IS perm,PetscReal f,int fill,Mat *fact)
3727 {
3728   int ierr;
3729 
3730   PetscFunctionBegin;
3731   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3732   PetscValidType(mat);
3733   MatPreallocated(mat);
3734   PetscValidPointer(fact);
3735   PetscValidHeaderSpecific(perm,IS_COOKIE);
3736   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3737   if (fill < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Fill negative %d",fill);
3738   if (f < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",f);
3739   if (!mat->ops->iccfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s  symbolic ICC",mat->type_name);
3740   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3741 
3742   ierr = PetscLogEventBegin(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
3743   ierr = (*mat->ops->iccfactorsymbolic)(mat,perm,f,fill,fact);CHKERRQ(ierr);
3744   ierr = PetscLogEventEnd(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
3745   PetscFunctionReturn(0);
3746 }
3747 
3748 #undef __FUNCT__
3749 #define __FUNCT__ "MatGetArray"
3750 /*@C
3751    MatGetArray - Returns a pointer to the element values in the matrix.
3752    The result of this routine is dependent on the underlying matrix data
3753    structure, and may not even work for certain matrix types.  You MUST
3754    call MatRestoreArray() when you no longer need to access the array.
3755 
3756    Not Collective
3757 
3758    Input Parameter:
3759 .  mat - the matrix
3760 
3761    Output Parameter:
3762 .  v - the location of the values
3763 
3764 
3765    Fortran Note:
3766    This routine is used differently from Fortran, e.g.,
3767 .vb
3768         Mat         mat
3769         PetscScalar mat_array(1)
3770         PetscOffset i_mat
3771         int         ierr
3772         call MatGetArray(mat,mat_array,i_mat,ierr)
3773 
3774   C  Access first local entry in matrix; note that array is
3775   C  treated as one dimensional
3776         value = mat_array(i_mat + 1)
3777 
3778         [... other code ...]
3779         call MatRestoreArray(mat,mat_array,i_mat,ierr)
3780 .ve
3781 
3782    See the Fortran chapter of the users manual and
3783    petsc/src/mat/examples/tests for details.
3784 
3785    Level: advanced
3786 
3787    Concepts: matrices^access array
3788 
3789 .seealso: MatRestoreArray(), MatGetArrayF90()
3790 @*/
3791 int MatGetArray(Mat mat,PetscScalar **v)
3792 {
3793   int ierr;
3794 
3795   PetscFunctionBegin;
3796   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3797   PetscValidType(mat);
3798   MatPreallocated(mat);
3799   PetscValidPointer(v);
3800   if (!mat->ops->getarray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3801   ierr = (*mat->ops->getarray)(mat,v);CHKERRQ(ierr);
3802   PetscFunctionReturn(0);
3803 }
3804 
3805 #undef __FUNCT__
3806 #define __FUNCT__ "MatRestoreArray"
3807 /*@C
3808    MatRestoreArray - Restores the matrix after MatGetArray() has been called.
3809 
3810    Not Collective
3811 
3812    Input Parameter:
3813 +  mat - the matrix
3814 -  v - the location of the values
3815 
3816    Fortran Note:
3817    This routine is used differently from Fortran, e.g.,
3818 .vb
3819         Mat         mat
3820         PetscScalar mat_array(1)
3821         PetscOffset i_mat
3822         int         ierr
3823         call MatGetArray(mat,mat_array,i_mat,ierr)
3824 
3825   C  Access first local entry in matrix; note that array is
3826   C  treated as one dimensional
3827         value = mat_array(i_mat + 1)
3828 
3829         [... other code ...]
3830         call MatRestoreArray(mat,mat_array,i_mat,ierr)
3831 .ve
3832 
3833    See the Fortran chapter of the users manual and
3834    petsc/src/mat/examples/tests for details
3835 
3836    Level: advanced
3837 
3838 .seealso: MatGetArray(), MatRestoreArrayF90()
3839 @*/
3840 int MatRestoreArray(Mat mat,PetscScalar **v)
3841 {
3842   int ierr;
3843 
3844   PetscFunctionBegin;
3845   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3846   PetscValidType(mat);
3847   MatPreallocated(mat);
3848   PetscValidPointer(v);
3849   if (!mat->ops->restorearray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3850   ierr = (*mat->ops->restorearray)(mat,v);CHKERRQ(ierr);
3851   PetscFunctionReturn(0);
3852 }
3853 
3854 #undef __FUNCT__
3855 #define __FUNCT__ "MatGetSubMatrices"
3856 /*@C
3857    MatGetSubMatrices - Extracts several submatrices from a matrix. If submat
3858    points to an array of valid matrices, they may be reused to store the new
3859    submatrices.
3860 
3861    Collective on Mat
3862 
3863    Input Parameters:
3864 +  mat - the matrix
3865 .  n   - the number of submatrixes to be extracted (on this processor, may be zero)
3866 .  irow, icol - index sets of rows and columns to extract
3867 -  scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX
3868 
3869    Output Parameter:
3870 .  submat - the array of submatrices
3871 
3872    Notes:
3873    MatGetSubMatrices() can extract only sequential submatrices
3874    (from both sequential and parallel matrices). Use MatGetSubMatrix()
3875    to extract a parallel submatrix.
3876 
3877    When extracting submatrices from a parallel matrix, each processor can
3878    form a different submatrix by setting the rows and columns of its
3879    individual index sets according to the local submatrix desired.
3880 
3881    When finished using the submatrices, the user should destroy
3882    them with MatDestroyMatrices().
3883 
3884    MAT_REUSE_MATRIX can only be used when the nonzero structure of the
3885    original matrix has not changed from that last call to MatGetSubMatrices().
3886 
3887    This routine creates the matrices in submat; you should NOT create them before
3888    calling it. It also allocates the array of matrix pointers submat.
3889 
3890    Fortran Note:
3891    The Fortran interface is slightly different from that given below; it
3892    requires one to pass in  as submat a Mat (integer) array of size at least m.
3893 
3894    Level: advanced
3895 
3896    Concepts: matrices^accessing submatrices
3897    Concepts: submatrices
3898 
3899 .seealso: MatDestroyMatrices(), MatGetSubMatrix(), MatGetRow(), MatGetDiagonal()
3900 @*/
3901 int MatGetSubMatrices(Mat mat,int n,IS *irow,IS *icol,MatReuse scall,Mat **submat)
3902 {
3903   int        ierr;
3904 
3905   PetscFunctionBegin;
3906   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3907   PetscValidType(mat);
3908   MatPreallocated(mat);
3909   if (!mat->ops->getsubmatrices) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3910   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3911 
3912   ierr = PetscLogEventBegin(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr);
3913   ierr = (*mat->ops->getsubmatrices)(mat,n,irow,icol,scall,submat);CHKERRQ(ierr);
3914   ierr = PetscLogEventEnd(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr);
3915   PetscFunctionReturn(0);
3916 }
3917 
3918 #undef __FUNCT__
3919 #define __FUNCT__ "MatDestroyMatrices"
3920 /*@C
3921    MatDestroyMatrices - Destroys a set of matrices obtained with MatGetSubMatrices().
3922 
3923    Collective on Mat
3924 
3925    Input Parameters:
3926 +  n - the number of local matrices
3927 -  mat - the matrices
3928 
3929    Level: advanced
3930 
3931     Notes: Frees not only the matrices, but also the array that contains the matrices
3932 
3933 .seealso: MatGetSubMatrices()
3934 @*/
3935 int MatDestroyMatrices(int n,Mat **mat)
3936 {
3937   int ierr,i;
3938 
3939   PetscFunctionBegin;
3940   if (n < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Trying to destroy negative number of matrices %d",n);
3941   PetscValidPointer(mat);
3942   for (i=0; i<n; i++) {
3943     ierr = MatDestroy((*mat)[i]);CHKERRQ(ierr);
3944   }
3945   /* memory is allocated even if n = 0 */
3946   ierr = PetscFree(*mat);CHKERRQ(ierr);
3947   PetscFunctionReturn(0);
3948 }
3949 
3950 #undef __FUNCT__
3951 #define __FUNCT__ "MatIncreaseOverlap"
3952 /*@
3953    MatIncreaseOverlap - Given a set of submatrices indicated by index sets,
3954    replaces the index sets by larger ones that represent submatrices with
3955    additional overlap.
3956 
3957    Collective on Mat
3958 
3959    Input Parameters:
3960 +  mat - the matrix
3961 .  n   - the number of index sets
3962 .  is  - the array of pointers to index sets
3963 -  ov  - the additional overlap requested
3964 
3965    Level: developer
3966 
3967    Concepts: overlap
3968    Concepts: ASM^computing overlap
3969 
3970 .seealso: MatGetSubMatrices()
3971 @*/
3972 int MatIncreaseOverlap(Mat mat,int n,IS *is,int ov)
3973 {
3974   int ierr;
3975 
3976   PetscFunctionBegin;
3977   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3978   PetscValidType(mat);
3979   MatPreallocated(mat);
3980   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3981   if (mat->factor)     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3982 
3983   if (!ov) PetscFunctionReturn(0);
3984   if (!mat->ops->increaseoverlap) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3985   ierr = PetscLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr);
3986   ierr = (*mat->ops->increaseoverlap)(mat,n,is,ov);CHKERRQ(ierr);
3987   ierr = PetscLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr);
3988   PetscFunctionReturn(0);
3989 }
3990 
3991 #undef __FUNCT__
3992 #define __FUNCT__ "MatPrintHelp"
3993 /*@
3994    MatPrintHelp - Prints all the options for the matrix.
3995 
3996    Collective on Mat
3997 
3998    Input Parameter:
3999 .  mat - the matrix
4000 
4001    Options Database Keys:
4002 +  -help - Prints matrix options
4003 -  -h - Prints matrix options
4004 
4005    Level: developer
4006 
4007 .seealso: MatCreate(), MatCreateXXX()
4008 @*/
4009 int MatPrintHelp(Mat mat)
4010 {
4011   static PetscTruth called = PETSC_FALSE;
4012   int               ierr;
4013 
4014   PetscFunctionBegin;
4015   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4016   PetscValidType(mat);
4017   MatPreallocated(mat);
4018 
4019   if (!called) {
4020     if (mat->ops->printhelp) {
4021       ierr = (*mat->ops->printhelp)(mat);CHKERRQ(ierr);
4022     }
4023     called = PETSC_TRUE;
4024   }
4025   PetscFunctionReturn(0);
4026 }
4027 
4028 #undef __FUNCT__
4029 #define __FUNCT__ "MatGetBlockSize"
4030 /*@
4031    MatGetBlockSize - Returns the matrix block size; useful especially for the
4032    block row and block diagonal formats.
4033 
4034    Not Collective
4035 
4036    Input Parameter:
4037 .  mat - the matrix
4038 
4039    Output Parameter:
4040 .  bs - block size
4041 
4042    Notes:
4043    Block diagonal formats are MATSEQBDIAG, MATMPIBDIAG.
4044    Block row formats are MATSEQBAIJ, MATMPIBAIJ
4045 
4046    Level: intermediate
4047 
4048    Concepts: matrices^block size
4049 
4050 .seealso: MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), MatCreateSeqBDiag(), MatCreateMPIBDiag()
4051 @*/
4052 int MatGetBlockSize(Mat mat,int *bs)
4053 {
4054   int ierr;
4055 
4056   PetscFunctionBegin;
4057   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4058   PetscValidType(mat);
4059   MatPreallocated(mat);
4060   PetscValidIntPointer(bs);
4061   if (!mat->ops->getblocksize) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4062   ierr = (*mat->ops->getblocksize)(mat,bs);CHKERRQ(ierr);
4063   PetscFunctionReturn(0);
4064 }
4065 
4066 #undef __FUNCT__
4067 #define __FUNCT__ "MatGetRowIJ"
4068 /*@C
4069     MatGetRowIJ - Returns the compressed row storage i and j indices for sequential matrices.
4070 
4071    Collective on Mat
4072 
4073     Input Parameters:
4074 +   mat - the matrix
4075 .   shift -  0 or 1 indicating we want the indices starting at 0 or 1
4076 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4077                 symmetrized
4078 
4079     Output Parameters:
4080 +   n - number of rows in the (possibly compressed) matrix
4081 .   ia - the row pointers
4082 .   ja - the column indices
4083 -   done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned
4084 
4085     Level: developer
4086 
4087 .seealso: MatGetColumnIJ(), MatRestoreRowIJ()
4088 @*/
4089 int MatGetRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4090 {
4091   int ierr;
4092 
4093   PetscFunctionBegin;
4094   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4095   PetscValidType(mat);
4096   MatPreallocated(mat);
4097   if (ia) PetscValidIntPointer(ia);
4098   if (ja) PetscValidIntPointer(ja);
4099   PetscValidIntPointer(done);
4100   if (!mat->ops->getrowij) *done = PETSC_FALSE;
4101   else {
4102     *done = PETSC_TRUE;
4103     ierr  = (*mat->ops->getrowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4104   }
4105   PetscFunctionReturn(0);
4106 }
4107 
4108 #undef __FUNCT__
4109 #define __FUNCT__ "MatGetColumnIJ"
4110 /*@C
4111     MatGetColumnIJ - Returns the compressed column storage i and j indices for sequential matrices.
4112 
4113     Collective on Mat
4114 
4115     Input Parameters:
4116 +   mat - the matrix
4117 .   shift - 1 or zero indicating we want the indices starting at 0 or 1
4118 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4119                 symmetrized
4120 
4121     Output Parameters:
4122 +   n - number of columns in the (possibly compressed) matrix
4123 .   ia - the column pointers
4124 .   ja - the row indices
4125 -   done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned
4126 
4127     Level: developer
4128 
4129 .seealso: MatGetRowIJ(), MatRestoreColumnIJ()
4130 @*/
4131 int MatGetColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4132 {
4133   int ierr;
4134 
4135   PetscFunctionBegin;
4136   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4137   PetscValidType(mat);
4138   MatPreallocated(mat);
4139   if (ia) PetscValidIntPointer(ia);
4140   if (ja) PetscValidIntPointer(ja);
4141   PetscValidIntPointer(done);
4142 
4143   if (!mat->ops->getcolumnij) *done = PETSC_FALSE;
4144   else {
4145     *done = PETSC_TRUE;
4146     ierr  = (*mat->ops->getcolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4147   }
4148   PetscFunctionReturn(0);
4149 }
4150 
4151 #undef __FUNCT__
4152 #define __FUNCT__ "MatRestoreRowIJ"
4153 /*@C
4154     MatRestoreRowIJ - Call after you are completed with the ia,ja indices obtained with
4155     MatGetRowIJ().
4156 
4157     Collective on Mat
4158 
4159     Input Parameters:
4160 +   mat - the matrix
4161 .   shift - 1 or zero indicating we want the indices starting at 0 or 1
4162 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4163                 symmetrized
4164 
4165     Output Parameters:
4166 +   n - size of (possibly compressed) matrix
4167 .   ia - the row pointers
4168 .   ja - the column indices
4169 -   done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned
4170 
4171     Level: developer
4172 
4173 .seealso: MatGetRowIJ(), MatRestoreColumnIJ()
4174 @*/
4175 int MatRestoreRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4176 {
4177   int ierr;
4178 
4179   PetscFunctionBegin;
4180   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4181   PetscValidType(mat);
4182   MatPreallocated(mat);
4183   if (ia) PetscValidIntPointer(ia);
4184   if (ja) PetscValidIntPointer(ja);
4185   PetscValidIntPointer(done);
4186 
4187   if (!mat->ops->restorerowij) *done = PETSC_FALSE;
4188   else {
4189     *done = PETSC_TRUE;
4190     ierr  = (*mat->ops->restorerowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4191   }
4192   PetscFunctionReturn(0);
4193 }
4194 
4195 #undef __FUNCT__
4196 #define __FUNCT__ "MatRestoreColumnIJ"
4197 /*@C
4198     MatRestoreColumnIJ - Call after you are completed with the ia,ja indices obtained with
4199     MatGetColumnIJ().
4200 
4201     Collective on Mat
4202 
4203     Input Parameters:
4204 +   mat - the matrix
4205 .   shift - 1 or zero indicating we want the indices starting at 0 or 1
4206 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4207                 symmetrized
4208 
4209     Output Parameters:
4210 +   n - size of (possibly compressed) matrix
4211 .   ia - the column pointers
4212 .   ja - the row indices
4213 -   done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned
4214 
4215     Level: developer
4216 
4217 .seealso: MatGetColumnIJ(), MatRestoreRowIJ()
4218 @*/
4219 int MatRestoreColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4220 {
4221   int ierr;
4222 
4223   PetscFunctionBegin;
4224   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4225   PetscValidType(mat);
4226   MatPreallocated(mat);
4227   if (ia) PetscValidIntPointer(ia);
4228   if (ja) PetscValidIntPointer(ja);
4229   PetscValidIntPointer(done);
4230 
4231   if (!mat->ops->restorecolumnij) *done = PETSC_FALSE;
4232   else {
4233     *done = PETSC_TRUE;
4234     ierr  = (*mat->ops->restorecolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4235   }
4236   PetscFunctionReturn(0);
4237 }
4238 
4239 #undef __FUNCT__
4240 #define __FUNCT__ "MatColoringPatch"
4241 /*@C
4242     MatColoringPatch -Used inside matrix coloring routines that
4243     use MatGetRowIJ() and/or MatGetColumnIJ().
4244 
4245     Collective on Mat
4246 
4247     Input Parameters:
4248 +   mat - the matrix
4249 .   n   - number of colors
4250 -   colorarray - array indicating color for each column
4251 
4252     Output Parameters:
4253 .   iscoloring - coloring generated using colorarray information
4254 
4255     Level: developer
4256 
4257 .seealso: MatGetRowIJ(), MatGetColumnIJ()
4258 
4259 @*/
4260 int MatColoringPatch(Mat mat,int n,int ncolors,ISColoringValue *colorarray,ISColoring *iscoloring)
4261 {
4262   int ierr;
4263 
4264   PetscFunctionBegin;
4265   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4266   PetscValidType(mat);
4267   MatPreallocated(mat);
4268   PetscValidIntPointer(colorarray);
4269 
4270   if (!mat->ops->coloringpatch){
4271     ierr = ISColoringCreate(mat->comm,n,colorarray,iscoloring);CHKERRQ(ierr);
4272   } else {
4273     ierr = (*mat->ops->coloringpatch)(mat,n,ncolors,colorarray,iscoloring);CHKERRQ(ierr);
4274   }
4275   PetscFunctionReturn(0);
4276 }
4277 
4278 
4279 #undef __FUNCT__
4280 #define __FUNCT__ "MatSetUnfactored"
4281 /*@
4282    MatSetUnfactored - Resets a factored matrix to be treated as unfactored.
4283 
4284    Collective on Mat
4285 
4286    Input Parameter:
4287 .  mat - the factored matrix to be reset
4288 
4289    Notes:
4290    This routine should be used only with factored matrices formed by in-place
4291    factorization via ILU(0) (or by in-place LU factorization for the MATSEQDENSE
4292    format).  This option can save memory, for example, when solving nonlinear
4293    systems with a matrix-free Newton-Krylov method and a matrix-based, in-place
4294    ILU(0) preconditioner.
4295 
4296    Note that one can specify in-place ILU(0) factorization by calling
4297 .vb
4298      PCType(pc,PCILU);
4299      PCILUSeUseInPlace(pc);
4300 .ve
4301    or by using the options -pc_type ilu -pc_ilu_in_place
4302 
4303    In-place factorization ILU(0) can also be used as a local
4304    solver for the blocks within the block Jacobi or additive Schwarz
4305    methods (runtime option: -sub_pc_ilu_in_place).  See the discussion
4306    of these preconditioners in the users manual for details on setting
4307    local solver options.
4308 
4309    Most users should employ the simplified SLES interface for linear solvers
4310    instead of working directly with matrix algebra routines such as this.
4311    See, e.g., SLESCreate().
4312 
4313    Level: developer
4314 
4315 .seealso: PCILUSetUseInPlace(), PCLUSetUseInPlace()
4316 
4317    Concepts: matrices^unfactored
4318 
4319 @*/
4320 int MatSetUnfactored(Mat mat)
4321 {
4322   int ierr;
4323 
4324   PetscFunctionBegin;
4325   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4326   PetscValidType(mat);
4327   MatPreallocated(mat);
4328   mat->factor = 0;
4329   if (!mat->ops->setunfactored) PetscFunctionReturn(0);
4330   ierr = (*mat->ops->setunfactored)(mat);CHKERRQ(ierr);
4331   PetscFunctionReturn(0);
4332 }
4333 
4334 /*MC
4335     MatGetArrayF90 - Accesses a matrix array from Fortran90.
4336 
4337     Synopsis:
4338     MatGetArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr)
4339 
4340     Not collective
4341 
4342     Input Parameter:
4343 .   x - matrix
4344 
4345     Output Parameters:
4346 +   xx_v - the Fortran90 pointer to the array
4347 -   ierr - error code
4348 
4349     Example of Usage:
4350 .vb
4351       PetscScalar, pointer xx_v(:)
4352       ....
4353       call MatGetArrayF90(x,xx_v,ierr)
4354       a = xx_v(3)
4355       call MatRestoreArrayF90(x,xx_v,ierr)
4356 .ve
4357 
4358     Notes:
4359     Not yet supported for all F90 compilers
4360 
4361     Level: advanced
4362 
4363 .seealso:  MatRestoreArrayF90(), MatGetArray(), MatRestoreArray()
4364 
4365     Concepts: matrices^accessing array
4366 
4367 M*/
4368 
4369 /*MC
4370     MatRestoreArrayF90 - Restores a matrix array that has been
4371     accessed with MatGetArrayF90().
4372 
4373     Synopsis:
4374     MatRestoreArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr)
4375 
4376     Not collective
4377 
4378     Input Parameters:
4379 +   x - matrix
4380 -   xx_v - the Fortran90 pointer to the array
4381 
4382     Output Parameter:
4383 .   ierr - error code
4384 
4385     Example of Usage:
4386 .vb
4387        PetscScalar, pointer xx_v(:)
4388        ....
4389        call MatGetArrayF90(x,xx_v,ierr)
4390        a = xx_v(3)
4391        call MatRestoreArrayF90(x,xx_v,ierr)
4392 .ve
4393 
4394     Notes:
4395     Not yet supported for all F90 compilers
4396 
4397     Level: advanced
4398 
4399 .seealso:  MatGetArrayF90(), MatGetArray(), MatRestoreArray()
4400 
4401 M*/
4402 
4403 
4404 #undef __FUNCT__
4405 #define __FUNCT__ "MatGetSubMatrix"
4406 /*@
4407     MatGetSubMatrix - Gets a single submatrix on the same number of processors
4408                       as the original matrix.
4409 
4410     Collective on Mat
4411 
4412     Input Parameters:
4413 +   mat - the original matrix
4414 .   isrow - rows this processor should obtain
4415 .   iscol - columns for all processors you wish to keep
4416 .   csize - number of columns "local" to this processor (does nothing for sequential
4417             matrices). This should match the result from VecGetLocalSize(x,...) if you
4418             plan to use the matrix in a A*x; alternatively, you can use PETSC_DECIDE
4419 -   cll - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX
4420 
4421     Output Parameter:
4422 .   newmat - the new submatrix, of the same type as the old
4423 
4424     Level: advanced
4425 
4426     Notes: the iscol argument MUST be the same on each processor. You might be
4427     able to create the iscol argument with ISAllGather().
4428 
4429       The first time this is called you should use a cll of MAT_INITIAL_MATRIX,
4430    the MatGetSubMatrix() routine will create the newmat for you. Any additional calls
4431    to this routine with a mat of the same nonzero structure will reuse the matrix
4432    generated the first time.
4433 
4434     Concepts: matrices^submatrices
4435 
4436 .seealso: MatGetSubMatrices(), ISAllGather()
4437 @*/
4438 int MatGetSubMatrix(Mat mat,IS isrow,IS iscol,int csize,MatReuse cll,Mat *newmat)
4439 {
4440   int     ierr, size;
4441   Mat     *local;
4442 
4443   PetscFunctionBegin;
4444   PetscValidType(mat);
4445   MatPreallocated(mat);
4446   ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr);
4447 
4448   /* if original matrix is on just one processor then use submatrix generated */
4449   if (!mat->ops->getsubmatrix && size == 1 && cll == MAT_REUSE_MATRIX) {
4450     ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_REUSE_MATRIX,&newmat);CHKERRQ(ierr);
4451     PetscFunctionReturn(0);
4452   } else if (!mat->ops->getsubmatrix && size == 1) {
4453     ierr    = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_INITIAL_MATRIX,&local);CHKERRQ(ierr);
4454     *newmat = *local;
4455     ierr    = PetscFree(local);CHKERRQ(ierr);
4456     PetscFunctionReturn(0);
4457   }
4458 
4459   if (!mat->ops->getsubmatrix) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4460   ierr = (*mat->ops->getsubmatrix)(mat,isrow,iscol,csize,cll,newmat);CHKERRQ(ierr);
4461   PetscFunctionReturn(0);
4462 }
4463 
4464 #undef __FUNCT__
4465 #define __FUNCT__ "MatGetPetscMaps"
4466 /*@C
4467    MatGetPetscMaps - Returns the maps associated with the matrix.
4468 
4469    Not Collective
4470 
4471    Input Parameter:
4472 .  mat - the matrix
4473 
4474    Output Parameters:
4475 +  rmap - the row (right) map
4476 -  cmap - the column (left) map
4477 
4478    Level: developer
4479 
4480    Concepts: maps^getting from matrix
4481 
4482 @*/
4483 int MatGetPetscMaps(Mat mat,PetscMap *rmap,PetscMap *cmap)
4484 {
4485   int ierr;
4486 
4487   PetscFunctionBegin;
4488   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4489   PetscValidType(mat);
4490   MatPreallocated(mat);
4491   ierr = (*mat->ops->getmaps)(mat,rmap,cmap);CHKERRQ(ierr);
4492   PetscFunctionReturn(0);
4493 }
4494 
4495 /*
4496       Version that works for all PETSc matrices
4497 */
4498 #undef __FUNCT__
4499 #define __FUNCT__ "MatGetPetscMaps_Petsc"
4500 int MatGetPetscMaps_Petsc(Mat mat,PetscMap *rmap,PetscMap *cmap)
4501 {
4502   PetscFunctionBegin;
4503   if (rmap) *rmap = mat->rmap;
4504   if (cmap) *cmap = mat->cmap;
4505   PetscFunctionReturn(0);
4506 }
4507 
4508 #undef __FUNCT__
4509 #define __FUNCT__ "MatSetStashInitialSize"
4510 /*@
4511    MatSetStashInitialSize - sets the sizes of the matrix stash, that is
4512    used during the assembly process to store values that belong to
4513    other processors.
4514 
4515    Not Collective
4516 
4517    Input Parameters:
4518 +  mat   - the matrix
4519 .  size  - the initial size of the stash.
4520 -  bsize - the initial size of the block-stash(if used).
4521 
4522    Options Database Keys:
4523 +   -matstash_initial_size <size> or <size0,size1,...sizep-1>
4524 -   -matstash_block_initial_size <bsize>  or <bsize0,bsize1,...bsizep-1>
4525 
4526    Level: intermediate
4527 
4528    Notes:
4529      The block-stash is used for values set with VecSetValuesBlocked() while
4530      the stash is used for values set with VecSetValues()
4531 
4532      Run with the option -log_info and look for output of the form
4533      MatAssemblyBegin_MPIXXX:Stash has MM entries, uses nn mallocs.
4534      to determine the appropriate value, MM, to use for size and
4535      MatAssemblyBegin_MPIXXX:Block-Stash has BMM entries, uses nn mallocs.
4536      to determine the value, BMM to use for bsize
4537 
4538    Concepts: stash^setting matrix size
4539    Concepts: matrices^stash
4540 
4541 @*/
4542 int MatSetStashInitialSize(Mat mat,int size, int bsize)
4543 {
4544   int ierr;
4545 
4546   PetscFunctionBegin;
4547   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4548   PetscValidType(mat);
4549   MatPreallocated(mat);
4550   ierr = MatStashSetInitialSize_Private(&mat->stash,size);CHKERRQ(ierr);
4551   ierr = MatStashSetInitialSize_Private(&mat->bstash,bsize);CHKERRQ(ierr);
4552   PetscFunctionReturn(0);
4553 }
4554 
4555 #undef __FUNCT__
4556 #define __FUNCT__ "MatInterpolateAdd"
4557 /*@
4558    MatInterpolateAdd - w = y + A*x or A'*x depending on the shape of
4559      the matrix
4560 
4561    Collective on Mat
4562 
4563    Input Parameters:
4564 +  mat   - the matrix
4565 .  x,y - the vectors
4566 -  w - where the result is stored
4567 
4568    Level: intermediate
4569 
4570    Notes:
4571     w may be the same vector as y.
4572 
4573     This allows one to use either the restriction or interpolation (its transpose)
4574     matrix to do the interpolation
4575 
4576     Concepts: interpolation
4577 
4578 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict()
4579 
4580 @*/
4581 int MatInterpolateAdd(Mat A,Vec x,Vec y,Vec w)
4582 {
4583   int M,N,ierr;
4584 
4585   PetscFunctionBegin;
4586   PetscValidType(A);
4587   MatPreallocated(A);
4588   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
4589   if (N > M) {
4590     ierr = MatMultTransposeAdd(A,x,y,w);CHKERRQ(ierr);
4591   } else {
4592     ierr = MatMultAdd(A,x,y,w);CHKERRQ(ierr);
4593   }
4594   PetscFunctionReturn(0);
4595 }
4596 
4597 #undef __FUNCT__
4598 #define __FUNCT__ "MatInterpolate"
4599 /*@
4600    MatInterpolate - y = A*x or A'*x depending on the shape of
4601      the matrix
4602 
4603    Collective on Mat
4604 
4605    Input Parameters:
4606 +  mat   - the matrix
4607 -  x,y - the vectors
4608 
4609    Level: intermediate
4610 
4611    Notes:
4612     This allows one to use either the restriction or interpolation (its transpose)
4613     matrix to do the interpolation
4614 
4615    Concepts: matrices^interpolation
4616 
4617 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict()
4618 
4619 @*/
4620 int MatInterpolate(Mat A,Vec x,Vec y)
4621 {
4622   int M,N,ierr;
4623 
4624   PetscFunctionBegin;
4625   PetscValidType(A);
4626   MatPreallocated(A);
4627   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
4628   if (N > M) {
4629     ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr);
4630   } else {
4631     ierr = MatMult(A,x,y);CHKERRQ(ierr);
4632   }
4633   PetscFunctionReturn(0);
4634 }
4635 
4636 #undef __FUNCT__
4637 #define __FUNCT__ "MatRestrict"
4638 /*@
4639    MatRestrict - y = A*x or A'*x
4640 
4641    Collective on Mat
4642 
4643    Input Parameters:
4644 +  mat   - the matrix
4645 -  x,y - the vectors
4646 
4647    Level: intermediate
4648 
4649    Notes:
4650     This allows one to use either the restriction or interpolation (its transpose)
4651     matrix to do the restriction
4652 
4653    Concepts: matrices^restriction
4654 
4655 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatInterpolate()
4656 
4657 @*/
4658 int MatRestrict(Mat A,Vec x,Vec y)
4659 {
4660   int M,N,ierr;
4661 
4662   PetscFunctionBegin;
4663   PetscValidType(A);
4664   MatPreallocated(A);
4665   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
4666   if (N > M) {
4667     ierr = MatMult(A,x,y);CHKERRQ(ierr);
4668   } else {
4669     ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr);
4670   }
4671   PetscFunctionReturn(0);
4672 }
4673 
4674 #undef __FUNCT__
4675 #define __FUNCT__ "MatNullSpaceAttach"
4676 /*@C
4677    MatNullSpaceAttach - attaches a null space to a matrix.
4678         This null space will be removed from the resulting vector whenever
4679         MatMult() is called
4680 
4681    Collective on Mat
4682 
4683    Input Parameters:
4684 +  mat - the matrix
4685 -  nullsp - the null space object
4686 
4687    Level: developer
4688 
4689    Notes:
4690       Overwrites any previous null space that may have been attached
4691 
4692    Concepts: null space^attaching to matrix
4693 
4694 .seealso: MatCreate(), MatNullSpaceCreate()
4695 @*/
4696 int MatNullSpaceAttach(Mat mat,MatNullSpace nullsp)
4697 {
4698   int ierr;
4699 
4700   PetscFunctionBegin;
4701   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4702   PetscValidType(mat);
4703   MatPreallocated(mat);
4704   PetscValidHeaderSpecific(nullsp,MAT_NULLSPACE_COOKIE);
4705 
4706   if (mat->nullsp) {
4707     ierr = MatNullSpaceDestroy(mat->nullsp);CHKERRQ(ierr);
4708   }
4709   mat->nullsp = nullsp;
4710   ierr = PetscObjectReference((PetscObject)nullsp);CHKERRQ(ierr);
4711   PetscFunctionReturn(0);
4712 }
4713 
4714 #undef __FUNCT__
4715 #define __FUNCT__ "MatICCFactor"
4716 /*@
4717    MatICCFactor - Performs in-place incomplete Cholesky factorization of matrix.
4718 
4719    Collective on Mat
4720 
4721    Input Parameters:
4722 +  mat - the matrix
4723 .  row - row/column permutation
4724 .  fill - expected fill factor >= 1.0
4725 -  level - level of fill, for ICC(k)
4726 
4727    Notes:
4728    Probably really in-place only when level of fill is zero, otherwise allocates
4729    new space to store factored matrix and deletes previous memory.
4730 
4731    Most users should employ the simplified SLES interface for linear solvers
4732    instead of working directly with matrix algebra routines such as this.
4733    See, e.g., SLESCreate().
4734 
4735    Level: developer
4736 
4737    Concepts: matrices^incomplete Cholesky factorization
4738    Concepts: Cholesky factorization
4739 
4740 .seealso: MatICCFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor()
4741 @*/
4742 int MatICCFactor(Mat mat,IS row,PetscReal fill,int level)
4743 {
4744   int ierr;
4745 
4746   PetscFunctionBegin;
4747   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4748   PetscValidType(mat);
4749   MatPreallocated(mat);
4750   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square");
4751   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
4752   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
4753   if (!mat->ops->iccfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4754   ierr = (*mat->ops->iccfactor)(mat,row,fill,level);CHKERRQ(ierr);
4755   PetscFunctionReturn(0);
4756 }
4757 
4758 #undef __FUNCT__
4759 #define __FUNCT__ "MatSetValuesAdic"
4760 /*@
4761    MatSetValuesAdic - Sets values computed with ADIC automatic differentiation into a matrix.
4762 
4763    Not Collective
4764 
4765    Input Parameters:
4766 +  mat - the matrix
4767 -  v - the values compute with ADIC
4768 
4769    Level: developer
4770 
4771    Notes:
4772      Must call MatSetColoring() before using this routine. Also this matrix must already
4773      have its nonzero pattern determined.
4774 
4775 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(),
4776           MatSetValues(), MatSetColoring(), MatSetValuesAdifor()
4777 @*/
4778 int MatSetValuesAdic(Mat mat,void *v)
4779 {
4780   int ierr;
4781 
4782   PetscFunctionBegin;
4783   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4784   PetscValidType(mat);
4785 
4786   if (!mat->assembled) {
4787     SETERRQ(1,"Matrix must be already assembled");
4788   }
4789   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4790   if (!mat->ops->setvaluesadic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4791   ierr = (*mat->ops->setvaluesadic)(mat,v);CHKERRQ(ierr);
4792   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4793   ierr = MatView_Private(mat);CHKERRQ(ierr);
4794   PetscFunctionReturn(0);
4795 }
4796 
4797 
4798 #undef __FUNCT__
4799 #define __FUNCT__ "MatSetColoring"
4800 /*@
4801    MatSetColoring - Sets a coloring used by calls to MatSetValuesAdic()
4802 
4803    Not Collective
4804 
4805    Input Parameters:
4806 +  mat - the matrix
4807 -  coloring - the coloring
4808 
4809    Level: developer
4810 
4811 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(),
4812           MatSetValues(), MatSetValuesAdic()
4813 @*/
4814 int MatSetColoring(Mat mat,ISColoring coloring)
4815 {
4816   int ierr;
4817 
4818   PetscFunctionBegin;
4819   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4820   PetscValidType(mat);
4821 
4822   if (!mat->assembled) {
4823     SETERRQ(1,"Matrix must be already assembled");
4824   }
4825   if (!mat->ops->setcoloring) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4826   ierr = (*mat->ops->setcoloring)(mat,coloring);CHKERRQ(ierr);
4827   PetscFunctionReturn(0);
4828 }
4829 
4830 #undef __FUNCT__
4831 #define __FUNCT__ "MatSetValuesAdifor"
4832 /*@
4833    MatSetValuesAdifor - Sets values computed with automatic differentiation into a matrix.
4834 
4835    Not Collective
4836 
4837    Input Parameters:
4838 +  mat - the matrix
4839 .  nl - leading dimension of v
4840 -  v - the values compute with ADIFOR
4841 
4842    Level: developer
4843 
4844    Notes:
4845      Must call MatSetColoring() before using this routine. Also this matrix must already
4846      have its nonzero pattern determined.
4847 
4848 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(),
4849           MatSetValues(), MatSetColoring()
4850 @*/
4851 int MatSetValuesAdifor(Mat mat,int nl,void *v)
4852 {
4853   int ierr;
4854 
4855   PetscFunctionBegin;
4856   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4857   PetscValidType(mat);
4858 
4859   if (!mat->assembled) {
4860     SETERRQ(1,"Matrix must be already assembled");
4861   }
4862   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4863   if (!mat->ops->setvaluesadifor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4864   ierr = (*mat->ops->setvaluesadifor)(mat,nl,v);CHKERRQ(ierr);
4865   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4866   PetscFunctionReturn(0);
4867 }
4868 
4869 EXTERN int MatMPIAIJDiagonalScaleLocal(Mat,Vec);
4870 EXTERN int MatMPIBAIJDiagonalScaleLocal(Mat,Vec);
4871 
4872 #undef __FUNCT__
4873 #define __FUNCT__ "MatDiagonalScaleLocal"
4874 /*@
4875    MatDiagonalScaleLocal - Scales columns of a matrix given the scaling values including the
4876          ghosted ones.
4877 
4878    Not Collective
4879 
4880    Input Parameters:
4881 +  mat - the matrix
4882 -  diag = the diagonal values, including ghost ones
4883 
4884    Level: developer
4885 
4886    Notes: Works only for MPIAIJ and MPIBAIJ matrices
4887 
4888 .seealso: MatDiagonalScale()
4889 @*/
4890 int MatDiagonalScaleLocal(Mat mat,Vec diag)
4891 {
4892   int        ierr;
4893   PetscTruth flag;
4894 
4895   PetscFunctionBegin;
4896   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4897   PetscValidHeaderSpecific(diag,VEC_COOKIE);
4898   PetscValidType(mat);
4899 
4900   if (!mat->assembled) {
4901     SETERRQ(1,"Matrix must be already assembled");
4902   }
4903   ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
4904   ierr = PetscTypeCompare((PetscObject)mat,MATMPIAIJ,&flag);CHKERRQ(ierr);
4905   if (flag) {
4906     ierr = MatMPIAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr);
4907   } else {
4908     ierr = PetscTypeCompare((PetscObject)mat,MATMPIBAIJ,&flag);CHKERRQ(ierr);
4909     if (flag) {
4910       ierr = MatMPIBAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr);
4911     } else {
4912       int size;
4913       ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr);
4914       if (size == 1) {
4915         int n,m;
4916         ierr = VecGetSize(diag,&n);CHKERRQ(ierr);
4917         ierr = MatGetSize(mat,0,&m);CHKERRQ(ierr);
4918         if (m == n) {
4919           ierr = MatDiagonalScale(mat,0,diag);CHKERRQ(ierr);
4920         } else {
4921           SETERRQ(1,"Only supprted for sequential matrices when no ghost points/periodic conditions");
4922         }
4923       } else {
4924         SETERRQ(1,"Only supported for MPIAIJ and MPIBAIJ parallel matrices");
4925       }
4926     }
4927   }
4928   ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
4929   PetscFunctionReturn(0);
4930 }
4931 
4932 #undef __FUNCT__
4933 #define __FUNCT__ "MatGetInertia"
4934 /*@
4935    MatGetInertia - Gets the inertia from a factored matrix
4936 
4937    Collective on Mat
4938 
4939    Input Parameter:
4940 .  mat - the matrix
4941 
4942    Output Parameters:
4943 +   nneg - number of negative eigenvalues
4944 .   nzero - number of zero eigenvalues
4945 -   npos - number of positive eigenvalues
4946 
4947    Level: advanced
4948 
4949    Notes: Matrix must have been factored by MatCholeskyFactor()
4950 
4951 
4952 @*/
4953 int MatGetInertia(Mat mat,int *nneg,int *nzero,int *npos)
4954 {
4955   int        ierr;
4956 
4957   PetscFunctionBegin;
4958   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4959   PetscValidType(mat);
4960   if (!mat->factor)    SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
4961   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Numeric factor mat is not assembled");
4962   if (!mat->ops->getinertia) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4963   ierr = (*mat->ops->getinertia)(mat,nneg,nzero,npos);CHKERRQ(ierr);
4964   PetscFunctionReturn(0);
4965 }
4966 
4967 /* ----------------------------------------------------------------*/
4968 #undef __FUNCT__
4969 #define __FUNCT__ "MatSolves"
4970 /*@
4971    MatSolves - Solves A x = b, given a factored matrix, for a collection of vectors
4972 
4973    Collective on Mat and Vecs
4974 
4975    Input Parameters:
4976 +  mat - the factored matrix
4977 -  b - the right-hand-side vectors
4978 
4979    Output Parameter:
4980 .  x - the result vectors
4981 
4982    Notes:
4983    The vectors b and x cannot be the same.  I.e., one cannot
4984    call MatSolves(A,x,x).
4985 
4986    Notes:
4987    Most users should employ the simplified SLES interface for linear solvers
4988    instead of working directly with matrix algebra routines such as this.
4989    See, e.g., SLESCreate().
4990 
4991    Level: developer
4992 
4993    Concepts: matrices^triangular solves
4994 
4995 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd(), MatSolve()
4996 @*/
4997 int MatSolves(Mat mat,Vecs b,Vecs x)
4998 {
4999   int ierr;
5000 
5001   PetscFunctionBegin;
5002   PetscValidHeaderSpecific(mat,MAT_COOKIE);
5003   PetscValidType(mat);
5004   MatPreallocated(mat);
5005   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
5006   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
5007   if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0);
5008 
5009   if (!mat->ops->solves) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
5010   ierr = PetscLogEventBegin(MAT_Solves,mat,0,0,0);CHKERRQ(ierr);
5011   ierr = (*mat->ops->solves)(mat,b,x);CHKERRQ(ierr);
5012   ierr = PetscLogEventEnd(MAT_Solves,mat,0,0,0);CHKERRQ(ierr);
5013   PetscFunctionReturn(0);
5014 }
5015