xref: /petsc/src/mat/utils/gcreate.c (revision 9b0d118972bd5614e9e2d4aa76805104fdfe5302)
1 #ifndef lint
2 static char vcid[] = "$Id: gcreate.c,v 1.25 1995/05/26 19:24:11 curfman Exp curfman $";
3 #endif
4 
5 #include "sys.h"
6 #include "sysio.h"
7 #include "mat.h"
8 
9 /*@C
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) SETERR(1,"Must set diagonals before creating matrix.");
63     d = (int *)MALLOC( ndiag * sizeof(int) ); CHKPTR(d);
64     ndiag2 = ndiag;
65     OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2);
66     if (ndiag2 != ndiag) {
67       SETERR(1,"Incompatible number of diagonals and diagonal values.");
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     CHKERR(ierr);
74     if (d) FREE(d);
75     return ierr;
76   }
77   if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) {
78     if (OptionsHasName(0,"-mat_row")) {
79       return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V);
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     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