xref: /petsc/src/mat/utils/gcreate.c (revision 5615d1e584023db9367fb782d85b1b4ebbb8df18)
15baf8537SBarry Smith 
2cb512458SBarry Smith #ifndef lint
3*5615d1e5SSatish Balay static char vcid[] = "$Id: gcreate.c,v 1.100 1996/12/16 22:25:17 balay Exp balay $";
4cb512458SBarry Smith #endif
57807a1faSBarry Smith 
67807a1faSBarry Smith #include "sys.h"
748b35521SBarry Smith #include "mat.h"       /*I "mat.h"  I*/
87807a1faSBarry Smith 
9*5615d1e5SSatish Balay #undef __FUNC__
10*5615d1e5SSatish Balay #define __FUNC__ "MatGetTypeFromOptions"
11e3726954SLois Curfman McInnes /*@C
1277c4ece6SBarry Smith    MatGetTypeFromOptions - Determines from the options database what matrix
138c645567SLois Curfman McInnes    format the user has specified.
14416022c9SBarry Smith 
15932b0c3eSLois Curfman McInnes    Input Parameter:
16932b0c3eSLois Curfman McInnes .  comm - the MPI communicator
1739ddd567SLois Curfman McInnes .  type - the type of matrix desired, for example MATSEQAIJ, MATMPIAIJ
18e3726954SLois Curfman McInnes .  pre - optional string to prepend to the name
19416022c9SBarry Smith 
20416022c9SBarry Smith    Output Parameters:
21932b0c3eSLois Curfman McInnes .  set - flag indicating whether user set matrix type option.
22416022c9SBarry Smith 
2326b119abSLois Curfman McInnes    Basic Options Database Keys:
2426b119abSLois Curfman McInnes    These options return MATSEQxxx or MATMPIxxx,
2526b119abSLois Curfman McInnes    depending on the communicator, comm.
2626b119abSLois Curfman McInnes $    -mat_aij      : AIJ type
2726b119abSLois Curfman McInnes $    -mat_baij     : block AIJ type
2826b119abSLois Curfman McInnes $    -mat_dense    : dense type
2926b119abSLois Curfman McInnes $    -mat_bdiag    : block diagonal type
3026b119abSLois Curfman McInnes 
3126b119abSLois Curfman McInnes    More Options Database Keys:
3226b119abSLois Curfman McInnes $    -mat_seqaij   : MATSEQAIJ
3326b119abSLois Curfman McInnes $    -mat_mpiaij   : MATMPIAIJ
3426b119abSLois Curfman McInnes $    -mat_seqbaij  : MATSEQBAIJ
3526b119abSLois Curfman McInnes $    -mat_mpibaij  : MATMPIBAIJ
3626b119abSLois Curfman McInnes $    -mat_seqbdiag : MATSEQBDAIG
3726b119abSLois Curfman McInnes $    -mat_mpibdiag : MATMPIBDIAG
3826b119abSLois Curfman McInnes $    -mat_mpirowbs : MATMPIROWBS
3926b119abSLois Curfman McInnes $    -mat_seqdense : MATSEQDENSE
4026b119abSLois Curfman McInnes $    -mat_mpidense : MATMPIDENSE
4126b119abSLois Curfman McInnes 
428c645567SLois Curfman McInnes    Note:
4326b119abSLois Curfman McInnes    This routine is automatically called within MatCreate() and MatLoad().
448c645567SLois Curfman McInnes 
4539ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options
4639ddd567SLois Curfman McInnes 
4726b119abSLois Curfman McInnes .seealso: MatCreate(), MatLoad()
48416022c9SBarry Smith @*/
49e3726954SLois Curfman McInnes 
5077c4ece6SBarry Smith int MatGetTypeFromOptions(MPI_Comm comm,char *pre,MatType *type,int *set)
51dbb450caSBarry Smith {
5290fe702eSLois Curfman McInnes   int  size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr,flg11,flg14,flg15;
536daaf66cSBarry Smith   char p[64];
54d5d45c9bSBarry Smith 
5590f02eecSBarry Smith   PetscValidIntPointer(type); PetscValidIntPointer(set);
5690f02eecSBarry Smith 
576daaf66cSBarry Smith   PetscStrcpy(p,"-");
586daaf66cSBarry Smith   if (pre) PetscStrcat(p,pre);
596daaf66cSBarry Smith 
6017699dbbSLois Curfman McInnes   MPI_Comm_size(comm,&size);
6125cdf11fSBarry Smith   ierr = OptionsHasName(PETSC_NULL,"-help",&flg1); CHKERRQ(ierr);
6225cdf11fSBarry Smith   if (flg1) {
6377c4ece6SBarry Smith     PetscPrintf(comm,"Matrix format options:\n");
6477c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p);
6590fe702eSLois Curfman McInnes     PetscPrintf(comm,"  %smat_baij, %smat_seqbaij, %smat_mpibaij\n",p,p,p);
6677c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p);
6777c4ece6SBarry Smith     PetscPrintf(comm,"  %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p);
68dbb450caSBarry Smith   }
6925cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr);
7025cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr);
7125cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr);
7225cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr);
7325cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr);
7435aab85fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr);
75d218f8d9SSatish Balay   ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr);
7625cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr);
7725cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr);
7825cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr);
7925cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr);
8025cdf11fSBarry Smith   ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr);
8190fe702eSLois Curfman McInnes   ierr = OptionsHasName(pre,"-mat_baij",&flg15); CHKERRQ(ierr);
8225cdf11fSBarry Smith   if (flg1) {
83dbb450caSBarry Smith     *type = MATSEQDENSE;
84dbb450caSBarry Smith     *set = 1;
85dbb450caSBarry Smith   }
8625cdf11fSBarry Smith   else if (flg2) {
8739ddd567SLois Curfman McInnes     *type = MATMPIDENSE;
8839ddd567SLois Curfman McInnes     *set = 1;
8939ddd567SLois Curfman McInnes   }
9025cdf11fSBarry Smith   else if (flg3) {
91dbb450caSBarry Smith     *type = MATSEQBDIAG;
92dbb450caSBarry Smith     *set = 1;
93dbb450caSBarry Smith   }
9425cdf11fSBarry Smith   else if (flg4) {
95dbb450caSBarry Smith     *type = MATMPIBDIAG;
96dbb450caSBarry Smith     *set = 1;
97dbb450caSBarry Smith   }
9825cdf11fSBarry Smith   else if (flg5) {
99dbb450caSBarry Smith     *type = MATMPIROWBS;
100dbb450caSBarry Smith     *set = 1;
101dbb450caSBarry Smith   }
10225cdf11fSBarry Smith   else if (flg8) {
103dbb450caSBarry Smith     *type = MATMPIAIJ;
104dbb450caSBarry Smith     *set = 1;
105dbb450caSBarry Smith   }
10625cdf11fSBarry Smith   else if (flg9){
107dbb450caSBarry Smith     *type = MATSEQAIJ;
108dbb450caSBarry Smith     *set = 1;
109dbb450caSBarry Smith   }
11025cdf11fSBarry Smith   else if (flg10) {
11117699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
112dbb450caSBarry Smith     else *type = MATMPIAIJ;
113dbb450caSBarry Smith     *set = 1;
114dbb450caSBarry Smith   }
11535aab85fSBarry Smith   else if (flg11) {
11635aab85fSBarry Smith     *type = MATSEQBAIJ;
11735aab85fSBarry Smith     *set = 1;
11835aab85fSBarry Smith   }
11925cdf11fSBarry Smith   else if (flg12) {
12017699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQBDIAG;
121dbb450caSBarry Smith     else *type = MATMPIBDIAG;
122dbb450caSBarry Smith     *set = 1;
123dbb450caSBarry Smith   }
12425cdf11fSBarry Smith   else if (flg13) {
12539ddd567SLois Curfman McInnes     if (size == 1) *type = MATSEQDENSE;
12639ddd567SLois Curfman McInnes     else *type = MATMPIDENSE;
12739ddd567SLois Curfman McInnes     *set = 1;
12839ddd567SLois Curfman McInnes   }
129d218f8d9SSatish Balay   else if (flg14) {
13090fe702eSLois Curfman McInnes     *type = MATMPIBAIJ;
13190fe702eSLois Curfman McInnes     *set = 1;
13290fe702eSLois Curfman McInnes   }
13390fe702eSLois Curfman McInnes   else if (flg15) {
134d218f8d9SSatish Balay     if (size == 1) *type = MATSEQBAIJ;
1352eadb931SSatish Balay     else *type = MATMPIBAIJ;
136d218f8d9SSatish Balay     *set = 1;
137d218f8d9SSatish Balay   }
138dbb450caSBarry Smith   else {
13917699dbbSLois Curfman McInnes     if (size == 1) *type = MATSEQAIJ;
140dbb450caSBarry Smith     else *type = MATMPIAIJ;
141dbb450caSBarry Smith     *set = 0;
142dbb450caSBarry Smith   }
143dbb450caSBarry Smith   return 0;
144dbb450caSBarry Smith }
145dbb450caSBarry Smith 
146*5615d1e5SSatish Balay #undef __FUNC__
147*5615d1e5SSatish Balay #define __FUNC__ "MatCreate"
148325ab940SBarry Smith /*@C
14969dd0797SLois Curfman McInnes    MatCreate - Creates a matrix where the type is determined
15002a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
15183e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
15283e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
15383e1b59cSLois Curfman McInnes 
1547807a1faSBarry Smith    Input Parameters:
155e0b365e2SLois Curfman McInnes .  m - number of global rows
156e0b365e2SLois Curfman McInnes .  n - number of global columns
1576b5873e3SBarry Smith .  comm - MPI communicator
1587807a1faSBarry Smith 
1597807a1faSBarry Smith    Output Parameter:
160dc401e71SLois Curfman McInnes .  A - the matrix
161e0b365e2SLois Curfman McInnes 
162dc401e71SLois Curfman McInnes    Basic Options Database Keys:
163dc401e71SLois Curfman McInnes    These options use MatCreateSeqXXX or MatCreateMPIXXX,
164dc401e71SLois Curfman McInnes    depending on the communicator, comm.
165dc401e71SLois Curfman McInnes $    -mat_aij      : AIJ type
16683e1b59cSLois Curfman McInnes $    -mat_baij     : block AIJ type
167dc401e71SLois Curfman McInnes $    -mat_dense    : dense type
168dc401e71SLois Curfman McInnes $    -mat_bdiag    : block diagonal type
169dc401e71SLois Curfman McInnes 
170dc401e71SLois Curfman McInnes    More Options Database Keys:
17183e1b59cSLois Curfman McInnes $    -mat_seqaij   : AIJ type, uses MatCreateSeqAIJ()
17283e1b59cSLois Curfman McInnes $    -mat_mpiaij   : AIJ type, uses MatCreateMPIAIJ()
173dbb450caSBarry Smith $    -mat_seqbdiag : block diagonal type, uses
174fafbff53SBarry Smith $                    MatCreateSeqBDiag()
1757641ccfcSLois Curfman McInnes $    -mat_mpibdiag : block diagonal type, uses
1767641ccfcSLois Curfman McInnes $                    MatCreateMPIBDiag()
1777641ccfcSLois Curfman McInnes $    -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs()
17858a0a7b1SLois Curfman McInnes $    -mat_seqdense : dense type, uses MatCreateSeqDense()
17939ddd567SLois Curfman McInnes $    -mat_mpidense : dense type, uses MatCreateMPIDense()
180dc401e71SLois Curfman McInnes $    -mat_seqbaij  : block AIJ type, uses MatCreateSeqBAIJ()
18183e1b59cSLois Curfman McInnes $    -mat_mpibaij  : block AIJ type, uses MatCreateMPIBAIJ()
182e0b365e2SLois Curfman McInnes 
18383e1b59cSLois Curfman McInnes    Even More Options Database Keys:
18483e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
18583e1b59cSLois Curfman McInnes    for additional format-specific options.
186e0b365e2SLois Curfman McInnes 
187bd9ce289SLois Curfman McInnes    Notes:
188bd9ce289SLois Curfman McInnes    This routine calls MatGetTypeFromOptions() to determind the matrix type.
189bd9ce289SLois Curfman McInnes 
190dc401e71SLois Curfman McInnes .keywords: matrix, create
191e0b365e2SLois Curfman McInnes 
192fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
193fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
19439ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
195ce4fbee9SSatish Balay           MatCreateMPIRowbs(), MatCreateSeqBAIJ,
196ce4fbee9SSatish Balay           MatConvert(), MatGetTypeFromOptions()
1977807a1faSBarry Smith  @*/
19887bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A)
1997807a1faSBarry Smith {
200dbb450caSBarry Smith   MatType type;
201df7baab8SSatish Balay   int     set, ierr, bs=1, flg;
202dbb450caSBarry Smith 
20377c4ece6SBarry Smith   ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr);
204dfa27b74SSatish Balay   switch (type) {
205dfa27b74SSatish Balay   case MATSEQDENSE:
20687bddb72SLois Curfman McInnes     ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr);
207dfa27b74SSatish Balay     break;
208dfa27b74SSatish Balay   case MATMPIBDIAG:
209ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT,
21087bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr);
211dfa27b74SSatish Balay     break;
212dfa27b74SSatish Balay   case MATSEQBDIAG:
213ed1f4bc7SLois Curfman McInnes     ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL,
21487bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
215dfa27b74SSatish Balay     break;
216dfa27b74SSatish Balay   case MATMPIROWBS:
217ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL,
21887bddb72SLois Curfman McInnes            PETSC_NULL,A); CHKERRQ(ierr);
219dfa27b74SSatish Balay     break;
220dfa27b74SSatish Balay   case MATMPIDENSE:
22187bddb72SLois Curfman McInnes     ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr);
222dfa27b74SSatish Balay     break;
223dfa27b74SSatish Balay   case MATMPIAIJ:
224ed1f4bc7SLois Curfman McInnes     ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,
22587bddb72SLois Curfman McInnes            PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
226dfa27b74SSatish Balay     break;
227dfa27b74SSatish Balay   case MATSEQBAIJ:
228cd0e1443SSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
22987bddb72SLois Curfman McInnes     ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
230ed1f4bc7SLois Curfman McInnes     break;
2318130634dSSatish Balay   case MATMPIBAIJ:
2328130634dSSatish Balay     ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr);
233bf39df47SSatish Balay     ierr = MatCreateMPIBAIJ(comm,bs,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
2348130634dSSatish Balay     break;
23524b2b559SSatish Balay   default:
23687bddb72SLois Curfman McInnes     ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr);
23724b2b559SSatish Balay     break;
238dfa27b74SSatish Balay   }
23964761f52SSatish Balay   return 0;
2407807a1faSBarry Smith }
2417807a1faSBarry Smith 
24270f55243SBarry Smith #include "src/mat/matimpl.h"
243*5615d1e5SSatish Balay #undef __FUNC__
244*5615d1e5SSatish Balay #define __FUNC__ "MatGetType"
245dae03382SLois Curfman McInnes /*@C
2464b0e389bSBarry Smith    MatGetType - Gets the matrix type and name (as a string) from the matrix.
247dae03382SLois Curfman McInnes 
248dae03382SLois Curfman McInnes    Input Parameter:
249dae03382SLois Curfman McInnes .  mat - the matrix
250dae03382SLois Curfman McInnes 
251dae03382SLois Curfman McInnes    Output Parameter:
2529a28b0a6SLois Curfman McInnes .  type - the matrix type (or use PETSC_NULL)
2539a28b0a6SLois Curfman McInnes .  name - name of matrix type (or use PETSC_NULL)
254dae03382SLois Curfman McInnes 
2555f44292fSLois Curfman McInnes .keywords: matrix, get, type, name
256dae03382SLois Curfman McInnes @*/
2574b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name)
258dae03382SLois Curfman McInnes {
259dae03382SLois Curfman McInnes   int  itype = (int)mat->type;
26039ddd567SLois Curfman McInnes   char *matname[10];
261d5d45c9bSBarry Smith 
26290f02eecSBarry Smith   PetscValidHeaderSpecific(mat,MAT_COOKIE);
26390f02eecSBarry Smith 
2644b0e389bSBarry Smith   if (type) *type = (MatType) mat->type;
2654b0e389bSBarry Smith   if (name) {
266416022c9SBarry Smith     /* Note:  Be sure that this list corresponds to the enum in mat.h */
267ec8511deSBarry Smith     matname[0] = "MATSEQDENSE";
268ec8511deSBarry Smith     matname[1] = "MATSEQAIJ";
269dae03382SLois Curfman McInnes     matname[2] = "MATMPIAIJ";
270dae03382SLois Curfman McInnes     matname[3] = "MATSHELL";
271c456f294SBarry Smith     matname[4] = "MATMPIROWBS";
272c456f294SBarry Smith     matname[5] = "MATSEQBDIAG";
273c456f294SBarry Smith     matname[6] = "MATMPIBDIAG";
274c456f294SBarry Smith     matname[7] = "MATMPIDENSE";
275da045f9dSSatish Balay     matname[8] = "MATSEQBAIJ";
27632e66d44SSatish Balay     matname[9] = "MATMPIBAIJ";
277da045f9dSSatish Balay 
27832e66d44SSatish Balay     if (itype < 0 || itype > 9) *name = "Unknown matrix type";
279dae03382SLois Curfman McInnes     else                        *name = matname[itype];
2804b0e389bSBarry Smith   }
281dae03382SLois Curfman McInnes   return 0;
282dae03382SLois Curfman McInnes }
283dae03382SLois Curfman McInnes 
284d5d45c9bSBarry Smith 
285d5d45c9bSBarry Smith 
286