xref: /petsc/src/mat/utils/gcreate.c (revision 5baf85370dc056441ea289ffaf97052def6ee800)
1*5baf8537SBarry Smith 
2cb512458SBarry Smith #ifndef lint
3*5baf8537SBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.96 1996/08/08 14:44:19 bsmith Exp bsmith $";
4cb512458SBarry Smith #endif
57807a1faSBarry Smith 
67807a1faSBarry Smith #include "sys.h"
748b35521SBarry Smith #include "mat.h"       /*I "mat.h"  I*/
87807a1faSBarry Smith 
9e3726954SLois Curfman McInnes /*@C
1077c4ece6SBarry Smith    MatGetTypeFromOptions - Determines from the options database what matrix
118c645567SLois Curfman McInnes    format the user has specified.
12416022c9SBarry Smith 
13932b0c3eSLois Curfman McInnes    Input Parameter:
14932b0c3eSLois Curfman McInnes .  comm - the MPI communicator
1539ddd567SLois Curfman McInnes .  type - the type of matrix desired, for example MATSEQAIJ, MATMPIAIJ
16e3726954SLois Curfman McInnes .  pre - optional string to prepend to the name
17416022c9SBarry Smith 
18416022c9SBarry Smith    Output Parameters:
19932b0c3eSLois Curfman McInnes .  set - flag indicating whether user set matrix type option.
20416022c9SBarry Smith 
2126b119abSLois Curfman McInnes    Basic Options Database Keys:
2226b119abSLois Curfman McInnes    These options return MATSEQxxx or MATMPIxxx,
2326b119abSLois Curfman McInnes    depending on the communicator, comm.
2426b119abSLois Curfman McInnes $    -mat_aij      : AIJ type
2526b119abSLois Curfman McInnes $    -mat_baij     : block AIJ type
2626b119abSLois Curfman McInnes $    -mat_dense    : dense type
2726b119abSLois Curfman McInnes $    -mat_bdiag    : block diagonal type
2826b119abSLois Curfman McInnes 
2926b119abSLois Curfman McInnes    More Options Database Keys:
3026b119abSLois Curfman McInnes $    -mat_seqaij   : MATSEQAIJ
3126b119abSLois Curfman McInnes $    -mat_mpiaij   : MATMPIAIJ
3226b119abSLois Curfman McInnes $    -mat_seqbaij  : MATSEQBAIJ
3326b119abSLois Curfman McInnes $    -mat_mpibaij  : MATMPIBAIJ
3426b119abSLois Curfman McInnes $    -mat_seqbdiag : MATSEQBDAIG
3526b119abSLois Curfman McInnes $    -mat_mpibdiag : MATMPIBDIAG
3626b119abSLois Curfman McInnes $    -mat_mpirowbs : MATMPIROWBS
3726b119abSLois Curfman McInnes $    -mat_seqdense : MATSEQDENSE
3826b119abSLois Curfman McInnes $    -mat_mpidense : MATMPIDENSE
3926b119abSLois Curfman McInnes 
408c645567SLois Curfman McInnes    Note:
4126b119abSLois Curfman McInnes    This routine is automatically called within MatCreate() and MatLoad().
428c645567SLois Curfman McInnes 
4339ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options
4439ddd567SLois Curfman McInnes 
4526b119abSLois Curfman McInnes .seealso: MatCreate(), MatLoad()
46416022c9SBarry Smith @*/
47e3726954SLois Curfman McInnes 
4877c4ece6SBarry Smith int MatGetTypeFromOptions(MPI_Comm comm,char *pre,MatType *type,int *set)
49dbb450caSBarry Smith {
5090fe702eSLois Curfman McInnes   int  size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr,flg11,flg14,flg15;
516daaf66cSBarry Smith   char p[64];
52d5d45c9bSBarry Smith 
536daaf66cSBarry Smith   PetscStrcpy(p,"-");
546daaf66cSBarry Smith   if (pre) PetscStrcat(p,pre);
556daaf66cSBarry Smith 
5617699dbbSLois Curfman McInnes   MPI_Comm_size(comm,&size);
5725cdf11fSBarry Smith   ierr = OptionsHasName(PETSC_NULL,"-help",&flg1); CHKERRQ(ierr);
5825cdf11fSBarry Smith   if (flg1) {
5977c4ece6SBarry Smith     PetscPrintf(comm,"Matrix format options:\n");
6077c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p);
6190fe702eSLois Curfman McInnes     PetscPrintf(comm,"  %smat_baij, %smat_seqbaij, %smat_mpibaij\n",p,p,p);
6277c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p);
6377c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p);
64dbb450caSBarry Smith   }
6525cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr);
6625cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr);
6725cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr);
6825cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr);
6925cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr);
7035aab85fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr);
71d218f8d9SSatish Balay   ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr);
7225cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr);
7325cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr);
7425cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr);
7525cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr);
7625cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr);
7790fe702eSLois Curfman McInnes   ierr = OptionsHasName(pre,"-mat_baij",&flg15); CHKERRQ(ierr);
7825cdf11fSBarry Smith   if (flg1) {
79dbb450caSBarry Smith     *type = MATSEQDENSE;
80dbb450caSBarry Smith     *set = 1;
81dbb450caSBarry Smith   }
8225cdf11fSBarry Smith   else if (flg2) {
8339ddd567SLois Curfman McInnes     *type = MATMPIDENSE;
8439ddd567SLois Curfman McInnes     *set = 1;
8539ddd567SLois Curfman McInnes   }
8625cdf11fSBarry Smith   else if (flg3) {
87dbb450caSBarry Smith     *type = MATSEQBDIAG;
88dbb450caSBarry Smith     *set = 1;
89dbb450caSBarry Smith   }
9025cdf11fSBarry Smith   else if (flg4) {
91dbb450caSBarry Smith     *type = MATMPIBDIAG;
92dbb450caSBarry Smith     *set = 1;
93dbb450caSBarry Smith   }
9425cdf11fSBarry Smith   else if (flg5) {
95dbb450caSBarry Smith     *type = MATMPIROWBS;
96dbb450caSBarry Smith     *set = 1;
97dbb450caSBarry Smith   }
9825cdf11fSBarry Smith   else if (flg8) {
99dbb450caSBarry Smith     *type = MATMPIAIJ;
100dbb450caSBarry Smith     *set = 1;
101dbb450caSBarry Smith   }
10225cdf11fSBarry Smith   else if (flg9){
103dbb450caSBarry Smith     *type = MATSEQAIJ;
104dbb450caSBarry Smith     *set = 1;
105dbb450caSBarry Smith   }
10625cdf11fSBarry Smith   else if (flg10) {
10717699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
108dbb450caSBarry Smith     else *type = MATMPIAIJ;
109dbb450caSBarry Smith     *set = 1;
110dbb450caSBarry Smith   }
11135aab85fSBarry Smith   else if (flg11) {
11235aab85fSBarry Smith     *type = MATSEQBAIJ;
11335aab85fSBarry Smith     *set = 1;
11435aab85fSBarry Smith   }
11525cdf11fSBarry Smith   else if (flg12) {
11617699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQBDIAG;
117dbb450caSBarry Smith     else *type = MATMPIBDIAG;
118dbb450caSBarry Smith     *set = 1;
119dbb450caSBarry Smith   }
12025cdf11fSBarry Smith   else if (flg13) {
12139ddd567SLois Curfman McInnes     if (size == 1) *type = MATSEQDENSE;
12239ddd567SLois Curfman McInnes     else *type = MATMPIDENSE;
12339ddd567SLois Curfman McInnes     *set = 1;
12439ddd567SLois Curfman McInnes   }
125d218f8d9SSatish Balay   else if (flg14) {
12690fe702eSLois Curfman McInnes     *type = MATMPIBAIJ;
12790fe702eSLois Curfman McInnes     *set = 1;
12890fe702eSLois Curfman McInnes   }
12990fe702eSLois Curfman McInnes   else if (flg15) {
130d218f8d9SSatish Balay     if (size == 1) *type = MATSEQBAIJ;
1312eadb931SSatish Balay     else *type = MATMPIBAIJ;
132d218f8d9SSatish Balay     *set = 1;
133d218f8d9SSatish Balay   }
134dbb450caSBarry Smith   else {
13517699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
136dbb450caSBarry Smith     else *type = MATMPIAIJ;
137dbb450caSBarry Smith     *set = 0;
138dbb450caSBarry Smith   }
139dbb450caSBarry Smith   return 0;
140dbb450caSBarry Smith }
141dbb450caSBarry Smith 
142325ab940SBarry Smith /*@C
1436469c4f9SBarry Smith    MatCreate - Creates a matrix, where the type is determined
14402a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
14583e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
14683e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
14783e1b59cSLois Curfman McInnes 
1487807a1faSBarry Smith    Input Parameters:
149e0b365e2SLois Curfman McInnes .  m - number of global rows
150e0b365e2SLois Curfman McInnes .  n - number of global columns
1516b5873e3SBarry Smith .  comm - MPI communicator
1527807a1faSBarry Smith 
1537807a1faSBarry Smith    Output Parameter:
154dc401e71SLois Curfman McInnes .  A - the matrix
155e0b365e2SLois Curfman McInnes 
156dc401e71SLois Curfman McInnes    Basic Options Database Keys:
157dc401e71SLois Curfman McInnes    These options use MatCreateSeqXXX or MatCreateMPIXXX,
158dc401e71SLois Curfman McInnes    depending on the communicator, comm.
159dc401e71SLois Curfman McInnes $    -mat_aij      : AIJ type
16083e1b59cSLois Curfman McInnes $    -mat_baij     : block AIJ type
161dc401e71SLois Curfman McInnes $    -mat_dense    : dense type
162dc401e71SLois Curfman McInnes $    -mat_bdiag    : block diagonal type
163dc401e71SLois Curfman McInnes 
164dc401e71SLois Curfman McInnes    More Options Database Keys:
16583e1b59cSLois Curfman McInnes $    -mat_seqaij   : AIJ type, uses MatCreateSeqAIJ()
16683e1b59cSLois Curfman McInnes $    -mat_mpiaij   : AIJ type, uses MatCreateMPIAIJ()
167dbb450caSBarry Smith $    -mat_seqbdiag : block diagonal type, uses
168fafbff53SBarry Smith $                    MatCreateSeqBDiag()
1697641ccfcSLois Curfman McInnes $    -mat_mpibdiag : block diagonal type, uses
1707641ccfcSLois Curfman McInnes $                    MatCreateMPIBDiag()
1717641ccfcSLois Curfman McInnes $    -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs()
17258a0a7b1SLois Curfman McInnes $    -mat_seqdense : dense type, uses MatCreateSeqDense()
17339ddd567SLois Curfman McInnes $    -mat_mpidense : dense type, uses MatCreateMPIDense()
174dc401e71SLois Curfman McInnes $    -mat_seqbaij  : block AIJ type, uses MatCreateSeqBAIJ()
17583e1b59cSLois Curfman McInnes $    -mat_mpibaij  : block AIJ type, uses MatCreateMPIBAIJ()
176e0b365e2SLois Curfman McInnes 
17783e1b59cSLois Curfman McInnes    Even More Options Database Keys:
17883e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
17983e1b59cSLois Curfman McInnes    for additional format-specific options.
180e0b365e2SLois Curfman McInnes 
181bd9ce289SLois Curfman McInnes    Notes:
182bd9ce289SLois Curfman McInnes    This routine calls MatGetTypeFromOptions() to determind the matrix type.
183bd9ce289SLois Curfman McInnes 
184dc401e71SLois Curfman McInnes .keywords: matrix, create
185e0b365e2SLois Curfman McInnes 
186fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
187fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
18839ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
189ce4fbee9SSatish Balay           MatCreateMPIRowbs(), MatCreateSeqBAIJ,
190ce4fbee9SSatish Balay           MatConvert(), MatGetTypeFromOptions()
1917807a1faSBarry Smith  @*/
19287bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A)
1937807a1faSBarry Smith {
194dbb450caSBarry Smith   MatType type;
195df7baab8SSatish Balay   int     set, ierr, bs=1, flg;
196dbb450caSBarry Smith 
19777c4ece6SBarry Smith   ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr);
198dfa27b74SSatish Balay   switch (type) {
199dfa27b74SSatish Balay   case MATSEQDENSE:
20087bddb72SLois Curfman McInnes     ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr);
201dfa27b74SSatish Balay     break;
202dfa27b74SSatish Balay   case MATMPIBDIAG:
203ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT,
20487bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr);
205dfa27b74SSatish Balay     break;
206dfa27b74SSatish Balay   case MATSEQBDIAG:
207ed1f4bc7SLois Curfman McInnes     ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,
20887bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
209dfa27b74SSatish Balay     break;
210dfa27b74SSatish Balay   case MATMPIROWBS:
211ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL,
21287bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
213dfa27b74SSatish Balay     break;
214dfa27b74SSatish Balay   case MATMPIDENSE:
21587bddb72SLois Curfman McInnes     ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr);
216dfa27b74SSatish Balay     break;
217dfa27b74SSatish Balay   case MATMPIAIJ:
218ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,
21987bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
220dfa27b74SSatish Balay     break;
221dfa27b74SSatish Balay   case MATSEQBAIJ:
222cd0e1443SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
22387bddb72SLois Curfman McInnes     ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
224ed1f4bc7SLois Curfman McInnes     break;
2258130634dSSatish Balay   case MATMPIBAIJ:
2268130634dSSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
227bf39df47SSatish Balay     ierr = MatCreateMPIBAIJ(comm,bs,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
2288130634dSSatish Balay     break;
22924b2b559SSatish Balay   default:
23087bddb72SLois Curfman McInnes     ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
23124b2b559SSatish Balay     break;
232dfa27b74SSatish Balay   }
23364761f52SSatish Balay   return 0;
2347807a1faSBarry Smith }
2357807a1faSBarry Smith 
23670f55243SBarry Smith #include "src/mat/matimpl.h"
237dae03382SLois Curfman McInnes /*@C
2384b0e389bSBarry Smith    MatGetType - Gets the matrix type and name (as a string) from the matrix.
239dae03382SLois Curfman McInnes 
240dae03382SLois Curfman McInnes    Input Parameter:
241dae03382SLois Curfman McInnes .  mat - the matrix
242dae03382SLois Curfman McInnes 
243dae03382SLois Curfman McInnes    Output Parameter:
2449a28b0a6SLois Curfman McInnes .  type - the matrix type (or use PETSC_NULL)
2459a28b0a6SLois Curfman McInnes .  name - name of matrix type (or use PETSC_NULL)
246dae03382SLois Curfman McInnes 
2475f44292fSLois Curfman McInnes .keywords: matrix, get, type, name
248dae03382SLois Curfman McInnes @*/
2494b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name)
250dae03382SLois Curfman McInnes {
251dae03382SLois Curfman McInnes   int  itype = (int)mat->type;
25239ddd567SLois Curfman McInnes   char *matname[10];
253d5d45c9bSBarry Smith 
2544b0e389bSBarry Smith   if (type) *type = (MatType) mat->type;
2554b0e389bSBarry Smith   if (name) {
256416022c9SBarry Smith     /* Note:  Be sure that this list corresponds to the enum in mat.h */
257ec8511deSBarry Smith     matname[0] = "MATSEQDENSE";
258ec8511deSBarry Smith     matname[1] = "MATSEQAIJ";
259dae03382SLois Curfman McInnes     matname[2] = "MATMPIAIJ";
260dae03382SLois Curfman McInnes     matname[3] = "MATSHELL";
261c456f294SBarry Smith     matname[4] = "MATMPIROWBS";
262c456f294SBarry Smith     matname[5] = "MATSEQBDIAG";
263c456f294SBarry Smith     matname[6] = "MATMPIBDIAG";
264c456f294SBarry Smith     matname[7] = "MATMPIDENSE";
265da045f9dSSatish Balay     matname[8] = "MATSEQBAIJ";
26632e66d44SSatish Balay     matname[9] = "MATMPIBAIJ";
267da045f9dSSatish Balay 
26832e66d44SSatish Balay     if (itype < 0 || itype > 9) *name = "Unknown matrix type";
269dae03382SLois Curfman McInnes     else                        *name = matname[itype];
2704b0e389bSBarry Smith   }
271dae03382SLois Curfman McInnes   return 0;
272dae03382SLois Curfman McInnes }
273dae03382SLois Curfman McInnes 
274d5d45c9bSBarry Smith 
275d5d45c9bSBarry Smith 
276