1cb512458SBarry Smith #ifndef lint 2*83e1b59cSLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.90 1996/06/20 02:09:57 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 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 2877c4ece6SBarry Smith int MatGetTypeFromOptions(MPI_Comm comm,char *pre,MatType *type,int *set) 29dbb450caSBarry Smith { 3090fe702eSLois Curfman McInnes int size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr,flg11,flg14,flg15; 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) { 3977c4ece6SBarry Smith PetscPrintf(comm,"Matrix format options:\n"); 4077c4ece6SBarry Smith PetscPrintf(comm," %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p); 4190fe702eSLois Curfman McInnes PetscPrintf(comm," %smat_baij, %smat_seqbaij, %smat_mpibaij\n",p,p,p); 4277c4ece6SBarry Smith PetscPrintf(comm," %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p); 4377c4ece6SBarry Smith PetscPrintf(comm," %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p); 44dbb450caSBarry Smith } 4525cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr); 4625cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr); 4725cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr); 4825cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr); 4925cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr); 5035aab85fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr); 51d218f8d9SSatish Balay ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr); 5225cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr); 5325cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr); 5425cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr); 5525cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr); 5625cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr); 5790fe702eSLois Curfman McInnes ierr = OptionsHasName(pre,"-mat_baij",&flg15); CHKERRQ(ierr); 5825cdf11fSBarry Smith if (flg1) { 59dbb450caSBarry Smith *type = MATSEQDENSE; 60dbb450caSBarry Smith *set = 1; 61dbb450caSBarry Smith } 6225cdf11fSBarry Smith else if (flg2) { 6339ddd567SLois Curfman McInnes *type = MATMPIDENSE; 6439ddd567SLois Curfman McInnes *set = 1; 6539ddd567SLois Curfman McInnes } 6625cdf11fSBarry Smith else if (flg3) { 67dbb450caSBarry Smith *type = MATSEQBDIAG; 68dbb450caSBarry Smith *set = 1; 69dbb450caSBarry Smith } 7025cdf11fSBarry Smith else if (flg4) { 71dbb450caSBarry Smith *type = MATMPIBDIAG; 72dbb450caSBarry Smith *set = 1; 73dbb450caSBarry Smith } 7425cdf11fSBarry Smith else if (flg5) { 75dbb450caSBarry Smith *type = MATMPIROWBS; 76dbb450caSBarry Smith *set = 1; 77dbb450caSBarry Smith } 7825cdf11fSBarry Smith else if (flg8) { 79dbb450caSBarry Smith *type = MATMPIAIJ; 80dbb450caSBarry Smith *set = 1; 81dbb450caSBarry Smith } 8225cdf11fSBarry Smith else if (flg9){ 83dbb450caSBarry Smith *type = MATSEQAIJ; 84dbb450caSBarry Smith *set = 1; 85dbb450caSBarry Smith } 8625cdf11fSBarry Smith else if (flg10) { 8717699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 88dbb450caSBarry Smith else *type = MATMPIAIJ; 89dbb450caSBarry Smith *set = 1; 90dbb450caSBarry Smith } 9135aab85fSBarry Smith else if (flg11) { 9235aab85fSBarry Smith *type = MATSEQBAIJ; 9335aab85fSBarry Smith *set = 1; 9435aab85fSBarry Smith } 9525cdf11fSBarry Smith else if (flg12) { 9617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 97dbb450caSBarry Smith else *type = MATMPIBDIAG; 98dbb450caSBarry Smith *set = 1; 99dbb450caSBarry Smith } 10025cdf11fSBarry Smith else if (flg13) { 10139ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 10239ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 10339ddd567SLois Curfman McInnes *set = 1; 10439ddd567SLois Curfman McInnes } 105d218f8d9SSatish Balay else if (flg14) { 10690fe702eSLois Curfman McInnes *type = MATMPIBAIJ; 10790fe702eSLois Curfman McInnes *set = 1; 10890fe702eSLois Curfman McInnes } 10990fe702eSLois Curfman McInnes else if (flg15) { 110d218f8d9SSatish Balay if (size == 1) *type = MATSEQBAIJ; 1112eadb931SSatish Balay else *type = MATMPIBAIJ; 112d218f8d9SSatish Balay *set = 1; 113d218f8d9SSatish Balay } 114dbb450caSBarry Smith else { 11517699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 116dbb450caSBarry Smith else *type = MATMPIAIJ; 117dbb450caSBarry Smith *set = 0; 118dbb450caSBarry Smith } 119dbb450caSBarry Smith return 0; 120dbb450caSBarry Smith } 121dbb450caSBarry Smith 122325ab940SBarry Smith /*@C 1236469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 12402a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 125*83e1b59cSLois Curfman McInnes communicator has more than one processor. The default matrix type is 126*83e1b59cSLois Curfman McInnes AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ(). 127*83e1b59cSLois Curfman McInnes 1287807a1faSBarry Smith 1297807a1faSBarry Smith Input Parameters: 130e0b365e2SLois Curfman McInnes . m - number of global rows 131e0b365e2SLois Curfman McInnes . n - number of global columns 1326b5873e3SBarry Smith . comm - MPI communicator 1337807a1faSBarry Smith 1347807a1faSBarry Smith Output Parameter: 135dc401e71SLois Curfman McInnes . A - the matrix 136e0b365e2SLois Curfman McInnes 137dc401e71SLois Curfman McInnes Basic Options Database Keys: 138dc401e71SLois Curfman McInnes These options use MatCreateSeqXXX or MatCreateMPIXXX, 139dc401e71SLois Curfman McInnes depending on the communicator, comm. 140dc401e71SLois Curfman McInnes $ -mat_aij : AIJ type 141*83e1b59cSLois Curfman McInnes $ -mat_baij : block AIJ type 142dc401e71SLois Curfman McInnes $ -mat_dense : dense type 143dc401e71SLois Curfman McInnes $ -mat_bdiag : block diagonal type 144dc401e71SLois Curfman McInnes 145dc401e71SLois Curfman McInnes More Options Database Keys: 146*83e1b59cSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ() 147*83e1b59cSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ() 148dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 149fafbff53SBarry Smith $ MatCreateSeqBDiag() 1507641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1517641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1527641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 15358a0a7b1SLois Curfman McInnes $ -mat_seqdense : dense type, uses MatCreateSeqDense() 15439ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 155dc401e71SLois Curfman McInnes $ -mat_seqbaij : block AIJ type, uses MatCreateSeqBAIJ() 156*83e1b59cSLois Curfman McInnes $ -mat_mpibaij : block AIJ type, uses MatCreateMPIBAIJ() 157e0b365e2SLois Curfman McInnes 158*83e1b59cSLois Curfman McInnes Even More Options Database Keys: 159*83e1b59cSLois Curfman McInnes See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 160*83e1b59cSLois Curfman McInnes for additional format-specific options. 161e0b365e2SLois Curfman McInnes 162dc401e71SLois Curfman McInnes .keywords: matrix, create 163e0b365e2SLois Curfman McInnes 164fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 165fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 16639ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 167ce4fbee9SSatish Balay MatCreateMPIRowbs(), MatCreateSeqBAIJ, 168ce4fbee9SSatish Balay MatConvert(), MatGetTypeFromOptions() 1697807a1faSBarry Smith @*/ 17087bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A) 1717807a1faSBarry Smith { 172dbb450caSBarry Smith MatType type; 173df7baab8SSatish Balay int set, ierr, bs=1, flg; 174dbb450caSBarry Smith 17577c4ece6SBarry Smith ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 176dfa27b74SSatish Balay switch (type) { 177dfa27b74SSatish Balay case MATSEQDENSE: 17887bddb72SLois Curfman McInnes ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr); 179dfa27b74SSatish Balay break; 180dfa27b74SSatish Balay case MATMPIBDIAG: 181ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT, 18287bddb72SLois Curfman McInnes PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr); 183dfa27b74SSatish Balay break; 184dfa27b74SSatish Balay case MATSEQBDIAG: 185ed1f4bc7SLois Curfman McInnes ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL, 18687bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 187dfa27b74SSatish Balay break; 188dfa27b74SSatish Balay case MATMPIROWBS: 189ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL, 19087bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 191dfa27b74SSatish Balay break; 192dfa27b74SSatish Balay case MATMPIDENSE: 19387bddb72SLois Curfman McInnes ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr); 194dfa27b74SSatish Balay break; 195dfa27b74SSatish Balay case MATMPIAIJ: 196ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT, 19787bddb72SLois Curfman McInnes PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 198dfa27b74SSatish Balay break; 199dfa27b74SSatish Balay case MATSEQBAIJ: 200cd0e1443SSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 20187bddb72SLois Curfman McInnes ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 202ed1f4bc7SLois Curfman McInnes break; 2038130634dSSatish Balay case MATMPIBAIJ: 2048130634dSSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 2058130634dSSatish Balay ierr = MatCreateMPIBAIJ(comm,bs,PETSC_NULL,PETSC_NULL,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 2068130634dSSatish Balay break; 20724b2b559SSatish Balay default: 20887bddb72SLois Curfman McInnes ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 20924b2b559SSatish Balay break; 210dfa27b74SSatish Balay } 21164761f52SSatish Balay return 0; 2127807a1faSBarry Smith } 2137807a1faSBarry Smith 214dae03382SLois Curfman McInnes #include "matimpl.h" 215dae03382SLois Curfman McInnes /*@C 2164b0e389bSBarry Smith MatGetType - Gets the matrix type and name (as a string) from the matrix. 217dae03382SLois Curfman McInnes 218dae03382SLois Curfman McInnes Input Parameter: 219dae03382SLois Curfman McInnes . mat - the matrix 220dae03382SLois Curfman McInnes 221dae03382SLois Curfman McInnes Output Parameter: 2229a28b0a6SLois Curfman McInnes . type - the matrix type (or use PETSC_NULL) 2239a28b0a6SLois Curfman McInnes . name - name of matrix type (or use PETSC_NULL) 224dae03382SLois Curfman McInnes 2255f44292fSLois Curfman McInnes .keywords: matrix, get, type, name 226dae03382SLois Curfman McInnes @*/ 2274b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name) 228dae03382SLois Curfman McInnes { 229dae03382SLois Curfman McInnes int itype = (int)mat->type; 23039ddd567SLois Curfman McInnes char *matname[10]; 231d5d45c9bSBarry Smith 2324b0e389bSBarry Smith if (type) *type = (MatType) mat->type; 2334b0e389bSBarry Smith if (name) { 234416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 235ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 236ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 237dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 238dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 239c456f294SBarry Smith matname[4] = "MATMPIROWBS"; 240c456f294SBarry Smith matname[5] = "MATSEQBDIAG"; 241c456f294SBarry Smith matname[6] = "MATMPIBDIAG"; 242c456f294SBarry Smith matname[7] = "MATMPIDENSE"; 243da045f9dSSatish Balay matname[8] = "MATSEQBAIJ"; 244da045f9dSSatish Balay 245e1ecba12SSatish Balay if (itype < 0 || itype > 8) *name = "Unknown matrix type"; 246dae03382SLois Curfman McInnes else *name = matname[itype]; 2474b0e389bSBarry Smith } 248dae03382SLois Curfman McInnes return 0; 249dae03382SLois Curfman McInnes } 250dae03382SLois Curfman McInnes 251d5d45c9bSBarry Smith 252d5d45c9bSBarry Smith 253