xref: /petsc/src/mat/utils/gcreate.c (revision bd9ce289c0ddb65749fb20b1017f61cdee922bba)
1cb512458SBarry Smith #ifndef lint
2*bd9ce289SLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.92 1996/07/08 01:30:56 curfman Exp curfman $";
3cb512458SBarry Smith #endif
47807a1faSBarry Smith 
57807a1faSBarry Smith #include "sys.h"
648b35521SBarry Smith #include "mat.h"       /*I "mat.h"  I*/
77807a1faSBarry Smith 
8e3726954SLois Curfman McInnes /*@C
977c4ece6SBarry Smith    MatGetTypeFromOptions - Determines from the options database what matrix
108c645567SLois Curfman McInnes    format the user has specified.
11416022c9SBarry Smith 
12932b0c3eSLois Curfman McInnes    Input Parameter:
13932b0c3eSLois Curfman McInnes .  comm - the MPI communicator
1439ddd567SLois Curfman McInnes .  type - the type of matrix desired, for example MATSEQAIJ, MATMPIAIJ
15e3726954SLois Curfman McInnes .  pre - optional string to prepend to the name
16416022c9SBarry Smith 
17416022c9SBarry Smith    Output Parameters:
18932b0c3eSLois Curfman McInnes .  set - flag indicating whether user set matrix type option.
19416022c9SBarry Smith 
2026b119abSLois Curfman McInnes    Basic Options Database Keys:
2126b119abSLois Curfman McInnes    These options return MATSEQxxx or MATMPIxxx,
2226b119abSLois Curfman McInnes    depending on the communicator, comm.
2326b119abSLois Curfman McInnes $    -mat_aij      : AIJ type
2426b119abSLois Curfman McInnes $    -mat_baij     : block AIJ type
2526b119abSLois Curfman McInnes $    -mat_dense    : dense type
2626b119abSLois Curfman McInnes $    -mat_bdiag    : block diagonal type
2726b119abSLois Curfman McInnes 
2826b119abSLois Curfman McInnes    More Options Database Keys:
2926b119abSLois Curfman McInnes $    -mat_seqaij   : MATSEQAIJ
3026b119abSLois Curfman McInnes $    -mat_mpiaij   : MATMPIAIJ
3126b119abSLois Curfman McInnes $    -mat_seqbaij  : MATSEQBAIJ
3226b119abSLois Curfman McInnes $    -mat_mpibaij  : MATMPIBAIJ
3326b119abSLois Curfman McInnes $    -mat_seqbdiag : MATSEQBDAIG
3426b119abSLois Curfman McInnes $    -mat_mpibdiag : MATMPIBDIAG
3526b119abSLois Curfman McInnes $    -mat_mpirowbs : MATMPIROWBS
3626b119abSLois Curfman McInnes $    -mat_seqdense : MATSEQDENSE
3726b119abSLois Curfman McInnes $    -mat_mpidense : MATMPIDENSE
3826b119abSLois Curfman McInnes 
398c645567SLois Curfman McInnes    Note:
4026b119abSLois Curfman McInnes    This routine is automatically called within MatCreate() and MatLoad().
418c645567SLois Curfman McInnes 
4239ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options
4339ddd567SLois Curfman McInnes 
4426b119abSLois Curfman McInnes .seealso: MatCreate(), MatLoad()
45416022c9SBarry Smith @*/
46e3726954SLois Curfman McInnes 
4777c4ece6SBarry Smith int MatGetTypeFromOptions(MPI_Comm comm,char *pre,MatType *type,int *set)
48dbb450caSBarry Smith {
4990fe702eSLois Curfman McInnes   int  size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr,flg11,flg14,flg15;
506daaf66cSBarry Smith   char p[64];
51d5d45c9bSBarry Smith 
526daaf66cSBarry Smith   PetscStrcpy(p,"-");
536daaf66cSBarry Smith   if (pre) PetscStrcat(p,pre);
546daaf66cSBarry Smith 
5517699dbbSLois Curfman McInnes   MPI_Comm_size(comm,&size);
5625cdf11fSBarry Smith   ierr = OptionsHasName(PETSC_NULL,"-help",&flg1); CHKERRQ(ierr);
5725cdf11fSBarry Smith   if (flg1) {
5877c4ece6SBarry Smith     PetscPrintf(comm,"Matrix format options:\n");
5977c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p);
6090fe702eSLois Curfman McInnes     PetscPrintf(comm,"  %smat_baij, %smat_seqbaij, %smat_mpibaij\n",p,p,p);
6177c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p);
6277c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p);
63dbb450caSBarry Smith   }
6425cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr);
6525cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr);
6625cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr);
6725cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr);
6825cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr);
6935aab85fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr);
70d218f8d9SSatish Balay   ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr);
7125cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr);
7225cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr);
7325cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr);
7425cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr);
7525cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr);
7690fe702eSLois Curfman McInnes   ierr = OptionsHasName(pre,"-mat_baij",&flg15); CHKERRQ(ierr);
7725cdf11fSBarry Smith   if (flg1) {
78dbb450caSBarry Smith     *type = MATSEQDENSE;
79dbb450caSBarry Smith     *set = 1;
80dbb450caSBarry Smith   }
8125cdf11fSBarry Smith   else if (flg2) {
8239ddd567SLois Curfman McInnes     *type = MATMPIDENSE;
8339ddd567SLois Curfman McInnes     *set = 1;
8439ddd567SLois Curfman McInnes   }
8525cdf11fSBarry Smith   else if (flg3) {
86dbb450caSBarry Smith     *type = MATSEQBDIAG;
87dbb450caSBarry Smith     *set = 1;
88dbb450caSBarry Smith   }
8925cdf11fSBarry Smith   else if (flg4) {
90dbb450caSBarry Smith     *type = MATMPIBDIAG;
91dbb450caSBarry Smith     *set = 1;
92dbb450caSBarry Smith   }
9325cdf11fSBarry Smith   else if (flg5) {
94dbb450caSBarry Smith     *type = MATMPIROWBS;
95dbb450caSBarry Smith     *set = 1;
96dbb450caSBarry Smith   }
9725cdf11fSBarry Smith   else if (flg8) {
98dbb450caSBarry Smith     *type = MATMPIAIJ;
99dbb450caSBarry Smith     *set = 1;
100dbb450caSBarry Smith   }
10125cdf11fSBarry Smith   else if (flg9){
102dbb450caSBarry Smith     *type = MATSEQAIJ;
103dbb450caSBarry Smith     *set = 1;
104dbb450caSBarry Smith   }
10525cdf11fSBarry Smith   else if (flg10) {
10617699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
107dbb450caSBarry Smith     else *type = MATMPIAIJ;
108dbb450caSBarry Smith     *set = 1;
109dbb450caSBarry Smith   }
11035aab85fSBarry Smith   else if (flg11) {
11135aab85fSBarry Smith     *type = MATSEQBAIJ;
11235aab85fSBarry Smith     *set = 1;
11335aab85fSBarry Smith   }
11425cdf11fSBarry Smith   else if (flg12) {
11517699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQBDIAG;
116dbb450caSBarry Smith     else *type = MATMPIBDIAG;
117dbb450caSBarry Smith     *set = 1;
118dbb450caSBarry Smith   }
11925cdf11fSBarry Smith   else if (flg13) {
12039ddd567SLois Curfman McInnes     if (size == 1) *type = MATSEQDENSE;
12139ddd567SLois Curfman McInnes     else *type = MATMPIDENSE;
12239ddd567SLois Curfman McInnes     *set = 1;
12339ddd567SLois Curfman McInnes   }
124d218f8d9SSatish Balay   else if (flg14) {
12590fe702eSLois Curfman McInnes     *type = MATMPIBAIJ;
12690fe702eSLois Curfman McInnes     *set = 1;
12790fe702eSLois Curfman McInnes   }
12890fe702eSLois Curfman McInnes   else if (flg15) {
129d218f8d9SSatish Balay     if (size == 1) *type = MATSEQBAIJ;
1302eadb931SSatish Balay     else *type = MATMPIBAIJ;
131d218f8d9SSatish Balay     *set = 1;
132d218f8d9SSatish Balay   }
133dbb450caSBarry Smith   else {
13417699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
135dbb450caSBarry Smith     else *type = MATMPIAIJ;
136dbb450caSBarry Smith     *set = 0;
137dbb450caSBarry Smith   }
138dbb450caSBarry Smith   return 0;
139dbb450caSBarry Smith }
140dbb450caSBarry Smith 
141325ab940SBarry Smith /*@C
1426469c4f9SBarry Smith    MatCreate - Creates a matrix, where the type is determined
14302a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
14483e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
14583e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
14683e1b59cSLois Curfman McInnes 
1477807a1faSBarry Smith    Input Parameters:
148e0b365e2SLois Curfman McInnes .  m - number of global rows
149e0b365e2SLois Curfman McInnes .  n - number of global columns
1506b5873e3SBarry Smith .  comm - MPI communicator
1517807a1faSBarry Smith 
1527807a1faSBarry Smith    Output Parameter:
153dc401e71SLois Curfman McInnes .  A - the matrix
154e0b365e2SLois Curfman McInnes 
155dc401e71SLois Curfman McInnes    Basic Options Database Keys:
156dc401e71SLois Curfman McInnes    These options use MatCreateSeqXXX or MatCreateMPIXXX,
157dc401e71SLois Curfman McInnes    depending on the communicator, comm.
158dc401e71SLois Curfman McInnes $    -mat_aij      : AIJ type
15983e1b59cSLois Curfman McInnes $    -mat_baij     : block AIJ type
160dc401e71SLois Curfman McInnes $    -mat_dense    : dense type
161dc401e71SLois Curfman McInnes $    -mat_bdiag    : block diagonal type
162dc401e71SLois Curfman McInnes 
163dc401e71SLois Curfman McInnes    More Options Database Keys:
16483e1b59cSLois Curfman McInnes $    -mat_seqaij   : AIJ type, uses MatCreateSeqAIJ()
16583e1b59cSLois Curfman McInnes $    -mat_mpiaij   : AIJ type, uses MatCreateMPIAIJ()
166dbb450caSBarry Smith $    -mat_seqbdiag : block diagonal type, uses
167fafbff53SBarry Smith $                    MatCreateSeqBDiag()
1687641ccfcSLois Curfman McInnes $    -mat_mpibdiag : block diagonal type, uses
1697641ccfcSLois Curfman McInnes $                    MatCreateMPIBDiag()
1707641ccfcSLois Curfman McInnes $    -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs()
17158a0a7b1SLois Curfman McInnes $    -mat_seqdense : dense type, uses MatCreateSeqDense()
17239ddd567SLois Curfman McInnes $    -mat_mpidense : dense type, uses MatCreateMPIDense()
173dc401e71SLois Curfman McInnes $    -mat_seqbaij  : block AIJ type, uses MatCreateSeqBAIJ()
17483e1b59cSLois Curfman McInnes $    -mat_mpibaij  : block AIJ type, uses MatCreateMPIBAIJ()
175e0b365e2SLois Curfman McInnes 
17683e1b59cSLois Curfman McInnes    Even More Options Database Keys:
17783e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
17883e1b59cSLois Curfman McInnes    for additional format-specific options.
179e0b365e2SLois Curfman McInnes 
180*bd9ce289SLois Curfman McInnes    Notes:
181*bd9ce289SLois Curfman McInnes    This routine calls MatGetTypeFromOptions() to determind the matrix type.
182*bd9ce289SLois Curfman McInnes 
183dc401e71SLois Curfman McInnes .keywords: matrix, create
184e0b365e2SLois Curfman McInnes 
185fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
186fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
18739ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
188ce4fbee9SSatish Balay           MatCreateMPIRowbs(), MatCreateSeqBAIJ,
189ce4fbee9SSatish Balay           MatConvert(), MatGetTypeFromOptions()
1907807a1faSBarry Smith  @*/
19187bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A)
1927807a1faSBarry Smith {
193dbb450caSBarry Smith   MatType type;
194df7baab8SSatish Balay   int     set, ierr, bs=1, flg;
195dbb450caSBarry Smith 
19677c4ece6SBarry Smith   ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr);
197dfa27b74SSatish Balay   switch (type) {
198dfa27b74SSatish Balay   case MATSEQDENSE:
19987bddb72SLois Curfman McInnes     ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr);
200dfa27b74SSatish Balay     break;
201dfa27b74SSatish Balay   case MATMPIBDIAG:
202ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT,
20387bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr);
204dfa27b74SSatish Balay     break;
205dfa27b74SSatish Balay   case MATSEQBDIAG:
206ed1f4bc7SLois Curfman McInnes     ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,
20787bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
208dfa27b74SSatish Balay     break;
209dfa27b74SSatish Balay   case MATMPIROWBS:
210ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL,
21187bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
212dfa27b74SSatish Balay     break;
213dfa27b74SSatish Balay   case MATMPIDENSE:
21487bddb72SLois Curfman McInnes     ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr);
215dfa27b74SSatish Balay     break;
216dfa27b74SSatish Balay   case MATMPIAIJ:
217ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,
21887bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
219dfa27b74SSatish Balay     break;
220dfa27b74SSatish Balay   case MATSEQBAIJ:
221cd0e1443SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
22287bddb72SLois Curfman McInnes     ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
223ed1f4bc7SLois Curfman McInnes     break;
2248130634dSSatish Balay   case MATMPIBAIJ:
2258130634dSSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
2268130634dSSatish Balay     ierr = MatCreateMPIBAIJ(comm,bs,PETSC_NULL,PETSC_NULL,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
2278130634dSSatish Balay     break;
22824b2b559SSatish Balay   default:
22987bddb72SLois Curfman McInnes     ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
23024b2b559SSatish Balay     break;
231dfa27b74SSatish Balay   }
23264761f52SSatish Balay   return 0;
2337807a1faSBarry Smith }
2347807a1faSBarry Smith 
235dae03382SLois Curfman McInnes #include "matimpl.h"
236dae03382SLois Curfman McInnes /*@C
2374b0e389bSBarry Smith    MatGetType - Gets the matrix type and name (as a string) from the matrix.
238dae03382SLois Curfman McInnes 
239dae03382SLois Curfman McInnes    Input Parameter:
240dae03382SLois Curfman McInnes .  mat - the matrix
241dae03382SLois Curfman McInnes 
242dae03382SLois Curfman McInnes    Output Parameter:
2439a28b0a6SLois Curfman McInnes .  type - the matrix type (or use PETSC_NULL)
2449a28b0a6SLois Curfman McInnes .  name - name of matrix type (or use PETSC_NULL)
245dae03382SLois Curfman McInnes 
2465f44292fSLois Curfman McInnes .keywords: matrix, get, type, name
247dae03382SLois Curfman McInnes @*/
2484b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name)
249dae03382SLois Curfman McInnes {
250dae03382SLois Curfman McInnes   int  itype = (int)mat->type;
25139ddd567SLois Curfman McInnes   char *matname[10];
252d5d45c9bSBarry Smith 
2534b0e389bSBarry Smith   if (type) *type = (MatType) mat->type;
2544b0e389bSBarry Smith   if (name) {
255416022c9SBarry Smith     /* Note:  Be sure that this list corresponds to the enum in mat.h */
256ec8511deSBarry Smith     matname[0] = "MATSEQDENSE";
257ec8511deSBarry Smith     matname[1] = "MATSEQAIJ";
258dae03382SLois Curfman McInnes     matname[2] = "MATMPIAIJ";
259dae03382SLois Curfman McInnes     matname[3] = "MATSHELL";
260c456f294SBarry Smith     matname[4] = "MATMPIROWBS";
261c456f294SBarry Smith     matname[5] = "MATSEQBDIAG";
262c456f294SBarry Smith     matname[6] = "MATMPIBDIAG";
263c456f294SBarry Smith     matname[7] = "MATMPIDENSE";
264da045f9dSSatish Balay     matname[8] = "MATSEQBAIJ";
265da045f9dSSatish Balay 
266e1ecba12SSatish Balay     if (itype < 0 || itype > 8) *name = "Unknown matrix type";
267dae03382SLois Curfman McInnes     else                        *name = matname[itype];
2684b0e389bSBarry Smith   }
269dae03382SLois Curfman McInnes   return 0;
270dae03382SLois Curfman McInnes }
271dae03382SLois Curfman McInnes 
272d5d45c9bSBarry Smith 
273d5d45c9bSBarry Smith 
274