xref: /petsc/src/mat/interface/matrix.c (revision 85fc7724dce558a038329fe25788132d65e2c832)
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;
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   PetscTruth flg;
1703 
1704   PetscFunctionBegin;
1705   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1706   PetscValidType(mat);
1707   MatPreallocated(mat);
1708   PetscValidPointer(fact);
1709   PetscValidHeaderSpecific(*fact,MAT_COOKIE);
1710   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1711   if (mat->M != (*fact)->M || mat->N != (*fact)->N) {
1712     SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dimensions are different %d should = %d %d should = %d",
1713             mat->M,(*fact)->M,mat->N,(*fact)->N);
1714   }
1715   if (!(*fact)->ops->lufactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1716 
1717   ierr = PetscLogEventBegin(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1718   ierr = (*(*fact)->ops->lufactornumeric)(mat,fact);CHKERRQ(ierr);
1719   ierr = PetscLogEventEnd(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1720 
1721   ierr = MatView_Private(*fact);CHKERRQ(ierr);
1722   PetscFunctionReturn(0);
1723 }
1724 
1725 #undef __FUNCT__
1726 #define __FUNCT__ "MatCholeskyFactor"
1727 /*@
1728    MatCholeskyFactor - Performs in-place Cholesky factorization of a
1729    symmetric matrix.
1730 
1731    Collective on Mat
1732 
1733    Input Parameters:
1734 +  mat - the matrix
1735 .  perm - row and column permutations
1736 -  f - expected fill as ratio of original fill
1737 
1738    Notes:
1739    See MatLUFactor() for the nonsymmetric case.  See also
1740    MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric().
1741 
1742    Most users should employ the simplified SLES interface for linear solvers
1743    instead of working directly with matrix algebra routines such as this.
1744    See, e.g., SLESCreate().
1745 
1746    Level: developer
1747 
1748    Concepts: matrices^Cholesky factorization
1749 
1750 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric()
1751           MatGetOrdering()
1752 
1753 @*/
1754 int MatCholeskyFactor(Mat mat,IS perm,PetscReal f)
1755 {
1756   int ierr;
1757 
1758   PetscFunctionBegin;
1759   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1760   PetscValidType(mat);
1761   MatPreallocated(mat);
1762   PetscValidHeaderSpecific(perm,IS_COOKIE);
1763   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square");
1764   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1765   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1766   if (!mat->ops->choleskyfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1767 
1768   ierr = PetscLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr);
1769   ierr = (*mat->ops->choleskyfactor)(mat,perm,f);CHKERRQ(ierr);
1770   ierr = PetscLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr);
1771   PetscFunctionReturn(0);
1772 }
1773 
1774 #undef __FUNCT__
1775 #define __FUNCT__ "MatCholeskyFactorSymbolic"
1776 /*@
1777    MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization
1778    of a symmetric matrix.
1779 
1780    Collective on Mat
1781 
1782    Input Parameters:
1783 +  mat - the matrix
1784 .  perm - row and column permutations
1785 -  f - expected fill as ratio of original
1786 
1787    Output Parameter:
1788 .  fact - the factored matrix
1789 
1790    Notes:
1791    See MatLUFactorSymbolic() for the nonsymmetric case.  See also
1792    MatCholeskyFactor() and MatCholeskyFactorNumeric().
1793 
1794    Most users should employ the simplified SLES interface for linear solvers
1795    instead of working directly with matrix algebra routines such as this.
1796    See, e.g., SLESCreate().
1797 
1798    Level: developer
1799 
1800    Concepts: matrices^Cholesky symbolic factorization
1801 
1802 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric()
1803           MatGetOrdering()
1804 
1805 @*/
1806 int MatCholeskyFactorSymbolic(Mat mat,IS perm,PetscReal f,Mat *fact)
1807 {
1808   int ierr;
1809 
1810   PetscFunctionBegin;
1811   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1812   PetscValidType(mat);
1813   MatPreallocated(mat);
1814   PetscValidPointer(fact);
1815   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square");
1816   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1817   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1818   if (!mat->ops->choleskyfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1819 
1820   ierr = PetscLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
1821   ierr = (*mat->ops->choleskyfactorsymbolic)(mat,perm,f,fact);CHKERRQ(ierr);
1822   ierr = PetscLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
1823   PetscFunctionReturn(0);
1824 }
1825 
1826 #undef __FUNCT__
1827 #define __FUNCT__ "MatCholeskyFactorNumeric"
1828 /*@
1829    MatCholeskyFactorNumeric - Performs numeric Cholesky factorization
1830    of a symmetric matrix. Call this routine after first calling
1831    MatCholeskyFactorSymbolic().
1832 
1833    Collective on Mat
1834 
1835    Input Parameter:
1836 .  mat - the initial matrix
1837 
1838    Output Parameter:
1839 .  fact - the factored matrix
1840 
1841    Notes:
1842    Most users should employ the simplified SLES interface for linear solvers
1843    instead of working directly with matrix algebra routines such as this.
1844    See, e.g., SLESCreate().
1845 
1846    Level: developer
1847 
1848    Concepts: matrices^Cholesky numeric factorization
1849 
1850 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric()
1851 @*/
1852 int MatCholeskyFactorNumeric(Mat mat,Mat *fact)
1853 {
1854   int ierr;
1855 
1856   PetscFunctionBegin;
1857   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1858   PetscValidType(mat);
1859   MatPreallocated(mat);
1860   PetscValidPointer(fact);
1861   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
1862   if (!(*fact)->ops->choleskyfactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1863   if (mat->M != (*fact)->M || mat->N != (*fact)->N) {
1864     SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dim %d should = %d %d should = %d",
1865             mat->M,(*fact)->M,mat->N,(*fact)->N);
1866   }
1867 
1868   ierr = PetscLogEventBegin(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1869   ierr = (*(*fact)->ops->choleskyfactornumeric)(mat,fact);CHKERRQ(ierr);
1870   ierr = PetscLogEventEnd(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr);
1871   PetscFunctionReturn(0);
1872 }
1873 
1874 /* ----------------------------------------------------------------*/
1875 #undef __FUNCT__
1876 #define __FUNCT__ "MatSolve"
1877 /*@
1878    MatSolve - Solves A x = b, given a factored matrix.
1879 
1880    Collective on Mat and Vec
1881 
1882    Input Parameters:
1883 +  mat - the factored matrix
1884 -  b - the right-hand-side vector
1885 
1886    Output Parameter:
1887 .  x - the result vector
1888 
1889    Notes:
1890    The vectors b and x cannot be the same.  I.e., one cannot
1891    call MatSolve(A,x,x).
1892 
1893    Notes:
1894    Most users should employ the simplified SLES interface for linear solvers
1895    instead of working directly with matrix algebra routines such as this.
1896    See, e.g., SLESCreate().
1897 
1898    Level: developer
1899 
1900    Concepts: matrices^triangular solves
1901 
1902 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd()
1903 @*/
1904 int MatSolve(Mat mat,Vec b,Vec x)
1905 {
1906   int ierr;
1907 
1908   PetscFunctionBegin;
1909   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1910   PetscValidType(mat);
1911   MatPreallocated(mat);
1912   PetscValidHeaderSpecific(b,VEC_COOKIE);
1913   PetscValidHeaderSpecific(x,VEC_COOKIE);
1914   PetscCheckSameComm(mat,b);
1915   PetscCheckSameComm(mat,x);
1916   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
1917   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
1918   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1919   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
1920   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
1921   if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0);
1922 
1923   if (!mat->ops->solve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1924   ierr = PetscLogEventBegin(MAT_Solve,mat,b,x,0);CHKERRQ(ierr);
1925   ierr = (*mat->ops->solve)(mat,b,x);CHKERRQ(ierr);
1926   ierr = PetscLogEventEnd(MAT_Solve,mat,b,x,0);CHKERRQ(ierr);
1927   PetscFunctionReturn(0);
1928 }
1929 
1930 #undef __FUNCT__
1931 #define __FUNCT__ "MatForwardSolve"
1932 /* @
1933    MatForwardSolve - Solves L x = b, given a factored matrix, A = LU.
1934 
1935    Collective on Mat and Vec
1936 
1937    Input Parameters:
1938 +  mat - the factored matrix
1939 -  b - the right-hand-side vector
1940 
1941    Output Parameter:
1942 .  x - the result vector
1943 
1944    Notes:
1945    MatSolve() should be used for most applications, as it performs
1946    a forward solve followed by a backward solve.
1947 
1948    The vectors b and x cannot be the same.  I.e., one cannot
1949    call MatForwardSolve(A,x,x).
1950 
1951    Most users should employ the simplified SLES interface for linear solvers
1952    instead of working directly with matrix algebra routines such as this.
1953    See, e.g., SLESCreate().
1954 
1955    Level: developer
1956 
1957    Concepts: matrices^forward solves
1958 
1959 .seealso: MatSolve(), MatBackwardSolve()
1960 @ */
1961 int MatForwardSolve(Mat mat,Vec b,Vec x)
1962 {
1963   int ierr;
1964 
1965   PetscFunctionBegin;
1966   PetscValidHeaderSpecific(mat,MAT_COOKIE);
1967   PetscValidType(mat);
1968   MatPreallocated(mat);
1969   PetscValidHeaderSpecific(b,VEC_COOKIE);
1970   PetscValidHeaderSpecific(x,VEC_COOKIE);
1971   PetscCheckSameComm(mat,b);
1972   PetscCheckSameComm(mat,x);
1973   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
1974   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
1975   if (!mat->ops->forwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
1976   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
1977   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
1978   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
1979 
1980   ierr = PetscLogEventBegin(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr);
1981   ierr = (*mat->ops->forwardsolve)(mat,b,x);CHKERRQ(ierr);
1982   ierr = PetscLogEventEnd(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr);
1983   PetscFunctionReturn(0);
1984 }
1985 
1986 #undef __FUNCT__
1987 #define __FUNCT__ "MatBackwardSolve"
1988 /* @
1989    MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU.
1990 
1991    Collective on Mat and Vec
1992 
1993    Input Parameters:
1994 +  mat - the factored matrix
1995 -  b - the right-hand-side vector
1996 
1997    Output Parameter:
1998 .  x - the result vector
1999 
2000    Notes:
2001    MatSolve() should be used for most applications, as it performs
2002    a forward solve followed by a backward solve.
2003 
2004    The vectors b and x cannot be the same.  I.e., one cannot
2005    call MatBackwardSolve(A,x,x).
2006 
2007    Most users should employ the simplified SLES interface for linear solvers
2008    instead of working directly with matrix algebra routines such as this.
2009    See, e.g., SLESCreate().
2010 
2011    Level: developer
2012 
2013    Concepts: matrices^backward solves
2014 
2015 .seealso: MatSolve(), MatForwardSolve()
2016 @ */
2017 int MatBackwardSolve(Mat mat,Vec b,Vec x)
2018 {
2019   int ierr;
2020 
2021   PetscFunctionBegin;
2022   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2023   PetscValidType(mat);
2024   MatPreallocated(mat);
2025   PetscValidHeaderSpecific(b,VEC_COOKIE);
2026   PetscValidHeaderSpecific(x,VEC_COOKIE);
2027   PetscCheckSameComm(mat,b);
2028   PetscCheckSameComm(mat,x);
2029   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2030   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2031   if (!mat->ops->backwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2032   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
2033   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
2034   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
2035 
2036   ierr = PetscLogEventBegin(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr);
2037   ierr = (*mat->ops->backwardsolve)(mat,b,x);CHKERRQ(ierr);
2038   ierr = PetscLogEventEnd(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr);
2039   PetscFunctionReturn(0);
2040 }
2041 
2042 #undef __FUNCT__
2043 #define __FUNCT__ "MatSolveAdd"
2044 /*@
2045    MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix.
2046 
2047    Collective on Mat and Vec
2048 
2049    Input Parameters:
2050 +  mat - the factored matrix
2051 .  b - the right-hand-side vector
2052 -  y - the vector to be added to
2053 
2054    Output Parameter:
2055 .  x - the result vector
2056 
2057    Notes:
2058    The vectors b and x cannot be the same.  I.e., one cannot
2059    call MatSolveAdd(A,x,y,x).
2060 
2061    Most users should employ the simplified SLES interface for linear solvers
2062    instead of working directly with matrix algebra routines such as this.
2063    See, e.g., SLESCreate().
2064 
2065    Level: developer
2066 
2067    Concepts: matrices^triangular solves
2068 
2069 .seealso: MatSolve(), MatSolveTranspose(), MatSolveTransposeAdd()
2070 @*/
2071 int MatSolveAdd(Mat mat,Vec b,Vec y,Vec x)
2072 {
2073   PetscScalar one = 1.0;
2074   Vec    tmp;
2075   int    ierr;
2076 
2077   PetscFunctionBegin;
2078   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2079   PetscValidType(mat);
2080   MatPreallocated(mat);
2081   PetscValidHeaderSpecific(y,VEC_COOKIE);
2082   PetscValidHeaderSpecific(b,VEC_COOKIE);
2083   PetscValidHeaderSpecific(x,VEC_COOKIE);
2084   PetscCheckSameComm(mat,b);
2085   PetscCheckSameComm(mat,y);
2086   PetscCheckSameComm(mat,x);
2087   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2088   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2089   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
2090   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
2091   if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N);
2092   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
2093   if (x->n != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n);
2094 
2095   ierr = PetscLogEventBegin(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr);
2096   if (mat->ops->solveadd)  {
2097     ierr = (*mat->ops->solveadd)(mat,b,y,x);CHKERRQ(ierr);
2098   } else {
2099     /* do the solve then the add manually */
2100     if (x != y) {
2101       ierr = MatSolve(mat,b,x);CHKERRQ(ierr);
2102       ierr = VecAXPY(&one,y,x);CHKERRQ(ierr);
2103     } else {
2104       ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr);
2105       PetscLogObjectParent(mat,tmp);
2106       ierr = VecCopy(x,tmp);CHKERRQ(ierr);
2107       ierr = MatSolve(mat,b,x);CHKERRQ(ierr);
2108       ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr);
2109       ierr = VecDestroy(tmp);CHKERRQ(ierr);
2110     }
2111   }
2112   ierr = PetscLogEventEnd(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr);
2113   PetscFunctionReturn(0);
2114 }
2115 
2116 #undef __FUNCT__
2117 #define __FUNCT__ "MatSolveTranspose"
2118 /*@
2119    MatSolveTranspose - Solves A' x = b, given a factored matrix.
2120 
2121    Collective on Mat and Vec
2122 
2123    Input Parameters:
2124 +  mat - the factored matrix
2125 -  b - the right-hand-side vector
2126 
2127    Output Parameter:
2128 .  x - the result vector
2129 
2130    Notes:
2131    The vectors b and x cannot be the same.  I.e., one cannot
2132    call MatSolveTranspose(A,x,x).
2133 
2134    Most users should employ the simplified SLES interface for linear solvers
2135    instead of working directly with matrix algebra routines such as this.
2136    See, e.g., SLESCreate().
2137 
2138    Level: developer
2139 
2140    Concepts: matrices^triangular solves
2141 
2142 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransposeAdd()
2143 @*/
2144 int MatSolveTranspose(Mat mat,Vec b,Vec x)
2145 {
2146   int ierr;
2147 
2148   PetscFunctionBegin;
2149   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2150   PetscValidType(mat);
2151   MatPreallocated(mat);
2152   PetscValidHeaderSpecific(b,VEC_COOKIE);
2153   PetscValidHeaderSpecific(x,VEC_COOKIE);
2154   PetscCheckSameComm(mat,b);
2155   PetscCheckSameComm(mat,x);
2156   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2157   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2158   if (!mat->ops->solvetranspose) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s",mat->type_name);
2159   if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N);
2160   if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N);
2161 
2162   ierr = PetscLogEventBegin(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr);
2163   ierr = (*mat->ops->solvetranspose)(mat,b,x);CHKERRQ(ierr);
2164   ierr = PetscLogEventEnd(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr);
2165   PetscFunctionReturn(0);
2166 }
2167 
2168 #undef __FUNCT__
2169 #define __FUNCT__ "MatSolveTransposeAdd"
2170 /*@
2171    MatSolveTransposeAdd - Computes x = y + inv(Transpose(A)) b, given a
2172                       factored matrix.
2173 
2174    Collective on Mat and Vec
2175 
2176    Input Parameters:
2177 +  mat - the factored matrix
2178 .  b - the right-hand-side vector
2179 -  y - the vector to be added to
2180 
2181    Output Parameter:
2182 .  x - the result vector
2183 
2184    Notes:
2185    The vectors b and x cannot be the same.  I.e., one cannot
2186    call MatSolveTransposeAdd(A,x,y,x).
2187 
2188    Most users should employ the simplified SLES interface for linear solvers
2189    instead of working directly with matrix algebra routines such as this.
2190    See, e.g., SLESCreate().
2191 
2192    Level: developer
2193 
2194    Concepts: matrices^triangular solves
2195 
2196 .seealso: MatSolve(), MatSolveAdd(), MatSolveTranspose()
2197 @*/
2198 int MatSolveTransposeAdd(Mat mat,Vec b,Vec y,Vec x)
2199 {
2200   PetscScalar one = 1.0;
2201   int         ierr;
2202   Vec         tmp;
2203 
2204   PetscFunctionBegin;
2205   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2206   PetscValidType(mat);
2207   MatPreallocated(mat);
2208   PetscValidHeaderSpecific(y,VEC_COOKIE);
2209   PetscValidHeaderSpecific(b,VEC_COOKIE);
2210   PetscValidHeaderSpecific(x,VEC_COOKIE);
2211   PetscCheckSameComm(mat,b);
2212   PetscCheckSameComm(mat,y);
2213   PetscCheckSameComm(mat,x);
2214   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
2215   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
2216   if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N);
2217   if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N);
2218   if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->N,y->N);
2219   if (x->n != y->n)   SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n);
2220 
2221   ierr = PetscLogEventBegin(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr);
2222   if (mat->ops->solvetransposeadd) {
2223     ierr = (*mat->ops->solvetransposeadd)(mat,b,y,x);CHKERRQ(ierr);
2224   } else {
2225     /* do the solve then the add manually */
2226     if (x != y) {
2227       ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr);
2228       ierr = VecAXPY(&one,y,x);CHKERRQ(ierr);
2229     } else {
2230       ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr);
2231       PetscLogObjectParent(mat,tmp);
2232       ierr = VecCopy(x,tmp);CHKERRQ(ierr);
2233       ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr);
2234       ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr);
2235       ierr = VecDestroy(tmp);CHKERRQ(ierr);
2236     }
2237   }
2238   ierr = PetscLogEventEnd(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr);
2239   PetscFunctionReturn(0);
2240 }
2241 /* ----------------------------------------------------------------*/
2242 
2243 #undef __FUNCT__
2244 #define __FUNCT__ "MatRelax"
2245 /*@
2246    MatRelax - Computes one relaxation sweep.
2247 
2248    Collective on Mat and Vec
2249 
2250    Input Parameters:
2251 +  mat - the matrix
2252 .  b - the right hand side
2253 .  omega - the relaxation factor
2254 .  flag - flag indicating the type of SOR (see below)
2255 .  shift -  diagonal shift
2256 -  its - the number of iterations
2257 -  lits - the number of local iterations
2258 
2259    Output Parameters:
2260 .  x - the solution (can contain an initial guess)
2261 
2262    SOR Flags:
2263 .     SOR_FORWARD_SWEEP - forward SOR
2264 .     SOR_BACKWARD_SWEEP - backward SOR
2265 .     SOR_SYMMETRIC_SWEEP - SSOR (symmetric SOR)
2266 .     SOR_LOCAL_FORWARD_SWEEP - local forward SOR
2267 .     SOR_LOCAL_BACKWARD_SWEEP - local forward SOR
2268 .     SOR_LOCAL_SYMMETRIC_SWEEP - local SSOR
2269 .     SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies
2270          upper/lower triangular part of matrix to
2271          vector (with omega)
2272 .     SOR_ZERO_INITIAL_GUESS - zero initial guess
2273 
2274    Notes:
2275    SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and
2276    SOR_LOCAL_SYMMETRIC_SWEEP perform seperate independent smoothings
2277    on each processor.
2278 
2279    Application programmers will not generally use MatRelax() directly,
2280    but instead will employ the SLES/PC interface.
2281 
2282    Notes for Advanced Users:
2283    The flags are implemented as bitwise inclusive or operations.
2284    For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP)
2285    to specify a zero initial guess for SSOR.
2286 
2287    Most users should employ the simplified SLES interface for linear solvers
2288    instead of working directly with matrix algebra routines such as this.
2289    See, e.g., SLESCreate().
2290 
2291    Level: developer
2292 
2293    Concepts: matrices^relaxation
2294    Concepts: matrices^SOR
2295    Concepts: matrices^Gauss-Seidel
2296 
2297 @*/
2298 int MatRelax(Mat mat,Vec b,PetscReal omega,MatSORType flag,PetscReal shift,int its,int lits,Vec x)
2299 {
2300   int ierr;
2301 
2302   PetscFunctionBegin;
2303   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2304   PetscValidType(mat);
2305   MatPreallocated(mat);
2306   PetscValidHeaderSpecific(b,VEC_COOKIE);
2307   PetscValidHeaderSpecific(x,VEC_COOKIE);
2308   PetscCheckSameComm(mat,b);
2309   PetscCheckSameComm(mat,x);
2310   if (!mat->ops->relax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2311   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2312   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2313   if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N);
2314   if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N);
2315   if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n);
2316 
2317   ierr = PetscLogEventBegin(MAT_Relax,mat,b,x,0);CHKERRQ(ierr);
2318   ierr =(*mat->ops->relax)(mat,b,omega,flag,shift,its,lits,x);CHKERRQ(ierr);
2319   ierr = PetscLogEventEnd(MAT_Relax,mat,b,x,0);CHKERRQ(ierr);
2320   PetscFunctionReturn(0);
2321 }
2322 
2323 #undef __FUNCT__
2324 #define __FUNCT__ "MatCopy_Basic"
2325 /*
2326       Default matrix copy routine.
2327 */
2328 int MatCopy_Basic(Mat A,Mat B,MatStructure str)
2329 {
2330   int         ierr,i,rstart,rend,nz,*cwork;
2331   PetscScalar *vwork;
2332 
2333   PetscFunctionBegin;
2334   ierr = MatZeroEntries(B);CHKERRQ(ierr);
2335   ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr);
2336   for (i=rstart; i<rend; i++) {
2337     ierr = MatGetRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
2338     ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr);
2339     ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
2340   }
2341   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2342   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2343   PetscFunctionReturn(0);
2344 }
2345 
2346 #undef __FUNCT__
2347 #define __FUNCT__ "MatCopy"
2348 /*@C
2349    MatCopy - Copys a matrix to another matrix.
2350 
2351    Collective on Mat
2352 
2353    Input Parameters:
2354 +  A - the matrix
2355 -  str - SAME_NONZERO_PATTERN or DIFFERENT_NONZERO_PATTERN
2356 
2357    Output Parameter:
2358 .  B - where the copy is put
2359 
2360    Notes:
2361    If you use SAME_NONZERO_PATTERN then the two matrices had better have the
2362    same nonzero pattern or the routine will crash.
2363 
2364    MatCopy() copies the matrix entries of a matrix to another existing
2365    matrix (after first zeroing the second matrix).  A related routine is
2366    MatConvert(), which first creates a new matrix and then copies the data.
2367 
2368    Level: intermediate
2369 
2370    Concepts: matrices^copying
2371 
2372 .seealso: MatConvert(), MatDuplicate()
2373 
2374 @*/
2375 int MatCopy(Mat A,Mat B,MatStructure str)
2376 {
2377   int ierr;
2378 
2379   PetscFunctionBegin;
2380   PetscValidHeaderSpecific(A,MAT_COOKIE);
2381   PetscValidHeaderSpecific(B,MAT_COOKIE);
2382   PetscValidType(A);
2383   MatPreallocated(A);
2384   PetscValidType(B);
2385   MatPreallocated(B);
2386   PetscCheckSameComm(A,B);
2387   if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2388   if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2389   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,
2390                                              A->N,B->N);
2391 
2392   ierr = PetscLogEventBegin(MAT_Copy,A,B,0,0);CHKERRQ(ierr);
2393   if (A->ops->copy) {
2394     ierr = (*A->ops->copy)(A,B,str);CHKERRQ(ierr);
2395   } else { /* generic conversion */
2396     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
2397   }
2398   if (A->mapping) {
2399     if (B->mapping) {ierr = ISLocalToGlobalMappingDestroy(B->mapping);CHKERRQ(ierr);B->mapping = 0;}
2400     ierr = MatSetLocalToGlobalMapping(B,A->mapping);CHKERRQ(ierr);
2401   }
2402   if (A->bmapping) {
2403     if (B->bmapping) {ierr = ISLocalToGlobalMappingDestroy(B->bmapping);CHKERRQ(ierr);B->bmapping = 0;}
2404     ierr = MatSetLocalToGlobalMappingBlock(B,A->mapping);CHKERRQ(ierr);
2405   }
2406   ierr = PetscLogEventEnd(MAT_Copy,A,B,0,0);CHKERRQ(ierr);
2407   PetscFunctionReturn(0);
2408 }
2409 
2410 #include "petscsys.h"
2411 PetscTruth MatConvertRegisterAllCalled = PETSC_FALSE;
2412 PetscFList MatConvertList              = 0;
2413 
2414 #undef __FUNCT__
2415 #define __FUNCT__ "MatConvertRegister"
2416 /*@C
2417     MatConvertRegister - Allows one to register a routine that converts a sparse matrix
2418         from one format to another.
2419 
2420   Not Collective
2421 
2422   Input Parameters:
2423 +   type - the type of matrix (defined in include/petscmat.h), for example, MATSEQAIJ.
2424 -   Converter - the function that reads the matrix from the binary file.
2425 
2426   Level: developer
2427 
2428 .seealso: MatConvertRegisterAll(), MatConvert()
2429 
2430 @*/
2431 int MatConvertRegister(char *sname,char *path,char *name,int (*function)(Mat,MatType,Mat*))
2432 {
2433   int  ierr;
2434   char fullname[PETSC_MAX_PATH_LEN];
2435 
2436   PetscFunctionBegin;
2437   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
2438   ierr = PetscFListAdd(&MatConvertList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
2439   PetscFunctionReturn(0);
2440 }
2441 
2442 #undef __FUNCT__
2443 #define __FUNCT__ "MatConvert"
2444 /*@C
2445    MatConvert - Converts a matrix to another matrix, either of the same
2446    or different type.
2447 
2448    Collective on Mat
2449 
2450    Input Parameters:
2451 +  mat - the matrix
2452 -  newtype - new matrix type.  Use MATSAME to create a new matrix of the
2453    same type as the original matrix.
2454 
2455    Output Parameter:
2456 .  M - pointer to place new matrix
2457 
2458    Notes:
2459    MatConvert() first creates a new matrix and then copies the data from
2460    the first matrix.  A related routine is MatCopy(), which copies the matrix
2461    entries of one matrix to another already existing matrix context.
2462 
2463    Level: intermediate
2464 
2465    Concepts: matrices^converting between storage formats
2466 
2467 .seealso: MatCopy(), MatDuplicate()
2468 @*/
2469 int MatConvert(Mat mat,MatType newtype,Mat *M)
2470 {
2471   int        ierr;
2472   PetscTruth sametype,issame,flg;
2473   char       convname[256],mtype[256];
2474 
2475   PetscFunctionBegin;
2476   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2477   PetscValidType(mat);
2478   MatPreallocated(mat);
2479   PetscValidPointer(M);
2480   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2481   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2482 
2483   ierr = PetscOptionsGetString(PETSC_NULL,"-matconvert_type",mtype,256,&flg);CHKERRQ(ierr);
2484   if (flg) {
2485     newtype = mtype;
2486   }
2487   ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2488 
2489   ierr = PetscTypeCompare((PetscObject)mat,newtype,&sametype);CHKERRQ(ierr);
2490   ierr = PetscStrcmp(newtype,"same",&issame);CHKERRQ(ierr);
2491   if ((sametype || issame) && mat->ops->duplicate) {
2492     ierr = (*mat->ops->duplicate)(mat,MAT_COPY_VALUES,M);CHKERRQ(ierr);
2493   } else {
2494     int (*conv)(Mat,MatType,Mat*);
2495     if (!MatConvertRegisterAllCalled) {
2496       ierr = MatConvertRegisterAll(PETSC_NULL);CHKERRQ(ierr);
2497     }
2498     ierr = PetscFListFind(mat->comm,MatConvertList,newtype,(void(**)(void))&conv);CHKERRQ(ierr);
2499     if (conv) {
2500       ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr);
2501     } else {
2502       ierr = PetscStrcpy(convname,"MatConvert_");CHKERRQ(ierr);
2503       ierr = PetscStrcat(convname,mat->type_name);CHKERRQ(ierr);
2504       ierr = PetscStrcat(convname,"_");CHKERRQ(ierr);
2505       ierr = PetscStrcat(convname,newtype);CHKERRQ(ierr);
2506       ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr);
2507       ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr);
2508       if (conv) {
2509         ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr);
2510       } else {
2511         if (mat->ops->convert) {
2512           ierr = (*mat->ops->convert)(mat,newtype,M);CHKERRQ(ierr);
2513         } else {
2514           ierr = MatConvert_Basic(mat,newtype,M);CHKERRQ(ierr);
2515         }
2516       }
2517     }
2518   }
2519   ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2520   PetscFunctionReturn(0);
2521 }
2522 
2523 
2524 #undef __FUNCT__
2525 #define __FUNCT__ "MatDuplicate"
2526 /*@C
2527    MatDuplicate - Duplicates a matrix including the non-zero structure.
2528 
2529    Collective on Mat
2530 
2531    Input Parameters:
2532 +  mat - the matrix
2533 -  op - either MAT_DO_NOT_COPY_VALUES or MAT_COPY_VALUES, cause it to copy nonzero
2534         values as well or not
2535 
2536    Output Parameter:
2537 .  M - pointer to place new matrix
2538 
2539    Level: intermediate
2540 
2541    Concepts: matrices^duplicating
2542 
2543 .seealso: MatCopy(), MatConvert()
2544 @*/
2545 int MatDuplicate(Mat mat,MatDuplicateOption op,Mat *M)
2546 {
2547   int ierr;
2548 
2549   PetscFunctionBegin;
2550   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2551   PetscValidType(mat);
2552   MatPreallocated(mat);
2553   PetscValidPointer(M);
2554   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2555   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2556 
2557   *M  = 0;
2558   ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2559   if (!mat->ops->duplicate) {
2560     SETERRQ(PETSC_ERR_SUP,"Not written for this matrix type");
2561   }
2562   ierr = (*mat->ops->duplicate)(mat,op,M);CHKERRQ(ierr);
2563   if (mat->mapping) {
2564     ierr = MatSetLocalToGlobalMapping(*M,mat->mapping);CHKERRQ(ierr);
2565   }
2566   if (mat->bmapping) {
2567     ierr = MatSetLocalToGlobalMappingBlock(*M,mat->mapping);CHKERRQ(ierr);
2568   }
2569   ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr);
2570   PetscFunctionReturn(0);
2571 }
2572 
2573 #undef __FUNCT__
2574 #define __FUNCT__ "MatGetDiagonal"
2575 /*@
2576    MatGetDiagonal - Gets the diagonal of a matrix.
2577 
2578    Collective on Mat and Vec
2579 
2580    Input Parameters:
2581 +  mat - the matrix
2582 -  v - the vector for storing the diagonal
2583 
2584    Output Parameter:
2585 .  v - the diagonal of the matrix
2586 
2587    Notes:
2588    For the SeqAIJ matrix format, this routine may also be called
2589    on a LU factored matrix; in that case it routines the reciprocal of
2590    the diagonal entries in U. It returns the entries permuted by the
2591    row and column permutation used during the symbolic factorization.
2592 
2593    Level: intermediate
2594 
2595    Concepts: matrices^accessing diagonals
2596 
2597 .seealso: MatGetRow(), MatGetSubmatrices(), MatGetSubmatrix(), MatGetRowMax()
2598 @*/
2599 int MatGetDiagonal(Mat mat,Vec v)
2600 {
2601   int ierr;
2602 
2603   PetscFunctionBegin;
2604   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2605   PetscValidType(mat);
2606   MatPreallocated(mat);
2607   PetscValidHeaderSpecific(v,VEC_COOKIE);
2608   /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */
2609   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2610   if (!mat->ops->getdiagonal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2611 
2612   ierr = (*mat->ops->getdiagonal)(mat,v);CHKERRQ(ierr);
2613   PetscFunctionReturn(0);
2614 }
2615 
2616 #undef __FUNCT__
2617 #define __FUNCT__ "MatGetRowMax"
2618 /*@
2619    MatGetRowMax - Gets the maximum value (in absolute value) of each
2620         row of the matrix
2621 
2622    Collective on Mat and Vec
2623 
2624    Input Parameters:
2625 .  mat - the matrix
2626 
2627    Output Parameter:
2628 .  v - the vector for storing the maximums
2629 
2630    Level: intermediate
2631 
2632    Concepts: matrices^getting row maximums
2633 
2634 .seealso: MatGetDiagonal(), MatGetSubmatrices(), MatGetSubmatrix()
2635 @*/
2636 int MatGetRowMax(Mat mat,Vec v)
2637 {
2638   int ierr;
2639 
2640   PetscFunctionBegin;
2641   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2642   PetscValidType(mat);
2643   MatPreallocated(mat);
2644   PetscValidHeaderSpecific(v,VEC_COOKIE);
2645   /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */
2646   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2647   if (!mat->ops->getrowmax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2648 
2649   ierr = (*mat->ops->getrowmax)(mat,v);CHKERRQ(ierr);
2650   PetscFunctionReturn(0);
2651 }
2652 
2653 #undef __FUNCT__
2654 #define __FUNCT__ "MatTranspose"
2655 /*@C
2656    MatTranspose - Computes an in-place or out-of-place transpose of a matrix.
2657 
2658    Collective on Mat
2659 
2660    Input Parameter:
2661 .  mat - the matrix to transpose
2662 
2663    Output Parameters:
2664 .  B - the transpose (or pass in PETSC_NULL for an in-place transpose)
2665 
2666    Level: intermediate
2667 
2668    Concepts: matrices^transposing
2669 
2670 .seealso: MatMultTranspose(), MatMultTransposeAdd()
2671 @*/
2672 int MatTranspose(Mat mat,Mat *B)
2673 {
2674   int ierr;
2675 
2676   PetscFunctionBegin;
2677   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2678   PetscValidType(mat);
2679   MatPreallocated(mat);
2680   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2681   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2682   if (!mat->ops->transpose) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2683 
2684   ierr = PetscLogEventBegin(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr);
2685   ierr = (*mat->ops->transpose)(mat,B);CHKERRQ(ierr);
2686   ierr = PetscLogEventEnd(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr);
2687   PetscFunctionReturn(0);
2688 }
2689 
2690 #undef __FUNCT__
2691 #define __FUNCT__ "MatPermute"
2692 /*@C
2693    MatPermute - Creates a new matrix with rows and columns permuted from the
2694    original.
2695 
2696    Collective on Mat
2697 
2698    Input Parameters:
2699 +  mat - the matrix to permute
2700 .  row - row permutation, each processor supplies only the permutation for its rows
2701 -  col - column permutation, each processor needs the entire column permutation, that is
2702          this is the same size as the total number of columns in the matrix
2703 
2704    Output Parameters:
2705 .  B - the permuted matrix
2706 
2707    Level: advanced
2708 
2709    Concepts: matrices^permuting
2710 
2711 .seealso: MatGetOrdering()
2712 @*/
2713 int MatPermute(Mat mat,IS row,IS col,Mat *B)
2714 {
2715   int ierr;
2716 
2717   PetscFunctionBegin;
2718   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2719   PetscValidType(mat);
2720   MatPreallocated(mat);
2721   PetscValidHeaderSpecific(row,IS_COOKIE);
2722   PetscValidHeaderSpecific(col,IS_COOKIE);
2723   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2724   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2725   if (!mat->ops->permute) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2726   ierr = (*mat->ops->permute)(mat,row,col,B);CHKERRQ(ierr);
2727   PetscFunctionReturn(0);
2728 }
2729 
2730 #undef __FUNCT__
2731 #define __FUNCT__ "MatPermuteSparsify"
2732 /*@C
2733   MatPermuteSparsify - Creates a new matrix with rows and columns permuted from the
2734   original and sparsified to the prescribed tolerance.
2735 
2736   Collective on Mat
2737 
2738   Input Parameters:
2739 + A    - The matrix to permute
2740 . band - The half-bandwidth of the sparsified matrix, or PETSC_DECIDE
2741 . frac - The half-bandwidth as a fraction of the total size, or 0.0
2742 . tol  - The drop tolerance
2743 . rowp - The row permutation
2744 - colp - The column permutation
2745 
2746   Output Parameter:
2747 . B    - The permuted, sparsified matrix
2748 
2749   Level: advanced
2750 
2751   Note:
2752   The default behavior (band = PETSC_DECIDE and frac = 0.0) is to
2753   restrict the half-bandwidth of the resulting matrix to 5% of the
2754   total matrix size.
2755 
2756 .keywords: matrix, permute, sparsify
2757 
2758 .seealso: MatGetOrdering(), MatPermute()
2759 @*/
2760 int MatPermuteSparsify(Mat A, int band, PetscReal frac, PetscReal tol, IS rowp, IS colp, Mat *B)
2761 {
2762   IS           irowp, icolp;
2763   int         *rows, *cols;
2764   int          M, N, locRowStart, locRowEnd;
2765   int          nz, newNz;
2766   int         *cwork, *cnew;
2767   PetscScalar *vwork, *vnew;
2768   int          bw, size;
2769   int          row, locRow, newRow, col, newCol;
2770   int          ierr;
2771 
2772   PetscFunctionBegin;
2773   PetscValidHeaderSpecific(A,    MAT_COOKIE);
2774   PetscValidHeaderSpecific(rowp, IS_COOKIE);
2775   PetscValidHeaderSpecific(colp, IS_COOKIE);
2776   if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for unassembled matrix");
2777   if (A->factor)     SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for factored matrix");
2778   if (!A->ops->permutesparsify) {
2779     ierr = MatGetSize(A, &M, &N);                                                                         CHKERRQ(ierr);
2780     ierr = MatGetOwnershipRange(A, &locRowStart, &locRowEnd);                                             CHKERRQ(ierr);
2781     ierr = ISGetSize(rowp, &size);                                                                        CHKERRQ(ierr);
2782     if (size != M) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for row permutation, should be %d", size, M);
2783     ierr = ISGetSize(colp, &size);                                                                        CHKERRQ(ierr);
2784     if (size != N) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for column permutation, should be %d", size, N);
2785     ierr = ISInvertPermutation(rowp, 0, &irowp);                                                          CHKERRQ(ierr);
2786     ierr = ISGetIndices(irowp, &rows);                                                                    CHKERRQ(ierr);
2787     ierr = ISInvertPermutation(colp, 0, &icolp);                                                          CHKERRQ(ierr);
2788     ierr = ISGetIndices(icolp, &cols);                                                                    CHKERRQ(ierr);
2789     ierr = PetscMalloc(N * sizeof(int),         &cnew);                                                   CHKERRQ(ierr);
2790     ierr = PetscMalloc(N * sizeof(PetscScalar), &vnew);                                                   CHKERRQ(ierr);
2791 
2792     /* Setup bandwidth to include */
2793     if (band == PETSC_DECIDE) {
2794       if (frac <= 0.0)
2795         bw = (int) (M * 0.05);
2796       else
2797         bw = (int) (M * frac);
2798     } else {
2799       if (band <= 0) SETERRQ(PETSC_ERR_ARG_WRONG, "Bandwidth must be a positive integer");
2800       bw = band;
2801     }
2802 
2803     /* Put values into new matrix */
2804     ierr = MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B);                                                    CHKERRQ(ierr);
2805     for(row = locRowStart, locRow = 0; row < locRowEnd; row++, locRow++) {
2806       ierr = MatGetRow(A, row, &nz, &cwork, &vwork);                                                      CHKERRQ(ierr);
2807       newRow   = rows[locRow]+locRowStart;
2808       for(col = 0, newNz = 0; col < nz; col++) {
2809         newCol = cols[cwork[col]];
2810         if ((newCol >= newRow - bw) && (newCol < newRow + bw) && (PetscAbsScalar(vwork[col]) >= tol)) {
2811           cnew[newNz] = newCol;
2812           vnew[newNz] = vwork[col];
2813           newNz++;
2814         }
2815       }
2816       ierr = MatSetValues(*B, 1, &newRow, newNz, cnew, vnew, INSERT_VALUES);                              CHKERRQ(ierr);
2817       ierr = MatRestoreRow(A, row, &nz, &cwork, &vwork);                                                  CHKERRQ(ierr);
2818     }
2819     ierr = PetscFree(cnew);                                                                               CHKERRQ(ierr);
2820     ierr = PetscFree(vnew);                                                                               CHKERRQ(ierr);
2821     ierr = MatAssemblyBegin(*B, MAT_FINAL_ASSEMBLY);                                                      CHKERRQ(ierr);
2822     ierr = MatAssemblyEnd(*B, MAT_FINAL_ASSEMBLY);                                                        CHKERRQ(ierr);
2823     ierr = ISRestoreIndices(irowp, &rows);                                                                CHKERRQ(ierr);
2824     ierr = ISRestoreIndices(icolp, &cols);                                                                CHKERRQ(ierr);
2825     ierr = ISDestroy(irowp);                                                                              CHKERRQ(ierr);
2826     ierr = ISDestroy(icolp);                                                                              CHKERRQ(ierr);
2827   } else {
2828     ierr = (*A->ops->permutesparsify)(A, band, frac, tol, rowp, colp, B);                                 CHKERRQ(ierr);
2829   }
2830   PetscFunctionReturn(0);
2831 }
2832 
2833 #undef __FUNCT__
2834 #define __FUNCT__ "MatEqual"
2835 /*@
2836    MatEqual - Compares two matrices.
2837 
2838    Collective on Mat
2839 
2840    Input Parameters:
2841 +  A - the first matrix
2842 -  B - the second matrix
2843 
2844    Output Parameter:
2845 .  flg - PETSC_TRUE if the matrices are equal; PETSC_FALSE otherwise.
2846 
2847    Level: intermediate
2848 
2849    Concepts: matrices^equality between
2850 @*/
2851 int MatEqual(Mat A,Mat B,PetscTruth *flg)
2852 {
2853   int ierr;
2854 
2855   PetscFunctionBegin;
2856   PetscValidHeaderSpecific(A,MAT_COOKIE);
2857   PetscValidHeaderSpecific(B,MAT_COOKIE);
2858   PetscValidType(A);
2859   MatPreallocated(A);
2860   PetscValidType(B);
2861   MatPreallocated(B);
2862   PetscValidIntPointer(flg);
2863   PetscCheckSameComm(A,B);
2864   if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2865   if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2866   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);
2867   if (!A->ops->equal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",A->type_name);
2868   ierr = (*A->ops->equal)(A,B,flg);CHKERRQ(ierr);
2869   PetscFunctionReturn(0);
2870 }
2871 
2872 #undef __FUNCT__
2873 #define __FUNCT__ "MatDiagonalScale"
2874 /*@
2875    MatDiagonalScale - Scales a matrix on the left and right by diagonal
2876    matrices that are stored as vectors.  Either of the two scaling
2877    matrices can be PETSC_NULL.
2878 
2879    Collective on Mat
2880 
2881    Input Parameters:
2882 +  mat - the matrix to be scaled
2883 .  l - the left scaling vector (or PETSC_NULL)
2884 -  r - the right scaling vector (or PETSC_NULL)
2885 
2886    Notes:
2887    MatDiagonalScale() computes A = LAR, where
2888    L = a diagonal matrix, R = a diagonal matrix
2889 
2890    Level: intermediate
2891 
2892    Concepts: matrices^diagonal scaling
2893    Concepts: diagonal scaling of matrices
2894 
2895 .seealso: MatScale()
2896 @*/
2897 int MatDiagonalScale(Mat mat,Vec l,Vec r)
2898 {
2899   int ierr;
2900 
2901   PetscFunctionBegin;
2902   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2903   PetscValidType(mat);
2904   MatPreallocated(mat);
2905   if (!mat->ops->diagonalscale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2906   if (l) {PetscValidHeaderSpecific(l,VEC_COOKIE);PetscCheckSameComm(mat,l);}
2907   if (r) {PetscValidHeaderSpecific(r,VEC_COOKIE);PetscCheckSameComm(mat,r);}
2908   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2909   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2910 
2911   ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2912   ierr = (*mat->ops->diagonalscale)(mat,l,r);CHKERRQ(ierr);
2913   ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2914   PetscFunctionReturn(0);
2915 }
2916 
2917 #undef __FUNCT__
2918 #define __FUNCT__ "MatScale"
2919 /*@
2920     MatScale - Scales all elements of a matrix by a given number.
2921 
2922     Collective on Mat
2923 
2924     Input Parameters:
2925 +   mat - the matrix to be scaled
2926 -   a  - the scaling value
2927 
2928     Output Parameter:
2929 .   mat - the scaled matrix
2930 
2931     Level: intermediate
2932 
2933     Concepts: matrices^scaling all entries
2934 
2935 .seealso: MatDiagonalScale()
2936 @*/
2937 int MatScale(PetscScalar *a,Mat mat)
2938 {
2939   int ierr;
2940 
2941   PetscFunctionBegin;
2942   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2943   PetscValidType(mat);
2944   MatPreallocated(mat);
2945   PetscValidScalarPointer(a);
2946   if (!mat->ops->scale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2947   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2948   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2949 
2950   ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2951   ierr = (*mat->ops->scale)(a,mat);CHKERRQ(ierr);
2952   ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
2953   PetscFunctionReturn(0);
2954 }
2955 
2956 #undef __FUNCT__
2957 #define __FUNCT__ "MatNorm"
2958 /*@
2959    MatNorm - Calculates various norms of a matrix.
2960 
2961    Collective on Mat
2962 
2963    Input Parameters:
2964 +  mat - the matrix
2965 -  type - the type of norm, NORM_1, NORM_FROBENIUS, NORM_INFINITY
2966 
2967    Output Parameters:
2968 .  nrm - the resulting norm
2969 
2970    Level: intermediate
2971 
2972    Concepts: matrices^norm
2973    Concepts: norm^of matrix
2974 @*/
2975 int MatNorm(Mat mat,NormType type,PetscReal *nrm)
2976 {
2977   int ierr;
2978 
2979   PetscFunctionBegin;
2980   PetscValidHeaderSpecific(mat,MAT_COOKIE);
2981   PetscValidType(mat);
2982   MatPreallocated(mat);
2983   PetscValidScalarPointer(nrm);
2984 
2985   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
2986   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2987   if (!mat->ops->norm) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
2988   ierr = (*mat->ops->norm)(mat,type,nrm);CHKERRQ(ierr);
2989   PetscFunctionReturn(0);
2990 }
2991 
2992 /*
2993      This variable is used to prevent counting of MatAssemblyBegin() that
2994    are called from within a MatAssemblyEnd().
2995 */
2996 static int MatAssemblyEnd_InUse = 0;
2997 #undef __FUNCT__
2998 #define __FUNCT__ "MatAssemblyBegin"
2999 /*@
3000    MatAssemblyBegin - Begins assembling the matrix.  This routine should
3001    be called after completing all calls to MatSetValues().
3002 
3003    Collective on Mat
3004 
3005    Input Parameters:
3006 +  mat - the matrix
3007 -  type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY
3008 
3009    Notes:
3010    MatSetValues() generally caches the values.  The matrix is ready to
3011    use only after MatAssemblyBegin() and MatAssemblyEnd() have been called.
3012    Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES
3013    in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before
3014    using the matrix.
3015 
3016    Level: beginner
3017 
3018    Concepts: matrices^assembling
3019 
3020 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssembled()
3021 @*/
3022 int MatAssemblyBegin(Mat mat,MatAssemblyType type)
3023 {
3024   int ierr;
3025 
3026   PetscFunctionBegin;
3027   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3028   PetscValidType(mat);
3029   MatPreallocated(mat);
3030   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix.\nDid you forget to call MatSetUnfactored()?");
3031   if (mat->assembled) {
3032     mat->was_assembled = PETSC_TRUE;
3033     mat->assembled     = PETSC_FALSE;
3034   }
3035   if (!MatAssemblyEnd_InUse) {
3036     ierr = PetscLogEventBegin(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr);
3037     if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);}
3038     ierr = PetscLogEventEnd(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr);
3039   } else {
3040     if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);}
3041   }
3042   PetscFunctionReturn(0);
3043 }
3044 
3045 #undef __FUNCT__
3046 #define __FUNCT__ "MatAssembed"
3047 /*@
3048    MatAssembled - Indicates if a matrix has been assembled and is ready for
3049      use; for example, in matrix-vector product.
3050 
3051    Collective on Mat
3052 
3053    Input Parameter:
3054 .  mat - the matrix
3055 
3056    Output Parameter:
3057 .  assembled - PETSC_TRUE or PETSC_FALSE
3058 
3059    Level: advanced
3060 
3061    Concepts: matrices^assembled?
3062 
3063 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssemblyBegin()
3064 @*/
3065 int MatAssembled(Mat mat,PetscTruth *assembled)
3066 {
3067   PetscFunctionBegin;
3068   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3069   PetscValidType(mat);
3070   MatPreallocated(mat);
3071   *assembled = mat->assembled;
3072   PetscFunctionReturn(0);
3073 }
3074 
3075 #undef __FUNCT__
3076 #define __FUNCT__ "MatView_Private"
3077 /*
3078     Processes command line options to determine if/how a matrix
3079   is to be viewed. Called by MatAssemblyEnd() and MatLoad().
3080 */
3081 int MatView_Private(Mat mat)
3082 {
3083   int               ierr;
3084   PetscTruth        flg;
3085   static PetscTruth incall = PETSC_FALSE;
3086 
3087   PetscFunctionBegin;
3088   if (incall) PetscFunctionReturn(0);
3089   incall = PETSC_TRUE;
3090   ierr = PetscOptionsBegin(mat->comm,mat->prefix,"Matrix Options","Mat");CHKERRQ(ierr);
3091     ierr = PetscOptionsName("-mat_view_info","Information on matrix size","MatView",&flg);CHKERRQ(ierr);
3092     if (flg) {
3093       ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO);CHKERRQ(ierr);
3094       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3095       ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3096     }
3097     ierr = PetscOptionsName("-mat_view_info_detailed","Nonzeros in the matrix","MatView",&flg);CHKERRQ(ierr);
3098     if (flg) {
3099       ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO_DETAIL);CHKERRQ(ierr);
3100       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3101       ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3102     }
3103     ierr = PetscOptionsName("-mat_view","Print matrix to stdout","MatView",&flg);CHKERRQ(ierr);
3104     if (flg) {
3105       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3106     }
3107     ierr = PetscOptionsName("-mat_view_matlab","Print matrix to stdout in a format Matlab can read","MatView",&flg);CHKERRQ(ierr);
3108     if (flg) {
3109       ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr);
3110       ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3111       ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr);
3112     }
3113     ierr = PetscOptionsName("-mat_view_socket","Send matrix to socket (can be read from matlab)","MatView",&flg);CHKERRQ(ierr);
3114     if (flg) {
3115       ierr = MatView(mat,PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr);
3116       ierr = PetscViewerFlush(PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr);
3117     }
3118     ierr = PetscOptionsName("-mat_view_binary","Save matrix to file in binary format","MatView",&flg);CHKERRQ(ierr);
3119     if (flg) {
3120       ierr = MatView(mat,PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr);
3121       ierr = PetscViewerFlush(PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr);
3122     }
3123   ierr = PetscOptionsEnd();CHKERRQ(ierr);
3124   /* cannot have inside PetscOptionsBegin() because uses PetscOptionsBegin() */
3125   ierr = PetscOptionsHasName(mat->prefix,"-mat_view_draw",&flg);CHKERRQ(ierr);
3126   if (flg) {
3127     ierr = PetscOptionsHasName(mat->prefix,"-mat_view_contour",&flg);CHKERRQ(ierr);
3128     if (flg) {
3129       PetscViewerPushFormat(PETSC_VIEWER_DRAW_(mat->comm),PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr);
3130     }
3131     ierr = MatView(mat,PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr);
3132     ierr = PetscViewerFlush(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr);
3133     if (flg) {
3134       PetscViewerPopFormat(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr);
3135     }
3136   }
3137   incall = PETSC_FALSE;
3138   PetscFunctionReturn(0);
3139 }
3140 
3141 #undef __FUNCT__
3142 #define __FUNCT__ "MatAssemblyEnd"
3143 /*@
3144    MatAssemblyEnd - Completes assembling the matrix.  This routine should
3145    be called after MatAssemblyBegin().
3146 
3147    Collective on Mat
3148 
3149    Input Parameters:
3150 +  mat - the matrix
3151 -  type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY
3152 
3153    Options Database Keys:
3154 +  -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly()
3155 .  -mat_view_info_detailed - Prints more detailed info
3156 .  -mat_view - Prints matrix in ASCII format
3157 .  -mat_view_matlab - Prints matrix in Matlab format
3158 .  -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX().
3159 .  -display <name> - Sets display name (default is host)
3160 .  -draw_pause <sec> - Sets number of seconds to pause after display
3161 .  -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual)
3162 .  -viewer_socket_machine <machine>
3163 .  -viewer_socket_port <port>
3164 .  -mat_view_binary - save matrix to file in binary format
3165 -  -viewer_binary_filename <name>
3166 
3167    Notes:
3168    MatSetValues() generally caches the values.  The matrix is ready to
3169    use only after MatAssemblyBegin() and MatAssemblyEnd() have been called.
3170    Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES
3171    in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before
3172    using the matrix.
3173 
3174    Level: beginner
3175 
3176 .seealso: MatAssemblyBegin(), MatSetValues(), PetscDrawOpenX(), MatView(), MatAssembled(), PetscViewerSocketOpen()
3177 @*/
3178 int MatAssemblyEnd(Mat mat,MatAssemblyType type)
3179 {
3180   int        ierr;
3181   static int inassm = 0;
3182   PetscTruth flg;
3183 
3184   PetscFunctionBegin;
3185   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3186   PetscValidType(mat);
3187   MatPreallocated(mat);
3188 
3189   inassm++;
3190   MatAssemblyEnd_InUse++;
3191   if (MatAssemblyEnd_InUse == 1) { /* Do the logging only the first time through */
3192     ierr = PetscLogEventBegin(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr);
3193     if (mat->ops->assemblyend) {
3194       ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr);
3195     }
3196     ierr = PetscLogEventEnd(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr);
3197   } else {
3198     if (mat->ops->assemblyend) {
3199       ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr);
3200     }
3201   }
3202 
3203   /* Flush assembly is not a true assembly */
3204   if (type != MAT_FLUSH_ASSEMBLY) {
3205     mat->assembled  = PETSC_TRUE; mat->num_ass++;
3206   }
3207   mat->insertmode = NOT_SET_VALUES;
3208   MatAssemblyEnd_InUse--;
3209 
3210   if (inassm == 1 && type != MAT_FLUSH_ASSEMBLY) {
3211     ierr = MatView_Private(mat);CHKERRQ(ierr);
3212   }
3213   inassm--;
3214   ierr = PetscOptionsHasName(mat->prefix,"-help",&flg);CHKERRQ(ierr);
3215   if (flg) {
3216     ierr = MatPrintHelp(mat);CHKERRQ(ierr);
3217   }
3218   PetscFunctionReturn(0);
3219 }
3220 
3221 
3222 #undef __FUNCT__
3223 #define __FUNCT__ "MatCompress"
3224 /*@
3225    MatCompress - Tries to store the matrix in as little space as
3226    possible.  May fail if memory is already fully used, since it
3227    tries to allocate new space.
3228 
3229    Collective on Mat
3230 
3231    Input Parameters:
3232 .  mat - the matrix
3233 
3234    Level: advanced
3235 
3236 @*/
3237 int MatCompress(Mat mat)
3238 {
3239   int ierr;
3240 
3241   PetscFunctionBegin;
3242   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3243   PetscValidType(mat);
3244   MatPreallocated(mat);
3245   if (mat->ops->compress) {ierr = (*mat->ops->compress)(mat);CHKERRQ(ierr);}
3246   PetscFunctionReturn(0);
3247 }
3248 
3249 #undef __FUNCT__
3250 #define __FUNCT__ "MatSetOption"
3251 /*@
3252    MatSetOption - Sets a parameter option for a matrix. Some options
3253    may be specific to certain storage formats.  Some options
3254    determine how values will be inserted (or added). Sorted,
3255    row-oriented input will generally assemble the fastest. The default
3256    is row-oriented, nonsorted input.
3257 
3258    Collective on Mat
3259 
3260    Input Parameters:
3261 +  mat - the matrix
3262 -  option - the option, one of those listed below (and possibly others),
3263              e.g., MAT_ROWS_SORTED, MAT_NEW_NONZERO_LOCATION_ERR
3264 
3265    Options Describing Matrix Structure:
3266 +    MAT_SYMMETRIC - symmetric in terms of both structure and value
3267 -    MAT_STRUCTURALLY_SYMMETRIC - symmetric nonzero structure
3268 
3269    Options For Use with MatSetValues():
3270    Insert a logically dense subblock, which can be
3271 +    MAT_ROW_ORIENTED - row-oriented (default)
3272 .    MAT_COLUMN_ORIENTED - column-oriented
3273 .    MAT_ROWS_SORTED - sorted by row
3274 .    MAT_ROWS_UNSORTED - not sorted by row (default)
3275 .    MAT_COLUMNS_SORTED - sorted by column
3276 -    MAT_COLUMNS_UNSORTED - not sorted by column (default)
3277 
3278    Not these options reflect the data you pass in with MatSetValues(); it has
3279    nothing to do with how the data is stored internally in the matrix
3280    data structure.
3281 
3282    When (re)assembling a matrix, we can restrict the input for
3283    efficiency/debugging purposes.  These options include
3284 +    MAT_NO_NEW_NONZERO_LOCATIONS - additional insertions will not be
3285         allowed if they generate a new nonzero
3286 .    MAT_YES_NEW_NONZERO_LOCATIONS - additional insertions will be allowed
3287 .    MAT_NO_NEW_DIAGONALS - additional insertions will not be allowed if
3288          they generate a nonzero in a new diagonal (for block diagonal format only)
3289 .    MAT_YES_NEW_DIAGONALS - new diagonals will be allowed (for block diagonal format only)
3290 .    MAT_IGNORE_OFF_PROC_ENTRIES - drops off-processor entries
3291 .    MAT_NEW_NONZERO_LOCATION_ERR - generates an error for new matrix entry
3292 -    MAT_USE_HASH_TABLE - uses a hash table to speed up matrix assembly
3293 
3294    Notes:
3295    Some options are relevant only for particular matrix types and
3296    are thus ignored by others.  Other options are not supported by
3297    certain matrix types and will generate an error message if set.
3298 
3299    If using a Fortran 77 module to compute a matrix, one may need to
3300    use the column-oriented option (or convert to the row-oriented
3301    format).
3302 
3303    MAT_NO_NEW_NONZERO_LOCATIONS indicates that any add or insertion
3304    that would generate a new entry in the nonzero structure is instead
3305    ignored.  Thus, if memory has not alredy been allocated for this particular
3306    data, then the insertion is ignored. For dense matrices, in which
3307    the entire array is allocated, no entries are ever ignored.
3308    Set after the first MatAssemblyEnd()
3309 
3310    MAT_NEW_NONZERO_LOCATION_ERR indicates that any add or insertion
3311    that would generate a new entry in the nonzero structure instead produces
3312    an error. (Currently supported for AIJ and BAIJ formats only.)
3313    This is a useful flag when using SAME_NONZERO_PATTERN in calling
3314    SLESSetOperators() to ensure that the nonzero pattern truely does
3315    remain unchanged. Set after the first MatAssemblyEnd()
3316 
3317    MAT_NEW_NONZERO_ALLOCATION_ERR indicates that any add or insertion
3318    that would generate a new entry that has not been preallocated will
3319    instead produce an error. (Currently supported for AIJ and BAIJ formats
3320    only.) This is a useful flag when debugging matrix memory preallocation.
3321 
3322    MAT_IGNORE_OFF_PROC_ENTRIES indicates entries destined for
3323    other processors should be dropped, rather than stashed.
3324    This is useful if you know that the "owning" processor is also
3325    always generating the correct matrix entries, so that PETSc need
3326    not transfer duplicate entries generated on another processor.
3327 
3328    MAT_USE_HASH_TABLE indicates that a hash table be used to improve the
3329    searches during matrix assembly. When this flag is set, the hash table
3330    is created during the first Matrix Assembly. This hash table is
3331    used the next time through, during MatSetVaules()/MatSetVaulesBlocked()
3332    to improve the searching of indices. MAT_NO_NEW_NONZERO_LOCATIONS flag
3333    should be used with MAT_USE_HASH_TABLE flag. This option is currently
3334    supported by MATMPIBAIJ format only.
3335 
3336    MAT_KEEP_ZEROED_ROWS indicates when MatZeroRows() is called the zeroed entries
3337    are kept in the nonzero structure
3338 
3339    MAT_IGNORE_ZERO_ENTRIES - when using ADD_VALUES for AIJ matrices this will stop
3340    zero values from creating a zero location in the matrix
3341 
3342    MAT_USE_INODES - indicates using inode version of the code - works with AIJ and
3343    ROWBS matrix types
3344 
3345    MAT_DO_NOT_USE_INODES - indicates not using inode version of the code - works
3346    with AIJ and ROWBS matrix types
3347 
3348    Level: intermediate
3349 
3350    Concepts: matrices^setting options
3351 
3352 @*/
3353 int MatSetOption(Mat mat,MatOption op)
3354 {
3355   int ierr;
3356 
3357   PetscFunctionBegin;
3358   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3359   PetscValidType(mat);
3360   MatPreallocated(mat);
3361   switch (op) {
3362   case MAT_SYMMETRIC:
3363     mat->symmetric              = PETSC_TRUE;
3364     mat->structurally_symmetric = PETSC_TRUE;
3365     break;
3366   case MAT_STRUCTURALLY_SYMMETRIC:
3367     mat->structurally_symmetric = PETSC_TRUE;
3368     break;
3369   default:
3370     if (mat->ops->setoption) {ierr = (*mat->ops->setoption)(mat,op);CHKERRQ(ierr);}
3371     break;
3372   }
3373   PetscFunctionReturn(0);
3374 }
3375 
3376 #undef __FUNCT__
3377 #define __FUNCT__ "MatZeroEntries"
3378 /*@
3379    MatZeroEntries - Zeros all entries of a matrix.  For sparse matrices
3380    this routine retains the old nonzero structure.
3381 
3382    Collective on Mat
3383 
3384    Input Parameters:
3385 .  mat - the matrix
3386 
3387    Level: intermediate
3388 
3389    Concepts: matrices^zeroing
3390 
3391 .seealso: MatZeroRows()
3392 @*/
3393 int MatZeroEntries(Mat mat)
3394 {
3395   int ierr;
3396 
3397   PetscFunctionBegin;
3398   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3399   PetscValidType(mat);
3400   MatPreallocated(mat);
3401   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3402   if (!mat->ops->zeroentries) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3403 
3404   ierr = PetscLogEventBegin(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr);
3405   ierr = (*mat->ops->zeroentries)(mat);CHKERRQ(ierr);
3406   ierr = PetscLogEventEnd(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr);
3407   PetscFunctionReturn(0);
3408 }
3409 
3410 #undef __FUNCT__
3411 #define __FUNCT__ "MatZeroRows"
3412 /*@C
3413    MatZeroRows - Zeros all entries (except possibly the main diagonal)
3414    of a set of rows of a matrix.
3415 
3416    Collective on Mat
3417 
3418    Input Parameters:
3419 +  mat - the matrix
3420 .  is - index set of rows to remove
3421 -  diag - pointer to value put in all diagonals of eliminated rows.
3422           Note that diag is not a pointer to an array, but merely a
3423           pointer to a single value.
3424 
3425    Notes:
3426    For the AIJ and BAIJ matrix formats this removes the old nonzero structure,
3427    but does not release memory.  For the dense and block diagonal
3428    formats this does not alter the nonzero structure.
3429 
3430    If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure
3431    of the matrix is not changed (even for AIJ and BAIJ matrices) the values are
3432    merely zeroed.
3433 
3434    The user can set a value in the diagonal entry (or for the AIJ and
3435    row formats can optionally remove the main diagonal entry from the
3436    nonzero structure as well, by passing a null pointer (PETSC_NULL
3437    in C or PETSC_NULL_SCALAR in Fortran) as the final argument).
3438 
3439    For the parallel case, all processes that share the matrix (i.e.,
3440    those in the communicator used for matrix creation) MUST call this
3441    routine, regardless of whether any rows being zeroed are owned by
3442    them.
3443 
3444    For the SBAIJ matrix (since only the upper triangular half of the matrix
3445    is stored) the effect of this call is to also zero the corresponding
3446    column.
3447 
3448    Level: intermediate
3449 
3450    Concepts: matrices^zeroing rows
3451 
3452 .seealso: MatZeroEntries(), MatZeroRowsLocal(), MatSetOption()
3453 @*/
3454 int MatZeroRows(Mat mat,IS is,PetscScalar *diag)
3455 {
3456   int ierr;
3457 
3458   PetscFunctionBegin;
3459   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3460   PetscValidType(mat);
3461   MatPreallocated(mat);
3462   PetscValidHeaderSpecific(is,IS_COOKIE);
3463   if (diag) PetscValidScalarPointer(diag);
3464   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3465   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3466   if (!mat->ops->zerorows) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3467 
3468   ierr = (*mat->ops->zerorows)(mat,is,diag);CHKERRQ(ierr);
3469   ierr = MatView_Private(mat);CHKERRQ(ierr);
3470   PetscFunctionReturn(0);
3471 }
3472 
3473 #undef __FUNCT__
3474 #define __FUNCT__ "MatZeroRowsLocal"
3475 /*@C
3476    MatZeroRowsLocal - Zeros all entries (except possibly the main diagonal)
3477    of a set of rows of a matrix; using local numbering of rows.
3478 
3479    Collective on Mat
3480 
3481    Input Parameters:
3482 +  mat - the matrix
3483 .  is - index set of rows to remove
3484 -  diag - pointer to value put in all diagonals of eliminated rows.
3485           Note that diag is not a pointer to an array, but merely a
3486           pointer to a single value.
3487 
3488    Notes:
3489    Before calling MatZeroRowsLocal(), the user must first set the
3490    local-to-global mapping by calling MatSetLocalToGlobalMapping().
3491 
3492    For the AIJ matrix formats this removes the old nonzero structure,
3493    but does not release memory.  For the dense and block diagonal
3494    formats this does not alter the nonzero structure.
3495 
3496    If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure
3497    of the matrix is not changed (even for AIJ and BAIJ matrices) the values are
3498    merely zeroed.
3499 
3500    The user can set a value in the diagonal entry (or for the AIJ and
3501    row formats can optionally remove the main diagonal entry from the
3502    nonzero structure as well, by passing a null pointer (PETSC_NULL
3503    in C or PETSC_NULL_SCALAR in Fortran) as the final argument).
3504 
3505    Level: intermediate
3506 
3507    Concepts: matrices^zeroing
3508 
3509 .seealso: MatZeroEntries(), MatZeroRows(), MatSetLocalToGlobalMapping
3510 @*/
3511 int MatZeroRowsLocal(Mat mat,IS is,PetscScalar *diag)
3512 {
3513   int ierr;
3514   IS  newis;
3515 
3516   PetscFunctionBegin;
3517   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3518   PetscValidType(mat);
3519   MatPreallocated(mat);
3520   PetscValidHeaderSpecific(is,IS_COOKIE);
3521   if (diag) PetscValidScalarPointer(diag);
3522   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3523   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3524 
3525   if (mat->ops->zerorowslocal) {
3526     ierr = (*mat->ops->zerorowslocal)(mat,is,diag);CHKERRQ(ierr);
3527   } else {
3528     if (!mat->mapping) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Need to provide local to global mapping to matrix first");
3529     ierr = ISLocalToGlobalMappingApplyIS(mat->mapping,is,&newis);CHKERRQ(ierr);
3530     ierr = (*mat->ops->zerorows)(mat,newis,diag);CHKERRQ(ierr);
3531     ierr = ISDestroy(newis);CHKERRQ(ierr);
3532   }
3533   PetscFunctionReturn(0);
3534 }
3535 
3536 #undef __FUNCT__
3537 #define __FUNCT__ "MatGetSize"
3538 /*@
3539    MatGetSize - Returns the numbers of rows and columns in a matrix.
3540 
3541    Not Collective
3542 
3543    Input Parameter:
3544 .  mat - the matrix
3545 
3546    Output Parameters:
3547 +  m - the number of global rows
3548 -  n - the number of global columns
3549 
3550    Level: beginner
3551 
3552    Concepts: matrices^size
3553 
3554 .seealso: MatGetLocalSize()
3555 @*/
3556 int MatGetSize(Mat mat,int *m,int* n)
3557 {
3558   PetscFunctionBegin;
3559   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3560   if (m) *m = mat->M;
3561   if (n) *n = mat->N;
3562   PetscFunctionReturn(0);
3563 }
3564 
3565 #undef __FUNCT__
3566 #define __FUNCT__ "MatGetLocalSize"
3567 /*@
3568    MatGetLocalSize - Returns the number of rows and columns in a matrix
3569    stored locally.  This information may be implementation dependent, so
3570    use with care.
3571 
3572    Not Collective
3573 
3574    Input Parameters:
3575 .  mat - the matrix
3576 
3577    Output Parameters:
3578 +  m - the number of local rows
3579 -  n - the number of local columns
3580 
3581    Level: beginner
3582 
3583    Concepts: matrices^local size
3584 
3585 .seealso: MatGetSize()
3586 @*/
3587 int MatGetLocalSize(Mat mat,int *m,int* n)
3588 {
3589   PetscFunctionBegin;
3590   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3591   if (m) *m = mat->m;
3592   if (n) *n = mat->n;
3593   PetscFunctionReturn(0);
3594 }
3595 
3596 #undef __FUNCT__
3597 #define __FUNCT__ "MatGetOwnershipRange"
3598 /*@
3599    MatGetOwnershipRange - Returns the range of matrix rows owned by
3600    this processor, assuming that the matrix is laid out with the first
3601    n1 rows on the first processor, the next n2 rows on the second, etc.
3602    For certain parallel layouts this range may not be well defined.
3603 
3604    Not Collective
3605 
3606    Input Parameters:
3607 .  mat - the matrix
3608 
3609    Output Parameters:
3610 +  m - the global index of the first local row
3611 -  n - one more than the global index of the last local row
3612 
3613    Level: beginner
3614 
3615    Concepts: matrices^row ownership
3616 @*/
3617 int MatGetOwnershipRange(Mat mat,int *m,int* n)
3618 {
3619   int ierr;
3620 
3621   PetscFunctionBegin;
3622   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3623   PetscValidType(mat);
3624   MatPreallocated(mat);
3625   if (m) PetscValidIntPointer(m);
3626   if (n) PetscValidIntPointer(n);
3627   ierr = PetscMapGetLocalRange(mat->rmap,m,n);CHKERRQ(ierr);
3628   PetscFunctionReturn(0);
3629 }
3630 
3631 #undef __FUNCT__
3632 #define __FUNCT__ "MatILUFactorSymbolic"
3633 /*@
3634    MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix.
3635    Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric()
3636    to complete the factorization.
3637 
3638    Collective on Mat
3639 
3640    Input Parameters:
3641 +  mat - the matrix
3642 .  row - row permutation
3643 .  column - column permutation
3644 -  info - structure containing
3645 $      levels - number of levels of fill.
3646 $      expected fill - as ratio of original fill.
3647 $      1 or 0 - indicating force fill on diagonal (improves robustness for matrices
3648                 missing diagonal entries)
3649 
3650    Output Parameters:
3651 .  fact - new matrix that has been symbolically factored
3652 
3653    Notes:
3654    See the users manual for additional information about
3655    choosing the fill factor for better efficiency.
3656 
3657    Most users should employ the simplified SLES interface for linear solvers
3658    instead of working directly with matrix algebra routines such as this.
3659    See, e.g., SLESCreate().
3660 
3661    Level: developer
3662 
3663   Concepts: matrices^symbolic LU factorization
3664   Concepts: matrices^factorization
3665   Concepts: LU^symbolic factorization
3666 
3667 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor()
3668           MatGetOrdering(), MatILUInfo
3669 
3670 @*/
3671 int MatILUFactorSymbolic(Mat mat,IS row,IS col,MatILUInfo *info,Mat *fact)
3672 {
3673   int ierr;
3674 
3675   PetscFunctionBegin;
3676   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3677   PetscValidType(mat);
3678   MatPreallocated(mat);
3679   PetscValidPointer(fact);
3680   PetscValidHeaderSpecific(row,IS_COOKIE);
3681   PetscValidHeaderSpecific(col,IS_COOKIE);
3682   if (info->levels < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Levels of fill negative %d",(int)info->levels);
3683   if (info->fill < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",info->fill);
3684   if (!mat->ops->ilufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s  symbolic ILU",mat->type_name);
3685   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3686   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3687 
3688   ierr = PetscLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr);
3689   ierr = (*mat->ops->ilufactorsymbolic)(mat,row,col,info,fact);CHKERRQ(ierr);
3690   ierr = PetscLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr);
3691   PetscFunctionReturn(0);
3692 }
3693 
3694 #undef __FUNCT__
3695 #define __FUNCT__ "MatICCFactorSymbolic"
3696 /*@
3697    MatICCFactorSymbolic - Performs symbolic incomplete
3698    Cholesky factorization for a symmetric matrix.  Use
3699    MatCholeskyFactorNumeric() to complete the factorization.
3700 
3701    Collective on Mat
3702 
3703    Input Parameters:
3704 +  mat - the matrix
3705 .  perm - row and column permutation
3706 .  fill - levels of fill
3707 -  f - expected fill as ratio of original fill
3708 
3709    Output Parameter:
3710 .  fact - the factored matrix
3711 
3712    Notes:
3713    Currently only no-fill factorization is supported.
3714 
3715    Most users should employ the simplified SLES interface for linear solvers
3716    instead of working directly with matrix algebra routines such as this.
3717    See, e.g., SLESCreate().
3718 
3719    Level: developer
3720 
3721   Concepts: matrices^symbolic incomplete Cholesky factorization
3722   Concepts: matrices^factorization
3723   Concepts: Cholsky^symbolic factorization
3724 
3725 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor()
3726 @*/
3727 int MatICCFactorSymbolic(Mat mat,IS perm,PetscReal f,int fill,Mat *fact)
3728 {
3729   int ierr;
3730 
3731   PetscFunctionBegin;
3732   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3733   PetscValidType(mat);
3734   MatPreallocated(mat);
3735   PetscValidPointer(fact);
3736   PetscValidHeaderSpecific(perm,IS_COOKIE);
3737   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3738   if (fill < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Fill negative %d",fill);
3739   if (f < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",f);
3740   if (!mat->ops->iccfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s  symbolic ICC",mat->type_name);
3741   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3742 
3743   ierr = PetscLogEventBegin(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
3744   ierr = (*mat->ops->iccfactorsymbolic)(mat,perm,f,fill,fact);CHKERRQ(ierr);
3745   ierr = PetscLogEventEnd(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr);
3746   PetscFunctionReturn(0);
3747 }
3748 
3749 #undef __FUNCT__
3750 #define __FUNCT__ "MatGetArray"
3751 /*@C
3752    MatGetArray - Returns a pointer to the element values in the matrix.
3753    The result of this routine is dependent on the underlying matrix data
3754    structure, and may not even work for certain matrix types.  You MUST
3755    call MatRestoreArray() when you no longer need to access the array.
3756 
3757    Not Collective
3758 
3759    Input Parameter:
3760 .  mat - the matrix
3761 
3762    Output Parameter:
3763 .  v - the location of the values
3764 
3765 
3766    Fortran Note:
3767    This routine is used differently from Fortran, e.g.,
3768 .vb
3769         Mat         mat
3770         PetscScalar mat_array(1)
3771         PetscOffset i_mat
3772         int         ierr
3773         call MatGetArray(mat,mat_array,i_mat,ierr)
3774 
3775   C  Access first local entry in matrix; note that array is
3776   C  treated as one dimensional
3777         value = mat_array(i_mat + 1)
3778 
3779         [... other code ...]
3780         call MatRestoreArray(mat,mat_array,i_mat,ierr)
3781 .ve
3782 
3783    See the Fortran chapter of the users manual and
3784    petsc/src/mat/examples/tests for details.
3785 
3786    Level: advanced
3787 
3788    Concepts: matrices^access array
3789 
3790 .seealso: MatRestoreArray(), MatGetArrayF90()
3791 @*/
3792 int MatGetArray(Mat mat,PetscScalar **v)
3793 {
3794   int ierr;
3795 
3796   PetscFunctionBegin;
3797   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3798   PetscValidType(mat);
3799   MatPreallocated(mat);
3800   PetscValidPointer(v);
3801   if (!mat->ops->getarray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3802   ierr = (*mat->ops->getarray)(mat,v);CHKERRQ(ierr);
3803   PetscFunctionReturn(0);
3804 }
3805 
3806 #undef __FUNCT__
3807 #define __FUNCT__ "MatRestoreArray"
3808 /*@C
3809    MatRestoreArray - Restores the matrix after MatGetArray() has been called.
3810 
3811    Not Collective
3812 
3813    Input Parameter:
3814 +  mat - the matrix
3815 -  v - the location of the values
3816 
3817    Fortran Note:
3818    This routine is used differently from Fortran, e.g.,
3819 .vb
3820         Mat         mat
3821         PetscScalar mat_array(1)
3822         PetscOffset i_mat
3823         int         ierr
3824         call MatGetArray(mat,mat_array,i_mat,ierr)
3825 
3826   C  Access first local entry in matrix; note that array is
3827   C  treated as one dimensional
3828         value = mat_array(i_mat + 1)
3829 
3830         [... other code ...]
3831         call MatRestoreArray(mat,mat_array,i_mat,ierr)
3832 .ve
3833 
3834    See the Fortran chapter of the users manual and
3835    petsc/src/mat/examples/tests for details
3836 
3837    Level: advanced
3838 
3839 .seealso: MatGetArray(), MatRestoreArrayF90()
3840 @*/
3841 int MatRestoreArray(Mat mat,PetscScalar **v)
3842 {
3843   int ierr;
3844 
3845   PetscFunctionBegin;
3846   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3847   PetscValidType(mat);
3848   MatPreallocated(mat);
3849   PetscValidPointer(v);
3850   if (!mat->ops->restorearray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3851   ierr = (*mat->ops->restorearray)(mat,v);CHKERRQ(ierr);
3852   PetscFunctionReturn(0);
3853 }
3854 
3855 #undef __FUNCT__
3856 #define __FUNCT__ "MatGetSubMatrices"
3857 /*@C
3858    MatGetSubMatrices - Extracts several submatrices from a matrix. If submat
3859    points to an array of valid matrices, they may be reused to store the new
3860    submatrices.
3861 
3862    Collective on Mat
3863 
3864    Input Parameters:
3865 +  mat - the matrix
3866 .  n   - the number of submatrixes to be extracted (on this processor, may be zero)
3867 .  irow, icol - index sets of rows and columns to extract
3868 -  scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX
3869 
3870    Output Parameter:
3871 .  submat - the array of submatrices
3872 
3873    Notes:
3874    MatGetSubMatrices() can extract only sequential submatrices
3875    (from both sequential and parallel matrices). Use MatGetSubMatrix()
3876    to extract a parallel submatrix.
3877 
3878    When extracting submatrices from a parallel matrix, each processor can
3879    form a different submatrix by setting the rows and columns of its
3880    individual index sets according to the local submatrix desired.
3881 
3882    When finished using the submatrices, the user should destroy
3883    them with MatDestroyMatrices().
3884 
3885    MAT_REUSE_MATRIX can only be used when the nonzero structure of the
3886    original matrix has not changed from that last call to MatGetSubMatrices().
3887 
3888    This routine creates the matrices in submat; you should NOT create them before
3889    calling it. It also allocates the array of matrix pointers submat.
3890 
3891    Fortran Note:
3892    The Fortran interface is slightly different from that given below; it
3893    requires one to pass in  as submat a Mat (integer) array of size at least m.
3894 
3895    Level: advanced
3896 
3897    Concepts: matrices^accessing submatrices
3898    Concepts: submatrices
3899 
3900 .seealso: MatDestroyMatrices(), MatGetSubMatrix(), MatGetRow(), MatGetDiagonal()
3901 @*/
3902 int MatGetSubMatrices(Mat mat,int n,IS *irow,IS *icol,MatReuse scall,Mat **submat)
3903 {
3904   int        ierr;
3905 
3906   PetscFunctionBegin;
3907   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3908   PetscValidType(mat);
3909   MatPreallocated(mat);
3910   if (!mat->ops->getsubmatrices) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3911   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3912 
3913   ierr = PetscLogEventBegin(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr);
3914   ierr = (*mat->ops->getsubmatrices)(mat,n,irow,icol,scall,submat);CHKERRQ(ierr);
3915   ierr = PetscLogEventEnd(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr);
3916   PetscFunctionReturn(0);
3917 }
3918 
3919 #undef __FUNCT__
3920 #define __FUNCT__ "MatDestroyMatrices"
3921 /*@C
3922    MatDestroyMatrices - Destroys a set of matrices obtained with MatGetSubMatrices().
3923 
3924    Collective on Mat
3925 
3926    Input Parameters:
3927 +  n - the number of local matrices
3928 -  mat - the matrices
3929 
3930    Level: advanced
3931 
3932     Notes: Frees not only the matrices, but also the array that contains the matrices
3933 
3934 .seealso: MatGetSubMatrices()
3935 @*/
3936 int MatDestroyMatrices(int n,Mat **mat)
3937 {
3938   int ierr,i;
3939 
3940   PetscFunctionBegin;
3941   if (n < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Trying to destroy negative number of matrices %d",n);
3942   PetscValidPointer(mat);
3943   for (i=0; i<n; i++) {
3944     ierr = MatDestroy((*mat)[i]);CHKERRQ(ierr);
3945   }
3946   /* memory is allocated even if n = 0 */
3947   ierr = PetscFree(*mat);CHKERRQ(ierr);
3948   PetscFunctionReturn(0);
3949 }
3950 
3951 #undef __FUNCT__
3952 #define __FUNCT__ "MatIncreaseOverlap"
3953 /*@
3954    MatIncreaseOverlap - Given a set of submatrices indicated by index sets,
3955    replaces the index sets by larger ones that represent submatrices with
3956    additional overlap.
3957 
3958    Collective on Mat
3959 
3960    Input Parameters:
3961 +  mat - the matrix
3962 .  n   - the number of index sets
3963 .  is  - the array of pointers to index sets
3964 -  ov  - the additional overlap requested
3965 
3966    Level: developer
3967 
3968    Concepts: overlap
3969    Concepts: ASM^computing overlap
3970 
3971 .seealso: MatGetSubMatrices()
3972 @*/
3973 int MatIncreaseOverlap(Mat mat,int n,IS *is,int ov)
3974 {
3975   int ierr;
3976 
3977   PetscFunctionBegin;
3978   PetscValidHeaderSpecific(mat,MAT_COOKIE);
3979   PetscValidType(mat);
3980   MatPreallocated(mat);
3981   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
3982   if (mat->factor)     SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
3983 
3984   if (!ov) PetscFunctionReturn(0);
3985   if (!mat->ops->increaseoverlap) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
3986   ierr = PetscLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr);
3987   ierr = (*mat->ops->increaseoverlap)(mat,n,is,ov);CHKERRQ(ierr);
3988   ierr = PetscLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr);
3989   PetscFunctionReturn(0);
3990 }
3991 
3992 #undef __FUNCT__
3993 #define __FUNCT__ "MatPrintHelp"
3994 /*@
3995    MatPrintHelp - Prints all the options for the matrix.
3996 
3997    Collective on Mat
3998 
3999    Input Parameter:
4000 .  mat - the matrix
4001 
4002    Options Database Keys:
4003 +  -help - Prints matrix options
4004 -  -h - Prints matrix options
4005 
4006    Level: developer
4007 
4008 .seealso: MatCreate(), MatCreateXXX()
4009 @*/
4010 int MatPrintHelp(Mat mat)
4011 {
4012   static PetscTruth called = PETSC_FALSE;
4013   int               ierr;
4014 
4015   PetscFunctionBegin;
4016   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4017   PetscValidType(mat);
4018   MatPreallocated(mat);
4019 
4020   if (!called) {
4021     if (mat->ops->printhelp) {
4022       ierr = (*mat->ops->printhelp)(mat);CHKERRQ(ierr);
4023     }
4024     called = PETSC_TRUE;
4025   }
4026   PetscFunctionReturn(0);
4027 }
4028 
4029 #undef __FUNCT__
4030 #define __FUNCT__ "MatGetBlockSize"
4031 /*@
4032    MatGetBlockSize - Returns the matrix block size; useful especially for the
4033    block row and block diagonal formats.
4034 
4035    Not Collective
4036 
4037    Input Parameter:
4038 .  mat - the matrix
4039 
4040    Output Parameter:
4041 .  bs - block size
4042 
4043    Notes:
4044    Block diagonal formats are MATSEQBDIAG, MATMPIBDIAG.
4045    Block row formats are MATSEQBAIJ, MATMPIBAIJ
4046 
4047    Level: intermediate
4048 
4049    Concepts: matrices^block size
4050 
4051 .seealso: MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), MatCreateSeqBDiag(), MatCreateMPIBDiag()
4052 @*/
4053 int MatGetBlockSize(Mat mat,int *bs)
4054 {
4055   int ierr;
4056 
4057   PetscFunctionBegin;
4058   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4059   PetscValidType(mat);
4060   MatPreallocated(mat);
4061   PetscValidIntPointer(bs);
4062   if (!mat->ops->getblocksize) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4063   ierr = (*mat->ops->getblocksize)(mat,bs);CHKERRQ(ierr);
4064   PetscFunctionReturn(0);
4065 }
4066 
4067 #undef __FUNCT__
4068 #define __FUNCT__ "MatGetRowIJ"
4069 /*@C
4070     MatGetRowIJ - Returns the compressed row storage i and j indices for sequential matrices.
4071 
4072    Collective on Mat
4073 
4074     Input Parameters:
4075 +   mat - the matrix
4076 .   shift -  0 or 1 indicating we want the indices starting at 0 or 1
4077 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4078                 symmetrized
4079 
4080     Output Parameters:
4081 +   n - number of rows in the (possibly compressed) matrix
4082 .   ia - the row pointers
4083 .   ja - the column indices
4084 -   done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned
4085 
4086     Level: developer
4087 
4088 .seealso: MatGetColumnIJ(), MatRestoreRowIJ()
4089 @*/
4090 int MatGetRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4091 {
4092   int ierr;
4093 
4094   PetscFunctionBegin;
4095   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4096   PetscValidType(mat);
4097   MatPreallocated(mat);
4098   if (ia) PetscValidIntPointer(ia);
4099   if (ja) PetscValidIntPointer(ja);
4100   PetscValidIntPointer(done);
4101   if (!mat->ops->getrowij) *done = PETSC_FALSE;
4102   else {
4103     *done = PETSC_TRUE;
4104     ierr  = (*mat->ops->getrowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4105   }
4106   PetscFunctionReturn(0);
4107 }
4108 
4109 #undef __FUNCT__
4110 #define __FUNCT__ "MatGetColumnIJ"
4111 /*@C
4112     MatGetColumnIJ - Returns the compressed column storage i and j indices for sequential matrices.
4113 
4114     Collective on Mat
4115 
4116     Input Parameters:
4117 +   mat - the matrix
4118 .   shift - 1 or zero indicating we want the indices starting at 0 or 1
4119 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4120                 symmetrized
4121 
4122     Output Parameters:
4123 +   n - number of columns in the (possibly compressed) matrix
4124 .   ia - the column pointers
4125 .   ja - the row indices
4126 -   done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned
4127 
4128     Level: developer
4129 
4130 .seealso: MatGetRowIJ(), MatRestoreColumnIJ()
4131 @*/
4132 int MatGetColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4133 {
4134   int ierr;
4135 
4136   PetscFunctionBegin;
4137   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4138   PetscValidType(mat);
4139   MatPreallocated(mat);
4140   if (ia) PetscValidIntPointer(ia);
4141   if (ja) PetscValidIntPointer(ja);
4142   PetscValidIntPointer(done);
4143 
4144   if (!mat->ops->getcolumnij) *done = PETSC_FALSE;
4145   else {
4146     *done = PETSC_TRUE;
4147     ierr  = (*mat->ops->getcolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4148   }
4149   PetscFunctionReturn(0);
4150 }
4151 
4152 #undef __FUNCT__
4153 #define __FUNCT__ "MatRestoreRowIJ"
4154 /*@C
4155     MatRestoreRowIJ - Call after you are completed with the ia,ja indices obtained with
4156     MatGetRowIJ().
4157 
4158     Collective on Mat
4159 
4160     Input Parameters:
4161 +   mat - the matrix
4162 .   shift - 1 or zero indicating we want the indices starting at 0 or 1
4163 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4164                 symmetrized
4165 
4166     Output Parameters:
4167 +   n - size of (possibly compressed) matrix
4168 .   ia - the row pointers
4169 .   ja - the column indices
4170 -   done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned
4171 
4172     Level: developer
4173 
4174 .seealso: MatGetRowIJ(), MatRestoreColumnIJ()
4175 @*/
4176 int MatRestoreRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4177 {
4178   int ierr;
4179 
4180   PetscFunctionBegin;
4181   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4182   PetscValidType(mat);
4183   MatPreallocated(mat);
4184   if (ia) PetscValidIntPointer(ia);
4185   if (ja) PetscValidIntPointer(ja);
4186   PetscValidIntPointer(done);
4187 
4188   if (!mat->ops->restorerowij) *done = PETSC_FALSE;
4189   else {
4190     *done = PETSC_TRUE;
4191     ierr  = (*mat->ops->restorerowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4192   }
4193   PetscFunctionReturn(0);
4194 }
4195 
4196 #undef __FUNCT__
4197 #define __FUNCT__ "MatRestoreColumnIJ"
4198 /*@C
4199     MatRestoreColumnIJ - Call after you are completed with the ia,ja indices obtained with
4200     MatGetColumnIJ().
4201 
4202     Collective on Mat
4203 
4204     Input Parameters:
4205 +   mat - the matrix
4206 .   shift - 1 or zero indicating we want the indices starting at 0 or 1
4207 -   symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be
4208                 symmetrized
4209 
4210     Output Parameters:
4211 +   n - size of (possibly compressed) matrix
4212 .   ia - the column pointers
4213 .   ja - the row indices
4214 -   done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned
4215 
4216     Level: developer
4217 
4218 .seealso: MatGetColumnIJ(), MatRestoreRowIJ()
4219 @*/
4220 int MatRestoreColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done)
4221 {
4222   int ierr;
4223 
4224   PetscFunctionBegin;
4225   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4226   PetscValidType(mat);
4227   MatPreallocated(mat);
4228   if (ia) PetscValidIntPointer(ia);
4229   if (ja) PetscValidIntPointer(ja);
4230   PetscValidIntPointer(done);
4231 
4232   if (!mat->ops->restorecolumnij) *done = PETSC_FALSE;
4233   else {
4234     *done = PETSC_TRUE;
4235     ierr  = (*mat->ops->restorecolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr);
4236   }
4237   PetscFunctionReturn(0);
4238 }
4239 
4240 #undef __FUNCT__
4241 #define __FUNCT__ "MatColoringPatch"
4242 /*@C
4243     MatColoringPatch -Used inside matrix coloring routines that
4244     use MatGetRowIJ() and/or MatGetColumnIJ().
4245 
4246     Collective on Mat
4247 
4248     Input Parameters:
4249 +   mat - the matrix
4250 .   n   - number of colors
4251 -   colorarray - array indicating color for each column
4252 
4253     Output Parameters:
4254 .   iscoloring - coloring generated using colorarray information
4255 
4256     Level: developer
4257 
4258 .seealso: MatGetRowIJ(), MatGetColumnIJ()
4259 
4260 @*/
4261 int MatColoringPatch(Mat mat,int n,int ncolors,int *colorarray,ISColoring *iscoloring)
4262 {
4263   int ierr;
4264 
4265   PetscFunctionBegin;
4266   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4267   PetscValidType(mat);
4268   MatPreallocated(mat);
4269   PetscValidIntPointer(colorarray);
4270 
4271   if (!mat->ops->coloringpatch){
4272     ierr = ISColoringCreate(mat->comm,n,colorarray,iscoloring);CHKERRQ(ierr);
4273   } else {
4274     ierr = (*mat->ops->coloringpatch)(mat,n,ncolors,colorarray,iscoloring);CHKERRQ(ierr);
4275   }
4276   PetscFunctionReturn(0);
4277 }
4278 
4279 
4280 #undef __FUNCT__
4281 #define __FUNCT__ "MatSetUnfactored"
4282 /*@
4283    MatSetUnfactored - Resets a factored matrix to be treated as unfactored.
4284 
4285    Collective on Mat
4286 
4287    Input Parameter:
4288 .  mat - the factored matrix to be reset
4289 
4290    Notes:
4291    This routine should be used only with factored matrices formed by in-place
4292    factorization via ILU(0) (or by in-place LU factorization for the MATSEQDENSE
4293    format).  This option can save memory, for example, when solving nonlinear
4294    systems with a matrix-free Newton-Krylov method and a matrix-based, in-place
4295    ILU(0) preconditioner.
4296 
4297    Note that one can specify in-place ILU(0) factorization by calling
4298 .vb
4299      PCType(pc,PCILU);
4300      PCILUSeUseInPlace(pc);
4301 .ve
4302    or by using the options -pc_type ilu -pc_ilu_in_place
4303 
4304    In-place factorization ILU(0) can also be used as a local
4305    solver for the blocks within the block Jacobi or additive Schwarz
4306    methods (runtime option: -sub_pc_ilu_in_place).  See the discussion
4307    of these preconditioners in the users manual for details on setting
4308    local solver options.
4309 
4310    Most users should employ the simplified SLES interface for linear solvers
4311    instead of working directly with matrix algebra routines such as this.
4312    See, e.g., SLESCreate().
4313 
4314    Level: developer
4315 
4316 .seealso: PCILUSetUseInPlace(), PCLUSetUseInPlace()
4317 
4318    Concepts: matrices^unfactored
4319 
4320 @*/
4321 int MatSetUnfactored(Mat mat)
4322 {
4323   int ierr;
4324 
4325   PetscFunctionBegin;
4326   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4327   PetscValidType(mat);
4328   MatPreallocated(mat);
4329   mat->factor = 0;
4330   if (!mat->ops->setunfactored) PetscFunctionReturn(0);
4331   ierr = (*mat->ops->setunfactored)(mat);CHKERRQ(ierr);
4332   PetscFunctionReturn(0);
4333 }
4334 
4335 /*MC
4336     MatGetArrayF90 - Accesses a matrix array from Fortran90.
4337 
4338     Synopsis:
4339     MatGetArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr)
4340 
4341     Not collective
4342 
4343     Input Parameter:
4344 .   x - matrix
4345 
4346     Output Parameters:
4347 +   xx_v - the Fortran90 pointer to the array
4348 -   ierr - error code
4349 
4350     Example of Usage:
4351 .vb
4352       PetscScalar, pointer xx_v(:)
4353       ....
4354       call MatGetArrayF90(x,xx_v,ierr)
4355       a = xx_v(3)
4356       call MatRestoreArrayF90(x,xx_v,ierr)
4357 .ve
4358 
4359     Notes:
4360     Not yet supported for all F90 compilers
4361 
4362     Level: advanced
4363 
4364 .seealso:  MatRestoreArrayF90(), MatGetArray(), MatRestoreArray()
4365 
4366     Concepts: matrices^accessing array
4367 
4368 M*/
4369 
4370 /*MC
4371     MatRestoreArrayF90 - Restores a matrix array that has been
4372     accessed with MatGetArrayF90().
4373 
4374     Synopsis:
4375     MatRestoreArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr)
4376 
4377     Not collective
4378 
4379     Input Parameters:
4380 +   x - matrix
4381 -   xx_v - the Fortran90 pointer to the array
4382 
4383     Output Parameter:
4384 .   ierr - error code
4385 
4386     Example of Usage:
4387 .vb
4388        PetscScalar, pointer xx_v(:)
4389        ....
4390        call MatGetArrayF90(x,xx_v,ierr)
4391        a = xx_v(3)
4392        call MatRestoreArrayF90(x,xx_v,ierr)
4393 .ve
4394 
4395     Notes:
4396     Not yet supported for all F90 compilers
4397 
4398     Level: advanced
4399 
4400 .seealso:  MatGetArrayF90(), MatGetArray(), MatRestoreArray()
4401 
4402 M*/
4403 
4404 
4405 #undef __FUNCT__
4406 #define __FUNCT__ "MatGetSubMatrix"
4407 /*@
4408     MatGetSubMatrix - Gets a single submatrix on the same number of processors
4409                       as the original matrix.
4410 
4411     Collective on Mat
4412 
4413     Input Parameters:
4414 +   mat - the original matrix
4415 .   isrow - rows this processor should obtain
4416 .   iscol - columns for all processors you wish to keep
4417 .   csize - number of columns "local" to this processor (does nothing for sequential
4418             matrices). This should match the result from VecGetLocalSize(x,...) if you
4419             plan to use the matrix in a A*x; alternatively, you can use PETSC_DECIDE
4420 -   cll - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX
4421 
4422     Output Parameter:
4423 .   newmat - the new submatrix, of the same type as the old
4424 
4425     Level: advanced
4426 
4427     Notes: the iscol argument MUST be the same on each processor. You might be
4428     able to create the iscol argument with ISAllGather().
4429 
4430       The first time this is called you should use a cll of MAT_INITIAL_MATRIX,
4431    the MatGetSubMatrix() routine will create the newmat for you. Any additional calls
4432    to this routine with a mat of the same nonzero structure will reuse the matrix
4433    generated the first time.
4434 
4435     Concepts: matrices^submatrices
4436 
4437 .seealso: MatGetSubMatrices(), ISAllGather()
4438 @*/
4439 int MatGetSubMatrix(Mat mat,IS isrow,IS iscol,int csize,MatReuse cll,Mat *newmat)
4440 {
4441   int     ierr, size;
4442   Mat     *local;
4443 
4444   PetscFunctionBegin;
4445   PetscValidType(mat);
4446   MatPreallocated(mat);
4447   ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr);
4448 
4449   /* if original matrix is on just one processor then use submatrix generated */
4450   if (!mat->ops->getsubmatrix && size == 1 && cll == MAT_REUSE_MATRIX) {
4451     ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_REUSE_MATRIX,&newmat);CHKERRQ(ierr);
4452     PetscFunctionReturn(0);
4453   } else if (!mat->ops->getsubmatrix && size == 1) {
4454     ierr    = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_INITIAL_MATRIX,&local);CHKERRQ(ierr);
4455     *newmat = *local;
4456     ierr    = PetscFree(local);CHKERRQ(ierr);
4457     PetscFunctionReturn(0);
4458   }
4459 
4460   if (!mat->ops->getsubmatrix) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4461   ierr = (*mat->ops->getsubmatrix)(mat,isrow,iscol,csize,cll,newmat);CHKERRQ(ierr);
4462   PetscFunctionReturn(0);
4463 }
4464 
4465 #undef __FUNCT__
4466 #define __FUNCT__ "MatGetPetscMaps"
4467 /*@C
4468    MatGetPetscMaps - Returns the maps associated with the matrix.
4469 
4470    Not Collective
4471 
4472    Input Parameter:
4473 .  mat - the matrix
4474 
4475    Output Parameters:
4476 +  rmap - the row (right) map
4477 -  cmap - the column (left) map
4478 
4479    Level: developer
4480 
4481    Concepts: maps^getting from matrix
4482 
4483 @*/
4484 int MatGetPetscMaps(Mat mat,PetscMap *rmap,PetscMap *cmap)
4485 {
4486   int ierr;
4487 
4488   PetscFunctionBegin;
4489   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4490   PetscValidType(mat);
4491   MatPreallocated(mat);
4492   ierr = (*mat->ops->getmaps)(mat,rmap,cmap);CHKERRQ(ierr);
4493   PetscFunctionReturn(0);
4494 }
4495 
4496 /*
4497       Version that works for all PETSc matrices
4498 */
4499 #undef __FUNCT__
4500 #define __FUNCT__ "MatGetPetscMaps_Petsc"
4501 int MatGetPetscMaps_Petsc(Mat mat,PetscMap *rmap,PetscMap *cmap)
4502 {
4503   PetscFunctionBegin;
4504   if (rmap) *rmap = mat->rmap;
4505   if (cmap) *cmap = mat->cmap;
4506   PetscFunctionReturn(0);
4507 }
4508 
4509 #undef __FUNCT__
4510 #define __FUNCT__ "MatSetStashInitialSize"
4511 /*@
4512    MatSetStashInitialSize - sets the sizes of the matrix stash, that is
4513    used during the assembly process to store values that belong to
4514    other processors.
4515 
4516    Not Collective
4517 
4518    Input Parameters:
4519 +  mat   - the matrix
4520 .  size  - the initial size of the stash.
4521 -  bsize - the initial size of the block-stash(if used).
4522 
4523    Options Database Keys:
4524 +   -matstash_initial_size <size> or <size0,size1,...sizep-1>
4525 -   -matstash_block_initial_size <bsize>  or <bsize0,bsize1,...bsizep-1>
4526 
4527    Level: intermediate
4528 
4529    Notes:
4530      The block-stash is used for values set with VecSetValuesBlocked() while
4531      the stash is used for values set with VecSetValues()
4532 
4533      Run with the option -log_info and look for output of the form
4534      MatAssemblyBegin_MPIXXX:Stash has MM entries, uses nn mallocs.
4535      to determine the appropriate value, MM, to use for size and
4536      MatAssemblyBegin_MPIXXX:Block-Stash has BMM entries, uses nn mallocs.
4537      to determine the value, BMM to use for bsize
4538 
4539    Concepts: stash^setting matrix size
4540    Concepts: matrices^stash
4541 
4542 @*/
4543 int MatSetStashInitialSize(Mat mat,int size, int bsize)
4544 {
4545   int ierr;
4546 
4547   PetscFunctionBegin;
4548   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4549   PetscValidType(mat);
4550   MatPreallocated(mat);
4551   ierr = MatStashSetInitialSize_Private(&mat->stash,size);CHKERRQ(ierr);
4552   ierr = MatStashSetInitialSize_Private(&mat->bstash,bsize);CHKERRQ(ierr);
4553   PetscFunctionReturn(0);
4554 }
4555 
4556 #undef __FUNCT__
4557 #define __FUNCT__ "MatInterpolateAdd"
4558 /*@
4559    MatInterpolateAdd - w = y + A*x or A'*x depending on the shape of
4560      the matrix
4561 
4562    Collective on Mat
4563 
4564    Input Parameters:
4565 +  mat   - the matrix
4566 .  x,y - the vectors
4567 -  w - where the result is stored
4568 
4569    Level: intermediate
4570 
4571    Notes:
4572     w may be the same vector as y.
4573 
4574     This allows one to use either the restriction or interpolation (its transpose)
4575     matrix to do the interpolation
4576 
4577     Concepts: interpolation
4578 
4579 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict()
4580 
4581 @*/
4582 int MatInterpolateAdd(Mat A,Vec x,Vec y,Vec w)
4583 {
4584   int M,N,ierr;
4585 
4586   PetscFunctionBegin;
4587   PetscValidType(A);
4588   MatPreallocated(A);
4589   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
4590   if (N > M) {
4591     ierr = MatMultTransposeAdd(A,x,y,w);CHKERRQ(ierr);
4592   } else {
4593     ierr = MatMultAdd(A,x,y,w);CHKERRQ(ierr);
4594   }
4595   PetscFunctionReturn(0);
4596 }
4597 
4598 #undef __FUNCT__
4599 #define __FUNCT__ "MatInterpolate"
4600 /*@
4601    MatInterpolate - y = A*x or A'*x depending on the shape of
4602      the matrix
4603 
4604    Collective on Mat
4605 
4606    Input Parameters:
4607 +  mat   - the matrix
4608 -  x,y - the vectors
4609 
4610    Level: intermediate
4611 
4612    Notes:
4613     This allows one to use either the restriction or interpolation (its transpose)
4614     matrix to do the interpolation
4615 
4616    Concepts: matrices^interpolation
4617 
4618 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict()
4619 
4620 @*/
4621 int MatInterpolate(Mat A,Vec x,Vec y)
4622 {
4623   int M,N,ierr;
4624 
4625   PetscFunctionBegin;
4626   PetscValidType(A);
4627   MatPreallocated(A);
4628   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
4629   if (N > M) {
4630     ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr);
4631   } else {
4632     ierr = MatMult(A,x,y);CHKERRQ(ierr);
4633   }
4634   PetscFunctionReturn(0);
4635 }
4636 
4637 #undef __FUNCT__
4638 #define __FUNCT__ "MatRestrict"
4639 /*@
4640    MatRestrict - y = A*x or A'*x
4641 
4642    Collective on Mat
4643 
4644    Input Parameters:
4645 +  mat   - the matrix
4646 -  x,y - the vectors
4647 
4648    Level: intermediate
4649 
4650    Notes:
4651     This allows one to use either the restriction or interpolation (its transpose)
4652     matrix to do the restriction
4653 
4654    Concepts: matrices^restriction
4655 
4656 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatInterpolate()
4657 
4658 @*/
4659 int MatRestrict(Mat A,Vec x,Vec y)
4660 {
4661   int M,N,ierr;
4662 
4663   PetscFunctionBegin;
4664   PetscValidType(A);
4665   MatPreallocated(A);
4666   ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
4667   if (N > M) {
4668     ierr = MatMult(A,x,y);CHKERRQ(ierr);
4669   } else {
4670     ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr);
4671   }
4672   PetscFunctionReturn(0);
4673 }
4674 
4675 #undef __FUNCT__
4676 #define __FUNCT__ "MatNullSpaceAttach"
4677 /*@C
4678    MatNullSpaceAttach - attaches a null space to a matrix.
4679         This null space will be removed from the resulting vector whenever
4680         MatMult() is called
4681 
4682    Collective on Mat
4683 
4684    Input Parameters:
4685 +  mat - the matrix
4686 -  nullsp - the null space object
4687 
4688    Level: developer
4689 
4690    Notes:
4691       Overwrites any previous null space that may have been attached
4692 
4693    Concepts: null space^attaching to matrix
4694 
4695 .seealso: MatCreate(), MatNullSpaceCreate()
4696 @*/
4697 int MatNullSpaceAttach(Mat mat,MatNullSpace nullsp)
4698 {
4699   int ierr;
4700 
4701   PetscFunctionBegin;
4702   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4703   PetscValidType(mat);
4704   MatPreallocated(mat);
4705   PetscValidHeaderSpecific(nullsp,MAT_NULLSPACE_COOKIE);
4706 
4707   if (mat->nullsp) {
4708     ierr = MatNullSpaceDestroy(mat->nullsp);CHKERRQ(ierr);
4709   }
4710   mat->nullsp = nullsp;
4711   ierr = PetscObjectReference((PetscObject)nullsp);CHKERRQ(ierr);
4712   PetscFunctionReturn(0);
4713 }
4714 
4715 #undef __FUNCT__
4716 #define __FUNCT__ "MatICCFactor"
4717 /*@
4718    MatICCFactor - Performs in-place incomplete Cholesky factorization of matrix.
4719 
4720    Collective on Mat
4721 
4722    Input Parameters:
4723 +  mat - the matrix
4724 .  row - row/column permutation
4725 .  fill - expected fill factor >= 1.0
4726 -  level - level of fill, for ICC(k)
4727 
4728    Notes:
4729    Probably really in-place only when level of fill is zero, otherwise allocates
4730    new space to store factored matrix and deletes previous memory.
4731 
4732    Most users should employ the simplified SLES interface for linear solvers
4733    instead of working directly with matrix algebra routines such as this.
4734    See, e.g., SLESCreate().
4735 
4736    Level: developer
4737 
4738    Concepts: matrices^incomplete Cholesky factorization
4739    Concepts: Cholesky factorization
4740 
4741 .seealso: MatICCFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor()
4742 @*/
4743 int MatICCFactor(Mat mat,IS row,PetscReal fill,int level)
4744 {
4745   int ierr;
4746 
4747   PetscFunctionBegin;
4748   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4749   PetscValidType(mat);
4750   MatPreallocated(mat);
4751   if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square");
4752   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix");
4753   if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
4754   if (!mat->ops->iccfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4755   ierr = (*mat->ops->iccfactor)(mat,row,fill,level);CHKERRQ(ierr);
4756   PetscFunctionReturn(0);
4757 }
4758 
4759 #undef __FUNCT__
4760 #define __FUNCT__ "MatSetValuesAdic"
4761 /*@
4762    MatSetValuesAdic - Sets values computed with ADIC automatic differentiation into a matrix.
4763 
4764    Not Collective
4765 
4766    Input Parameters:
4767 +  mat - the matrix
4768 -  v - the values compute with ADIC
4769 
4770    Level: developer
4771 
4772    Notes:
4773      Must call MatSetColoring() before using this routine. Also this matrix must already
4774      have its nonzero pattern determined.
4775 
4776 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(),
4777           MatSetValues(), MatSetColoring(), MatSetValuesAdifor()
4778 @*/
4779 int MatSetValuesAdic(Mat mat,void *v)
4780 {
4781   int ierr;
4782 
4783   PetscFunctionBegin;
4784   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4785   PetscValidType(mat);
4786 
4787   if (!mat->assembled) {
4788     SETERRQ(1,"Matrix must be already assembled");
4789   }
4790   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4791   if (!mat->ops->setvaluesadic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4792   ierr = (*mat->ops->setvaluesadic)(mat,v);CHKERRQ(ierr);
4793   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4794   ierr = MatView_Private(mat);CHKERRQ(ierr);
4795   PetscFunctionReturn(0);
4796 }
4797 
4798 
4799 #undef __FUNCT__
4800 #define __FUNCT__ "MatSetColoring"
4801 /*@
4802    MatSetColoring - Sets a coloring used by calls to MatSetValuesAdic()
4803 
4804    Not Collective
4805 
4806    Input Parameters:
4807 +  mat - the matrix
4808 -  coloring - the coloring
4809 
4810    Level: developer
4811 
4812 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(),
4813           MatSetValues(), MatSetValuesAdic()
4814 @*/
4815 int MatSetColoring(Mat mat,ISColoring coloring)
4816 {
4817   int ierr;
4818 
4819   PetscFunctionBegin;
4820   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4821   PetscValidType(mat);
4822 
4823   if (!mat->assembled) {
4824     SETERRQ(1,"Matrix must be already assembled");
4825   }
4826   if (!mat->ops->setcoloring) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4827   ierr = (*mat->ops->setcoloring)(mat,coloring);CHKERRQ(ierr);
4828   PetscFunctionReturn(0);
4829 }
4830 
4831 #undef __FUNCT__
4832 #define __FUNCT__ "MatSetValuesAdifor"
4833 /*@
4834    MatSetValuesAdifor - Sets values computed with automatic differentiation into a matrix.
4835 
4836    Not Collective
4837 
4838    Input Parameters:
4839 +  mat - the matrix
4840 .  nl - leading dimension of v
4841 -  v - the values compute with ADIFOR
4842 
4843    Level: developer
4844 
4845    Notes:
4846      Must call MatSetColoring() before using this routine. Also this matrix must already
4847      have its nonzero pattern determined.
4848 
4849 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(),
4850           MatSetValues(), MatSetColoring()
4851 @*/
4852 int MatSetValuesAdifor(Mat mat,int nl,void *v)
4853 {
4854   int ierr;
4855 
4856   PetscFunctionBegin;
4857   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4858   PetscValidType(mat);
4859 
4860   if (!mat->assembled) {
4861     SETERRQ(1,"Matrix must be already assembled");
4862   }
4863   ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4864   if (!mat->ops->setvaluesadifor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4865   ierr = (*mat->ops->setvaluesadifor)(mat,nl,v);CHKERRQ(ierr);
4866   ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr);
4867   PetscFunctionReturn(0);
4868 }
4869 
4870 EXTERN int MatMPIAIJDiagonalScaleLocal(Mat,Vec);
4871 EXTERN int MatMPIBAIJDiagonalScaleLocal(Mat,Vec);
4872 
4873 #undef __FUNCT__
4874 #define __FUNCT__ "MatDiagonalScaleLocal"
4875 /*@
4876    MatDiagonalScaleLocal - Scales columns of a matrix given the scaling values including the
4877          ghosted ones.
4878 
4879    Not Collective
4880 
4881    Input Parameters:
4882 +  mat - the matrix
4883 -  diag = the diagonal values, including ghost ones
4884 
4885    Level: developer
4886 
4887    Notes: Works only for MPIAIJ and MPIBAIJ matrices
4888 
4889 .seealso: MatDiagonalScale()
4890 @*/
4891 int MatDiagonalScaleLocal(Mat mat,Vec diag)
4892 {
4893   int        ierr;
4894   PetscTruth flag;
4895 
4896   PetscFunctionBegin;
4897   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4898   PetscValidHeaderSpecific(diag,VEC_COOKIE);
4899   PetscValidType(mat);
4900 
4901   if (!mat->assembled) {
4902     SETERRQ(1,"Matrix must be already assembled");
4903   }
4904   ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
4905   ierr = PetscTypeCompare((PetscObject)mat,MATMPIAIJ,&flag);CHKERRQ(ierr);
4906   if (flag) {
4907     ierr = MatMPIAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr);
4908   } else {
4909     ierr = PetscTypeCompare((PetscObject)mat,MATMPIBAIJ,&flag);CHKERRQ(ierr);
4910     if (flag) {
4911       ierr = MatMPIBAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr);
4912     } else {
4913       int size;
4914       ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr);
4915       if (size == 1) {
4916         int n,m;
4917         ierr = VecGetSize(diag,&n);CHKERRQ(ierr);
4918         ierr = MatGetSize(mat,0,&m);CHKERRQ(ierr);
4919         if (m == n) {
4920           ierr = MatDiagonalScale(mat,0,diag);CHKERRQ(ierr);
4921         } else {
4922           SETERRQ(1,"Only supprted for sequential matrices when no ghost points/periodic conditions");
4923         }
4924       } else {
4925         SETERRQ(1,"Only supported for MPIAIJ and MPIBAIJ parallel matrices");
4926       }
4927     }
4928   }
4929   ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr);
4930   PetscFunctionReturn(0);
4931 }
4932 
4933 #undef __FUNCT__
4934 #define __FUNCT__ "MatGetInertia"
4935 /*@
4936    MatGetInertia - Gets the inertia from a factored matrix
4937 
4938    Collective on Mat
4939 
4940    Input Parameter:
4941 .  mat - the matrix
4942 
4943    Output Parameters:
4944 +   nneg - number of negative eigenvalues
4945 .   nzero - number of zero eigenvalues
4946 -   npos - number of positive eigenvalues
4947 
4948    Level: advanced
4949 
4950    Notes: Matrix must have been factored by MatCholeskyFactor()
4951 
4952 
4953 @*/
4954 int MatGetInertia(Mat mat,int *nneg,int *nzero,int *npos)
4955 {
4956   int        ierr;
4957 
4958   PetscFunctionBegin;
4959   PetscValidHeaderSpecific(mat,MAT_COOKIE);
4960   PetscValidType(mat);
4961   if (!mat->factor)    SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
4962   if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Numeric factor mat is not assembled");
4963   if (!mat->ops->getinertia) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
4964   ierr = (*mat->ops->getinertia)(mat,nneg,nzero,npos);CHKERRQ(ierr);
4965   PetscFunctionReturn(0);
4966 }
4967 
4968 /* ----------------------------------------------------------------*/
4969 #undef __FUNCT__
4970 #define __FUNCT__ "MatSolves"
4971 /*@
4972    MatSolves - Solves A x = b, given a factored matrix, for a collection of vectors
4973 
4974    Collective on Mat and Vecs
4975 
4976    Input Parameters:
4977 +  mat - the factored matrix
4978 -  b - the right-hand-side vectors
4979 
4980    Output Parameter:
4981 .  x - the result vectors
4982 
4983    Notes:
4984    The vectors b and x cannot be the same.  I.e., one cannot
4985    call MatSolves(A,x,x).
4986 
4987    Notes:
4988    Most users should employ the simplified SLES interface for linear solvers
4989    instead of working directly with matrix algebra routines such as this.
4990    See, e.g., SLESCreate().
4991 
4992    Level: developer
4993 
4994    Concepts: matrices^triangular solves
4995 
4996 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd(), MatSolve()
4997 @*/
4998 int MatSolves(Mat mat,Vecs b,Vecs x)
4999 {
5000   int ierr;
5001 
5002   PetscFunctionBegin;
5003   PetscValidHeaderSpecific(mat,MAT_COOKIE);
5004   PetscValidType(mat);
5005   MatPreallocated(mat);
5006   if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors");
5007   if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix");
5008   if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0);
5009 
5010   if (!mat->ops->solves) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name);
5011   ierr = PetscLogEventBegin(MAT_Solves,mat,0,0,0);CHKERRQ(ierr);
5012   ierr = (*mat->ops->solves)(mat,b,x);CHKERRQ(ierr);
5013   ierr = PetscLogEventEnd(MAT_Solves,mat,0,0,0);CHKERRQ(ierr);
5014   PetscFunctionReturn(0);
5015 }
5016