xref: /petsc/src/mat/utils/gcreate.c (revision 88cf3e7d7f7bacac967b9d8e2a3caa4352f411af)
1 
2 #ifndef lint
3 static char vcid[] = "$Id: gcreate.c,v 1.33 1995/07/20 03:59:29 bsmith Exp curfman $";
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     MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n");
76     MPIU_printf(comm,"  -mat_bdiag_ndiag number_diags \n");
77     MPIU_printf(comm,"  -mat_bdiag_dvals d1,d2,d3...  \n");
78     MPIU_printf(comm,"(for example)  -mat_bdiag_dvals -5,-1,0,1,5  \n");
79     return ierr;
80   }
81 #if defined(HAVE_BLOCKSOLVE) && !defined(__cplusplus)
82   if (OptionsHasName(0,"-mat_rowbs")) {
83     return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V);
84   }
85 #endif
86   if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) {
87     if (OptionsHasName(0,"-mat_row")) {
88       return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V);
89     }
90     return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V);
91   }
92   if (OptionsHasName(0,"-mat_row")) {
93     return MatCreateSequentialRow(comm,m,n,10,0,V);
94   }
95   return MatCreateSequentialAIJ(comm,m,n,10,0,V);
96 }
97 
98 #include "matimpl.h"
99 /*@C
100    MatGetName - Gets the matrix type name (as a string) from the matrix.
101 
102    Input Parameter:
103 .  mat - the matrix
104 
105    Output Parameter:
106 .  name - name of matrix type
107 
108 .keywords: matrix, get, name
109 
110 .seealso:  MatGetType()
111 @*/
112 int MatGetName(Mat mat,char **name)
113 {
114   /* Note:  Be sure that this list corresponds to the enum in mat.h */
115   int  itype = (int)mat->type;
116   char *matname[9];
117   matname[0] = "MATDENSE";
118   matname[1] = "MATAIJ";
119   matname[2] = "MATMPIAIJ";
120   matname[3] = "MATSHELL";
121   matname[4] = "MATROW";
122   matname[5] = "MATMPIROW";
123   matname[6] = "MATMPIROW_BS";
124   matname[7] = "MATBDIAG";
125   matname[8] = "MATMPIBDIAG";
126   if (itype < 0 || itype > 8) *name = "unknown matrix type";
127   else                        *name = matname[itype];
128   return 0;
129 }
130 
131