1cb512458SBarry Smith #ifndef lint 2*26b119abSLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.91 1996/06/26 18:29:02 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 20*26b119abSLois Curfman McInnes Basic Options Database Keys: 21*26b119abSLois Curfman McInnes These options return MATSEQxxx or MATMPIxxx, 22*26b119abSLois Curfman McInnes depending on the communicator, comm. 23*26b119abSLois Curfman McInnes $ -mat_aij : AIJ type 24*26b119abSLois Curfman McInnes $ -mat_baij : block AIJ type 25*26b119abSLois Curfman McInnes $ -mat_dense : dense type 26*26b119abSLois Curfman McInnes $ -mat_bdiag : block diagonal type 27*26b119abSLois Curfman McInnes 28*26b119abSLois Curfman McInnes More Options Database Keys: 29*26b119abSLois Curfman McInnes $ -mat_seqaij : MATSEQAIJ 30*26b119abSLois Curfman McInnes $ -mat_mpiaij : MATMPIAIJ 31*26b119abSLois Curfman McInnes $ -mat_seqbaij : MATSEQBAIJ 32*26b119abSLois Curfman McInnes $ -mat_mpibaij : MATMPIBAIJ 33*26b119abSLois Curfman McInnes $ -mat_seqbdiag : MATSEQBDAIG 34*26b119abSLois Curfman McInnes $ -mat_mpibdiag : MATMPIBDIAG 35*26b119abSLois Curfman McInnes $ -mat_mpirowbs : MATMPIROWBS 36*26b119abSLois Curfman McInnes $ -mat_seqdense : MATSEQDENSE 37*26b119abSLois Curfman McInnes $ -mat_mpidense : MATMPIDENSE 38*26b119abSLois Curfman McInnes 398c645567SLois Curfman McInnes Note: 40*26b119abSLois 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 44*26b119abSLois 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 180dc401e71SLois Curfman McInnes .keywords: matrix, create 181e0b365e2SLois Curfman McInnes 182fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 183fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 18439ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 185ce4fbee9SSatish Balay MatCreateMPIRowbs(), MatCreateSeqBAIJ, 186ce4fbee9SSatish Balay MatConvert(), MatGetTypeFromOptions() 1877807a1faSBarry Smith @*/ 18887bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A) 1897807a1faSBarry Smith { 190dbb450caSBarry Smith MatType type; 191df7baab8SSatish Balay int set, ierr, bs=1, flg; 192dbb450caSBarry Smith 19377c4ece6SBarry Smith ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 194dfa27b74SSatish Balay switch (type) { 195dfa27b74SSatish Balay case MATSEQDENSE: 19687bddb72SLois Curfman McInnes ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr); 197dfa27b74SSatish Balay break; 198dfa27b74SSatish Balay case MATMPIBDIAG: 199ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT, 20087bddb72SLois Curfman McInnes PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr); 201dfa27b74SSatish Balay break; 202dfa27b74SSatish Balay case MATSEQBDIAG: 203ed1f4bc7SLois Curfman McInnes ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL, 20487bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 205dfa27b74SSatish Balay break; 206dfa27b74SSatish Balay case MATMPIROWBS: 207ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL, 20887bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 209dfa27b74SSatish Balay break; 210dfa27b74SSatish Balay case MATMPIDENSE: 21187bddb72SLois Curfman McInnes ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr); 212dfa27b74SSatish Balay break; 213dfa27b74SSatish Balay case MATMPIAIJ: 214ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT, 21587bddb72SLois Curfman McInnes PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 216dfa27b74SSatish Balay break; 217dfa27b74SSatish Balay case MATSEQBAIJ: 218cd0e1443SSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 21987bddb72SLois Curfman McInnes ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 220ed1f4bc7SLois Curfman McInnes break; 2218130634dSSatish Balay case MATMPIBAIJ: 2228130634dSSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 2238130634dSSatish Balay ierr = MatCreateMPIBAIJ(comm,bs,PETSC_NULL,PETSC_NULL,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 2248130634dSSatish Balay break; 22524b2b559SSatish Balay default: 22687bddb72SLois Curfman McInnes ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 22724b2b559SSatish Balay break; 228dfa27b74SSatish Balay } 22964761f52SSatish Balay return 0; 2307807a1faSBarry Smith } 2317807a1faSBarry Smith 232dae03382SLois Curfman McInnes #include "matimpl.h" 233dae03382SLois Curfman McInnes /*@C 2344b0e389bSBarry Smith MatGetType - Gets the matrix type and name (as a string) from the matrix. 235dae03382SLois Curfman McInnes 236dae03382SLois Curfman McInnes Input Parameter: 237dae03382SLois Curfman McInnes . mat - the matrix 238dae03382SLois Curfman McInnes 239dae03382SLois Curfman McInnes Output Parameter: 2409a28b0a6SLois Curfman McInnes . type - the matrix type (or use PETSC_NULL) 2419a28b0a6SLois Curfman McInnes . name - name of matrix type (or use PETSC_NULL) 242dae03382SLois Curfman McInnes 2435f44292fSLois Curfman McInnes .keywords: matrix, get, type, name 244dae03382SLois Curfman McInnes @*/ 2454b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name) 246dae03382SLois Curfman McInnes { 247dae03382SLois Curfman McInnes int itype = (int)mat->type; 24839ddd567SLois Curfman McInnes char *matname[10]; 249d5d45c9bSBarry Smith 2504b0e389bSBarry Smith if (type) *type = (MatType) mat->type; 2514b0e389bSBarry Smith if (name) { 252416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 253ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 254ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 255dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 256dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 257c456f294SBarry Smith matname[4] = "MATMPIROWBS"; 258c456f294SBarry Smith matname[5] = "MATSEQBDIAG"; 259c456f294SBarry Smith matname[6] = "MATMPIBDIAG"; 260c456f294SBarry Smith matname[7] = "MATMPIDENSE"; 261da045f9dSSatish Balay matname[8] = "MATSEQBAIJ"; 262da045f9dSSatish Balay 263e1ecba12SSatish Balay if (itype < 0 || itype > 8) *name = "Unknown matrix type"; 264dae03382SLois Curfman McInnes else *name = matname[itype]; 2654b0e389bSBarry Smith } 266dae03382SLois Curfman McInnes return 0; 267dae03382SLois Curfman McInnes } 268dae03382SLois Curfman McInnes 269d5d45c9bSBarry Smith 270d5d45c9bSBarry Smith 271