xref: /petsc/src/mat/utils/gcreate.c (revision bbb6d6a8ce168c53119d255f697846c361b726e4)
1 
2 #ifndef lint
3 static char vcid[] = "$Id: gcreate.c,v 1.31 1995/07/12 20:22:11 curfman Exp bsmith $";
4 #endif
5 
6 #include "sys.h"
7 #include "mat.h"       /*I "mat.h"  I*/
8 
9 /*@
10    MatCreate - Creates a matrix, where the type is determined
11    from the options database. Generates a parallel MPI matrix if the
12    communicator has more than one processor.
13 
14    Input Parameters:
15 .  m - number of global rows
16 .  n - number of global columns
17 .  comm - MPI communicator
18 
19    Output Parameter:
20 .  V - location to stash resulting matrix
21 
22    Options Database Keywords:
23 $  -mat_aij   : AIJ type, uses MatCreateSequentialAIJ()
24 $               and MatCreateMPIAIJ()
25 $  -mat_dense : dense type, uses MatCreateSequentialDense()
26 $  -mat_row   : row type, uses MatCreateSequentialRow()
27 $               and MatCreateMPIRow()
28 $  -mat_rowbs : rowbs type (for parallel symmetric matrices only),
29 $               uses MatCreateMPIRowbs()
30 $  -mat_bdiag : block diagonal type, uses
31 $               MatCreateSequentialBDiag() and
32 $               MatCreateMPIBDiag()
33 $
34 $  -mpi_objects : uses MPI matrix (parallel format), even for one processor
35 
36    Notes:
37    The default matrix type is AIJ, using MatCreateSequentialAIJ() and
38    MatCreateMPIAIJ().
39 
40 .keywords: matrix, create, initial
41 
42 .seealso: MatCreateSequentialAIJ((), MatCreateMPIAIJ(),
43           MatCreateSequentialRow(), MatCreateMPIRow(),
44           MatCreateSequentialBDiag(),MatCreateMPIBDiag(),
45           MatCreateSequentialDense(), MatCreateMPIRowbs(), MatConvert()
46 @*/
47 int MatCreate(MPI_Comm comm,int m,int n,Mat *V)
48 {
49   int numtid;
50   MPI_Comm_size(comm,&numtid);
51   if (OptionsHasName(0,"-help")) {
52     MPIU_printf(comm,"MatCreate() options: -mat_dense, -mat_row -mat_rowbs\n");
53     MPIU_printf(comm,"                     -mat_bdiag, -mpi_objects\n");
54   }
55   if (OptionsHasName(0,"-mat_dense")) {
56     return MatCreateSequentialDense(comm,m,n,V);
57   }
58   if (OptionsHasName(0,"-mat_bdiag")) {
59     int nb = 1, ndiag = 0, ndiag2,  *d, ierr;
60     OptionsGetInt(0,"-mat_bdiag_bsize",&nb);
61     OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag);
62     if (!ndiag) SETERRQ(1,"MatCreate:Must set diagonals before creating mat");
63     d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d);
64     ndiag2 = ndiag;
65     OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2);
66     if (ndiag2 != ndiag) {
67       SETERRQ(1,"MatCreate:Incompatible number of diags and diagonal vals");
68     }
69     if (numtid > 1 || OptionsHasName(0,"-mpi_objects"))
70       ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V);
71     else
72       ierr = MatCreateSequentialBDiag(comm,m,n,ndiag,nb,d,0,V);
73     CHKERRQ(ierr);
74     if (d) PETSCFREE(d);
75     return ierr;
76   }
77 #if defined(HAVE_BLOCKSOLVE) && !defined(__cplusplus)
78   if (OptionsHasName(0,"-mat_rowbs")) {
79     return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V);
80   }
81 #endif
82   if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) {
83     if (OptionsHasName(0,"-mat_row")) {
84       return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V);
85     }
86     return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V);
87   }
88   if (OptionsHasName(0,"-mat_row")) {
89     return MatCreateSequentialRow(comm,m,n,10,0,V);
90   }
91   return MatCreateSequentialAIJ(comm,m,n,10,0,V);
92 }
93 
94 #include "matimpl.h"
95 /*@C
96    MatGetName - Gets the matrix type name (as a string) from the matrix.
97 
98    Input Parameter:
99 .  mat - the matrix
100 
101    Output Parameter:
102 .  name - name of matrix type
103 
104 .keywords: matrix, get, name
105 
106 .seealso:  MatGetType()
107 @*/
108 int MatGetName(Mat mat,char **name)
109 {
110   /* Note:  Be sure that this list corresponds to the enum in mat.h */
111   int  itype = (int)mat->type;
112   char *matname[9];
113   matname[0] = "MATDENSE";
114   matname[1] = "MATAIJ";
115   matname[2] = "MATMPIAIJ";
116   matname[3] = "MATSHELL";
117   matname[4] = "MATROW";
118   matname[5] = "MATMPIROW";
119   matname[6] = "MATMPIROW_BS";
120   matname[7] = "MATMPIBDIAG";
121   matname[8] = "MATBDIAG";
122   if (itype < 0 || itype > 8) *name = "unknown matrix type";
123   else                        *name = matname[itype];
124   return 0;
125 }
126 
127