1cb512458SBarry Smith #ifndef lint 2*c456f294SBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.67 1996/01/12 22:08:29 bsmith Exp bsmith $"; 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 98c645567SLois Curfman McInnes MatGetFormatFromOptions - 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 208c645567SLois Curfman McInnes Note: 218c645567SLois Curfman McInnes This routine is automatically called within MatCreate(). 228c645567SLois Curfman McInnes 2339ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options 2439ddd567SLois Curfman McInnes 25416022c9SBarry Smith .seealso: MatCreate() 26416022c9SBarry Smith @*/ 27e3726954SLois Curfman McInnes 28e3726954SLois Curfman McInnes int MatGetFormatFromOptions(MPI_Comm comm,char *pre,MatType *type,int *set) 29dbb450caSBarry Smith { 30*c456f294SBarry Smith int size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr; 316daaf66cSBarry Smith char p[64]; 32d5d45c9bSBarry Smith 336daaf66cSBarry Smith PetscStrcpy(p,"-"); 346daaf66cSBarry Smith if (pre) PetscStrcat(p,pre); 356daaf66cSBarry Smith 3617699dbbSLois Curfman McInnes MPI_Comm_size(comm,&size); 3725cdf11fSBarry Smith ierr = OptionsHasName(PETSC_NULL,"-help",&flg1); CHKERRQ(ierr); 3825cdf11fSBarry Smith if (flg1) { 39e3726954SLois Curfman McInnes MPIU_printf(comm,"Matrix format options:\n"); 40e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p); 41e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p); 42e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p); 43dbb450caSBarry Smith } 4425cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr); 4525cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr); 4625cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr); 4725cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr); 4825cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr); 4925cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr); 5025cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr); 5125cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr); 5225cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr); 5325cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr); 5425cdf11fSBarry Smith if (flg1) { 55dbb450caSBarry Smith *type = MATSEQDENSE; 56dbb450caSBarry Smith *set = 1; 57dbb450caSBarry Smith } 5825cdf11fSBarry Smith else if (flg2) { 5939ddd567SLois Curfman McInnes *type = MATMPIDENSE; 6039ddd567SLois Curfman McInnes *set = 1; 6139ddd567SLois Curfman McInnes } 6225cdf11fSBarry Smith else if (flg3) { 63dbb450caSBarry Smith *type = MATSEQBDIAG; 64dbb450caSBarry Smith *set = 1; 65dbb450caSBarry Smith } 6625cdf11fSBarry Smith else if (flg4) { 67dbb450caSBarry Smith *type = MATMPIBDIAG; 68dbb450caSBarry Smith *set = 1; 69dbb450caSBarry Smith } 7025cdf11fSBarry Smith else if (flg5) { 71dbb450caSBarry Smith *type = MATMPIROWBS; 72dbb450caSBarry Smith *set = 1; 73dbb450caSBarry Smith } 7425cdf11fSBarry Smith else if (flg8) { 75dbb450caSBarry Smith *type = MATMPIAIJ; 76dbb450caSBarry Smith *set = 1; 77dbb450caSBarry Smith } 7825cdf11fSBarry Smith else if (flg9){ 79dbb450caSBarry Smith *type = MATSEQAIJ; 80dbb450caSBarry Smith *set = 1; 81dbb450caSBarry Smith } 8225cdf11fSBarry Smith else if (flg10){ 8317699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 84dbb450caSBarry Smith else *type = MATMPIAIJ; 85dbb450caSBarry Smith *set = 1; 86dbb450caSBarry Smith } 8725cdf11fSBarry Smith else if (flg12){ 8817699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 89dbb450caSBarry Smith else *type = MATMPIBDIAG; 90dbb450caSBarry Smith *set = 1; 91dbb450caSBarry Smith } 9225cdf11fSBarry Smith else if (flg13){ 9339ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 9439ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 9539ddd567SLois Curfman McInnes *set = 1; 9639ddd567SLois Curfman McInnes } 97dbb450caSBarry Smith else { 9817699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 99dbb450caSBarry Smith else *type = MATMPIAIJ; 100dbb450caSBarry Smith *set = 0; 101dbb450caSBarry Smith } 102dbb450caSBarry Smith return 0; 103dbb450caSBarry Smith } 104dbb450caSBarry Smith 105325ab940SBarry Smith /*@C 1066469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 10702a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 10802a82ca1SLois Curfman McInnes communicator has more than one processor. 1097807a1faSBarry Smith 1107807a1faSBarry Smith Input Parameters: 111e0b365e2SLois Curfman McInnes . m - number of global rows 112e0b365e2SLois Curfman McInnes . n - number of global columns 1136b5873e3SBarry Smith . comm - MPI communicator 1147807a1faSBarry Smith 1157807a1faSBarry Smith Output Parameter: 116df998da4SLois Curfman McInnes . V - location to stash resulting matrix 117e0b365e2SLois Curfman McInnes 118e0b365e2SLois Curfman McInnes Options Database Keywords: 1192a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1202a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1212a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 122dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 123fafbff53SBarry Smith $ MatCreateSeqBDiag() 1247641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1257641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1267641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1277641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1287641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 12939ddd567SLois Curfman McInnes $ -mat_dense : dense type, (Seq or MPI depending on comm) 13039ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateSeqDense() 13139ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 132e0b365e2SLois Curfman McInnes 133e0b365e2SLois Curfman McInnes Notes: 134fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 135e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 136e0b365e2SLois Curfman McInnes 137e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 138e0b365e2SLois Curfman McInnes 139fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 140fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 14139ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 14239ddd567SLois Curfman McInnes MatCreateMPIRowbs(), MatConvert() 143416022c9SBarry Smith MatGetFormatFromOptions() 1447807a1faSBarry Smith @*/ 1456469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1467807a1faSBarry Smith { 147dbb450caSBarry Smith MatType type; 148dbb450caSBarry Smith int set,ierr; 149dbb450caSBarry Smith 150e3726954SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 1512a7368beSLois Curfman McInnes if (type == MATSEQDENSE) 152b4fd4287SBarry Smith return MatCreateSeqDense(comm,m,n,PETSC_NULL,V); 1532a7368beSLois Curfman McInnes if (type == MATMPIBDIAG) 1542a7368beSLois Curfman McInnes return MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT, 1552a7368beSLois Curfman McInnes PETSC_NULL,PETSC_NULL,V); 1562a7368beSLois Curfman McInnes if (type == MATSEQBDIAG) 1572a7368beSLois Curfman McInnes return MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL, 1582a7368beSLois Curfman McInnes PETSC_NULL,V); 1592a7368beSLois Curfman McInnes if (type == MATMPIROWBS) 1602a7368beSLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL,PETSC_NULL,V); 1612a7368beSLois Curfman McInnes if (type == MATMPIDENSE) 162b4fd4287SBarry Smith return MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,V); 1632a7368beSLois Curfman McInnes if (type == MATMPIAIJ) 1642a7368beSLois Curfman McInnes return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT, 1652a7368beSLois Curfman McInnes PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,V); 1662a7368beSLois Curfman McInnes return MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,V); 1677807a1faSBarry Smith } 1687807a1faSBarry Smith 169dae03382SLois Curfman McInnes #include "matimpl.h" 170dae03382SLois Curfman McInnes /*@C 1714b0e389bSBarry Smith MatGetType - Gets the matrix type and name (as a string) from the matrix. 172dae03382SLois Curfman McInnes 173dae03382SLois Curfman McInnes Input Parameter: 174dae03382SLois Curfman McInnes . mat - the matrix 175dae03382SLois Curfman McInnes 176dae03382SLois Curfman McInnes Output Parameter: 1779a28b0a6SLois Curfman McInnes . type - the matrix type (or use PETSC_NULL) 1789a28b0a6SLois Curfman McInnes . name - name of matrix type (or use PETSC_NULL) 179dae03382SLois Curfman McInnes 180dae03382SLois Curfman McInnes .keywords: matrix, get, name 181dae03382SLois Curfman McInnes @*/ 1824b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name) 183dae03382SLois Curfman McInnes { 184dae03382SLois Curfman McInnes int itype = (int)mat->type; 18539ddd567SLois Curfman McInnes char *matname[10]; 186d5d45c9bSBarry Smith 1874b0e389bSBarry Smith if (type) *type = (MatType) mat->type; 1884b0e389bSBarry Smith if (name) { 189416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 190ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 191ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 192dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 193dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 194*c456f294SBarry Smith matname[4] = "MATMPIROWBS"; 195*c456f294SBarry Smith matname[5] = "MATSEQBDIAG"; 196*c456f294SBarry Smith matname[6] = "MATMPIBDIAG"; 197*c456f294SBarry Smith matname[7] = "MATMPIDENSE"; 198*c456f294SBarry Smith if (itype < 0 || itype > 7) *name = "Unknown matrix type"; 199dae03382SLois Curfman McInnes else *name = matname[itype]; 2004b0e389bSBarry Smith } 201dae03382SLois Curfman McInnes return 0; 202dae03382SLois Curfman McInnes } 203dae03382SLois Curfman McInnes 204d5d45c9bSBarry Smith 205d5d45c9bSBarry Smith 206