xref: /petsc/src/mat/utils/gcreate.c (revision 90f02eec332fcca4c33b4e7b21cabed76bf0614e)
15baf8537SBarry Smith 
2cb512458SBarry Smith #ifndef lint
3*90f02eecSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.98 1996/09/28 16:06:05 curfman 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 
53*90f02eecSBarry Smith   PetscValidIntPointer(type); PetscValidIntPointer(set);
54*90f02eecSBarry Smith 
556daaf66cSBarry Smith   PetscStrcpy(p,"-");
566daaf66cSBarry Smith   if (pre) PetscStrcat(p,pre);
576daaf66cSBarry Smith 
5817699dbbSLois Curfman McInnes   MPI_Comm_size(comm,&size);
5925cdf11fSBarry Smith   ierr = OptionsHasName(PETSC_NULL,"-help",&flg1); CHKERRQ(ierr);
6025cdf11fSBarry Smith   if (flg1) {
6177c4ece6SBarry Smith     PetscPrintf(comm,"Matrix format options:\n");
6277c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p);
6390fe702eSLois Curfman McInnes     PetscPrintf(comm,"  %smat_baij, %smat_seqbaij, %smat_mpibaij\n",p,p,p);
6477c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p);
6577c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p);
66dbb450caSBarry Smith   }
6725cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr);
6825cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr);
6925cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr);
7025cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr);
7125cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr);
7235aab85fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr);
73d218f8d9SSatish Balay   ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr);
7425cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr);
7525cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr);
7625cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr);
7725cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr);
7825cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr);
7990fe702eSLois Curfman McInnes   ierr = OptionsHasName(pre,"-mat_baij",&flg15); CHKERRQ(ierr);
8025cdf11fSBarry Smith   if (flg1) {
81dbb450caSBarry Smith     *type = MATSEQDENSE;
82dbb450caSBarry Smith     *set = 1;
83dbb450caSBarry Smith   }
8425cdf11fSBarry Smith   else if (flg2) {
8539ddd567SLois Curfman McInnes     *type = MATMPIDENSE;
8639ddd567SLois Curfman McInnes     *set = 1;
8739ddd567SLois Curfman McInnes   }
8825cdf11fSBarry Smith   else if (flg3) {
89dbb450caSBarry Smith     *type = MATSEQBDIAG;
90dbb450caSBarry Smith     *set = 1;
91dbb450caSBarry Smith   }
9225cdf11fSBarry Smith   else if (flg4) {
93dbb450caSBarry Smith     *type = MATMPIBDIAG;
94dbb450caSBarry Smith     *set = 1;
95dbb450caSBarry Smith   }
9625cdf11fSBarry Smith   else if (flg5) {
97dbb450caSBarry Smith     *type = MATMPIROWBS;
98dbb450caSBarry Smith     *set = 1;
99dbb450caSBarry Smith   }
10025cdf11fSBarry Smith   else if (flg8) {
101dbb450caSBarry Smith     *type = MATMPIAIJ;
102dbb450caSBarry Smith     *set = 1;
103dbb450caSBarry Smith   }
10425cdf11fSBarry Smith   else if (flg9){
105dbb450caSBarry Smith     *type = MATSEQAIJ;
106dbb450caSBarry Smith     *set = 1;
107dbb450caSBarry Smith   }
10825cdf11fSBarry Smith   else if (flg10) {
10917699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
110dbb450caSBarry Smith     else *type = MATMPIAIJ;
111dbb450caSBarry Smith     *set = 1;
112dbb450caSBarry Smith   }
11335aab85fSBarry Smith   else if (flg11) {
11435aab85fSBarry Smith     *type = MATSEQBAIJ;
11535aab85fSBarry Smith     *set = 1;
11635aab85fSBarry Smith   }
11725cdf11fSBarry Smith   else if (flg12) {
11817699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQBDIAG;
119dbb450caSBarry Smith     else *type = MATMPIBDIAG;
120dbb450caSBarry Smith     *set = 1;
121dbb450caSBarry Smith   }
12225cdf11fSBarry Smith   else if (flg13) {
12339ddd567SLois Curfman McInnes     if (size == 1) *type = MATSEQDENSE;
12439ddd567SLois Curfman McInnes     else *type = MATMPIDENSE;
12539ddd567SLois Curfman McInnes     *set = 1;
12639ddd567SLois Curfman McInnes   }
127d218f8d9SSatish Balay   else if (flg14) {
12890fe702eSLois Curfman McInnes     *type = MATMPIBAIJ;
12990fe702eSLois Curfman McInnes     *set = 1;
13090fe702eSLois Curfman McInnes   }
13190fe702eSLois Curfman McInnes   else if (flg15) {
132d218f8d9SSatish Balay     if (size == 1) *type = MATSEQBAIJ;
1332eadb931SSatish Balay     else *type = MATMPIBAIJ;
134d218f8d9SSatish Balay     *set = 1;
135d218f8d9SSatish Balay   }
136dbb450caSBarry Smith   else {
13717699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
138dbb450caSBarry Smith     else *type = MATMPIAIJ;
139dbb450caSBarry Smith     *set = 0;
140dbb450caSBarry Smith   }
141dbb450caSBarry Smith   return 0;
142dbb450caSBarry Smith }
143dbb450caSBarry Smith 
144325ab940SBarry Smith /*@C
14569dd0797SLois Curfman McInnes    MatCreate - Creates a matrix where the type is determined
14602a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
14783e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
14883e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
14983e1b59cSLois Curfman McInnes 
1507807a1faSBarry Smith    Input Parameters:
151e0b365e2SLois Curfman McInnes .  m - number of global rows
152e0b365e2SLois Curfman McInnes .  n - number of global columns
1536b5873e3SBarry Smith .  comm - MPI communicator
1547807a1faSBarry Smith 
1557807a1faSBarry Smith    Output Parameter:
156dc401e71SLois Curfman McInnes .  A - the matrix
157e0b365e2SLois Curfman McInnes 
158dc401e71SLois Curfman McInnes    Basic Options Database Keys:
159dc401e71SLois Curfman McInnes    These options use MatCreateSeqXXX or MatCreateMPIXXX,
160dc401e71SLois Curfman McInnes    depending on the communicator, comm.
161dc401e71SLois Curfman McInnes $    -mat_aij      : AIJ type
16283e1b59cSLois Curfman McInnes $    -mat_baij     : block AIJ type
163dc401e71SLois Curfman McInnes $    -mat_dense    : dense type
164dc401e71SLois Curfman McInnes $    -mat_bdiag    : block diagonal type
165dc401e71SLois Curfman McInnes 
166dc401e71SLois Curfman McInnes    More Options Database Keys:
16783e1b59cSLois Curfman McInnes $    -mat_seqaij   : AIJ type, uses MatCreateSeqAIJ()
16883e1b59cSLois Curfman McInnes $    -mat_mpiaij   : AIJ type, uses MatCreateMPIAIJ()
169dbb450caSBarry Smith $    -mat_seqbdiag : block diagonal type, uses
170fafbff53SBarry Smith $                    MatCreateSeqBDiag()
1717641ccfcSLois Curfman McInnes $    -mat_mpibdiag : block diagonal type, uses
1727641ccfcSLois Curfman McInnes $                    MatCreateMPIBDiag()
1737641ccfcSLois Curfman McInnes $    -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs()
17458a0a7b1SLois Curfman McInnes $    -mat_seqdense : dense type, uses MatCreateSeqDense()
17539ddd567SLois Curfman McInnes $    -mat_mpidense : dense type, uses MatCreateMPIDense()
176dc401e71SLois Curfman McInnes $    -mat_seqbaij  : block AIJ type, uses MatCreateSeqBAIJ()
17783e1b59cSLois Curfman McInnes $    -mat_mpibaij  : block AIJ type, uses MatCreateMPIBAIJ()
178e0b365e2SLois Curfman McInnes 
17983e1b59cSLois Curfman McInnes    Even More Options Database Keys:
18083e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
18183e1b59cSLois Curfman McInnes    for additional format-specific options.
182e0b365e2SLois Curfman McInnes 
183bd9ce289SLois Curfman McInnes    Notes:
184bd9ce289SLois Curfman McInnes    This routine calls MatGetTypeFromOptions() to determind the matrix type.
185bd9ce289SLois Curfman McInnes 
186dc401e71SLois Curfman McInnes .keywords: matrix, create
187e0b365e2SLois Curfman McInnes 
188fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
189fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
19039ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
191ce4fbee9SSatish Balay           MatCreateMPIRowbs(), MatCreateSeqBAIJ,
192ce4fbee9SSatish Balay           MatConvert(), MatGetTypeFromOptions()
1937807a1faSBarry Smith  @*/
19487bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A)
1957807a1faSBarry Smith {
196dbb450caSBarry Smith   MatType type;
197df7baab8SSatish Balay   int     set, ierr, bs=1, flg;
198dbb450caSBarry Smith 
19977c4ece6SBarry Smith   ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr);
200dfa27b74SSatish Balay   switch (type) {
201dfa27b74SSatish Balay   case MATSEQDENSE:
20287bddb72SLois Curfman McInnes     ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr);
203dfa27b74SSatish Balay     break;
204dfa27b74SSatish Balay   case MATMPIBDIAG:
205ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT,
20687bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr);
207dfa27b74SSatish Balay     break;
208dfa27b74SSatish Balay   case MATSEQBDIAG:
209ed1f4bc7SLois Curfman McInnes     ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,
21087bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
211dfa27b74SSatish Balay     break;
212dfa27b74SSatish Balay   case MATMPIROWBS:
213ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL,
21487bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
215dfa27b74SSatish Balay     break;
216dfa27b74SSatish Balay   case MATMPIDENSE:
21787bddb72SLois Curfman McInnes     ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr);
218dfa27b74SSatish Balay     break;
219dfa27b74SSatish Balay   case MATMPIAIJ:
220ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,
22187bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
222dfa27b74SSatish Balay     break;
223dfa27b74SSatish Balay   case MATSEQBAIJ:
224cd0e1443SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
22587bddb72SLois Curfman McInnes     ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
226ed1f4bc7SLois Curfman McInnes     break;
2278130634dSSatish Balay   case MATMPIBAIJ:
2288130634dSSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
229bf39df47SSatish Balay     ierr = MatCreateMPIBAIJ(comm,bs,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
2308130634dSSatish Balay     break;
23124b2b559SSatish Balay   default:
23287bddb72SLois Curfman McInnes     ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
23324b2b559SSatish Balay     break;
234dfa27b74SSatish Balay   }
23564761f52SSatish Balay   return 0;
2367807a1faSBarry Smith }
2377807a1faSBarry Smith 
23870f55243SBarry Smith #include "src/mat/matimpl.h"
239dae03382SLois Curfman McInnes /*@C
2404b0e389bSBarry Smith    MatGetType - Gets the matrix type and name (as a string) from the matrix.
241dae03382SLois Curfman McInnes 
242dae03382SLois Curfman McInnes    Input Parameter:
243dae03382SLois Curfman McInnes .  mat - the matrix
244dae03382SLois Curfman McInnes 
245dae03382SLois Curfman McInnes    Output Parameter:
2469a28b0a6SLois Curfman McInnes .  type - the matrix type (or use PETSC_NULL)
2479a28b0a6SLois Curfman McInnes .  name - name of matrix type (or use PETSC_NULL)
248dae03382SLois Curfman McInnes 
2495f44292fSLois Curfman McInnes .keywords: matrix, get, type, name
250dae03382SLois Curfman McInnes @*/
2514b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name)
252dae03382SLois Curfman McInnes {
253dae03382SLois Curfman McInnes   int  itype = (int)mat->type;
25439ddd567SLois Curfman McInnes   char *matname[10];
255d5d45c9bSBarry Smith 
256*90f02eecSBarry Smith   PetscValidHeaderSpecific(mat,MAT_COOKIE);
257*90f02eecSBarry Smith 
2584b0e389bSBarry Smith   if (type) *type = (MatType) mat->type;
2594b0e389bSBarry Smith   if (name) {
260416022c9SBarry Smith     /* Note:  Be sure that this list corresponds to the enum in mat.h */
261ec8511deSBarry Smith     matname[0] = "MATSEQDENSE";
262ec8511deSBarry Smith     matname[1] = "MATSEQAIJ";
263dae03382SLois Curfman McInnes     matname[2] = "MATMPIAIJ";
264dae03382SLois Curfman McInnes     matname[3] = "MATSHELL";
265c456f294SBarry Smith     matname[4] = "MATMPIROWBS";
266c456f294SBarry Smith     matname[5] = "MATSEQBDIAG";
267c456f294SBarry Smith     matname[6] = "MATMPIBDIAG";
268c456f294SBarry Smith     matname[7] = "MATMPIDENSE";
269da045f9dSSatish Balay     matname[8] = "MATSEQBAIJ";
27032e66d44SSatish Balay     matname[9] = "MATMPIBAIJ";
271da045f9dSSatish Balay 
27232e66d44SSatish Balay     if (itype < 0 || itype > 9) *name = "Unknown matrix type";
273dae03382SLois Curfman McInnes     else                        *name = matname[itype];
2744b0e389bSBarry Smith   }
275dae03382SLois Curfman McInnes   return 0;
276dae03382SLois Curfman McInnes }
277dae03382SLois Curfman McInnes 
278d5d45c9bSBarry Smith 
279d5d45c9bSBarry Smith 
280