1cb512458SBarry Smith #ifndef lint 2*2eadb931SSatish Balay static char vcid[] = "$Id: gcreate.c,v 1.88 1996/06/18 20:42:26 balay Exp balay $"; 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 { 30d218f8d9SSatish Balay int size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr,flg11,flg14; 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); 4177c4ece6SBarry Smith PetscPrintf(comm," %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p); 4277c4ece6SBarry Smith PetscPrintf(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); 4935aab85fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr); 50d218f8d9SSatish Balay ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr); 5125cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr); 5225cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr); 5325cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr); 5425cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr); 5525cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr); 5625cdf11fSBarry Smith if (flg1) { 57dbb450caSBarry Smith *type = MATSEQDENSE; 58dbb450caSBarry Smith *set = 1; 59dbb450caSBarry Smith } 6025cdf11fSBarry Smith else if (flg2) { 6139ddd567SLois Curfman McInnes *type = MATMPIDENSE; 6239ddd567SLois Curfman McInnes *set = 1; 6339ddd567SLois Curfman McInnes } 6425cdf11fSBarry Smith else if (flg3) { 65dbb450caSBarry Smith *type = MATSEQBDIAG; 66dbb450caSBarry Smith *set = 1; 67dbb450caSBarry Smith } 6825cdf11fSBarry Smith else if (flg4) { 69dbb450caSBarry Smith *type = MATMPIBDIAG; 70dbb450caSBarry Smith *set = 1; 71dbb450caSBarry Smith } 7225cdf11fSBarry Smith else if (flg5) { 73dbb450caSBarry Smith *type = MATMPIROWBS; 74dbb450caSBarry Smith *set = 1; 75dbb450caSBarry Smith } 7625cdf11fSBarry Smith else if (flg8) { 77dbb450caSBarry Smith *type = MATMPIAIJ; 78dbb450caSBarry Smith *set = 1; 79dbb450caSBarry Smith } 8025cdf11fSBarry Smith else if (flg9){ 81dbb450caSBarry Smith *type = MATSEQAIJ; 82dbb450caSBarry Smith *set = 1; 83dbb450caSBarry Smith } 8425cdf11fSBarry Smith else if (flg10){ 8517699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 86dbb450caSBarry Smith else *type = MATMPIAIJ; 87dbb450caSBarry Smith *set = 1; 88dbb450caSBarry Smith } 8935aab85fSBarry Smith else if (flg11){ 9035aab85fSBarry Smith *type = MATSEQBAIJ; 9135aab85fSBarry Smith *set = 1; 9235aab85fSBarry Smith } 9325cdf11fSBarry Smith else if (flg12){ 9417699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 95dbb450caSBarry Smith else *type = MATMPIBDIAG; 96dbb450caSBarry Smith *set = 1; 97dbb450caSBarry Smith } 9825cdf11fSBarry Smith else if (flg13){ 9939ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 10039ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 10139ddd567SLois Curfman McInnes *set = 1; 10239ddd567SLois Curfman McInnes } 103d218f8d9SSatish Balay else if (flg14){ 104d218f8d9SSatish Balay if (size == 1) *type = MATSEQBAIJ; 105*2eadb931SSatish Balay else *type = MATMPIBAIJ; 106d218f8d9SSatish Balay *set = 1; 107d218f8d9SSatish Balay } 108dbb450caSBarry Smith else { 10917699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 110dbb450caSBarry Smith else *type = MATMPIAIJ; 111dbb450caSBarry Smith *set = 0; 112dbb450caSBarry Smith } 113dbb450caSBarry Smith return 0; 114dbb450caSBarry Smith } 115dbb450caSBarry Smith 116325ab940SBarry Smith /*@C 1176469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 11802a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 11902a82ca1SLois Curfman McInnes communicator has more than one processor. 1207807a1faSBarry Smith 1217807a1faSBarry Smith Input Parameters: 122e0b365e2SLois Curfman McInnes . m - number of global rows 123e0b365e2SLois Curfman McInnes . n - number of global columns 1246b5873e3SBarry Smith . comm - MPI communicator 1257807a1faSBarry Smith 1267807a1faSBarry Smith Output Parameter: 127dc401e71SLois Curfman McInnes . A - the matrix 128e0b365e2SLois Curfman McInnes 129dc401e71SLois Curfman McInnes Basic Options Database Keys: 130dc401e71SLois Curfman McInnes These options use MatCreateSeqXXX or MatCreateMPIXXX, 131dc401e71SLois Curfman McInnes depending on the communicator, comm. 132dc401e71SLois Curfman McInnes $ -mat_aij : AIJ type 133dc401e71SLois Curfman McInnes $ -mat_dense : dense type 134dc401e71SLois Curfman McInnes $ -mat_bdiag : block diagonal type 135dc401e71SLois Curfman McInnes 136dc401e71SLois Curfman McInnes More Options Database Keys: 1372a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1382a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 139dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 140fafbff53SBarry Smith $ MatCreateSeqBDiag() 1417641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1427641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1437641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 14458a0a7b1SLois Curfman McInnes $ -mat_seqdense : dense type, uses MatCreateSeqDense() 14539ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 146dc401e71SLois Curfman McInnes $ -mat_seqbaij : block AIJ type, uses MatCreateSeqBAIJ() 147e0b365e2SLois Curfman McInnes 148e0b365e2SLois Curfman McInnes Notes: 149fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 150e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 151e0b365e2SLois Curfman McInnes 152dc401e71SLois Curfman McInnes .keywords: matrix, create 153e0b365e2SLois Curfman McInnes 154fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 155fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 15639ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 157ce4fbee9SSatish Balay MatCreateMPIRowbs(), MatCreateSeqBAIJ, 158ce4fbee9SSatish Balay MatConvert(), MatGetTypeFromOptions() 1597807a1faSBarry Smith @*/ 16087bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A) 1617807a1faSBarry Smith { 162dbb450caSBarry Smith MatType type; 163df7baab8SSatish Balay int set, ierr, bs=1, flg; 164dbb450caSBarry Smith 16577c4ece6SBarry Smith ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 166dfa27b74SSatish Balay switch (type) { 167dfa27b74SSatish Balay case MATSEQDENSE: 16887bddb72SLois Curfman McInnes ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr); 169dfa27b74SSatish Balay break; 170dfa27b74SSatish Balay case MATMPIBDIAG: 171ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT, 17287bddb72SLois Curfman McInnes PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr); 173dfa27b74SSatish Balay break; 174dfa27b74SSatish Balay case MATSEQBDIAG: 175ed1f4bc7SLois Curfman McInnes ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL, 17687bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 177dfa27b74SSatish Balay break; 178dfa27b74SSatish Balay case MATMPIROWBS: 179ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL, 18087bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 181dfa27b74SSatish Balay break; 182dfa27b74SSatish Balay case MATMPIDENSE: 18387bddb72SLois Curfman McInnes ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr); 184dfa27b74SSatish Balay break; 185dfa27b74SSatish Balay case MATMPIAIJ: 186ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT, 18787bddb72SLois Curfman McInnes PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 188dfa27b74SSatish Balay break; 189dfa27b74SSatish Balay case MATSEQBAIJ: 190cd0e1443SSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 19187bddb72SLois Curfman McInnes ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 192ed1f4bc7SLois Curfman McInnes break; 1938130634dSSatish Balay case MATMPIBAIJ: 1948130634dSSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 1958130634dSSatish Balay ierr = MatCreateMPIBAIJ(comm,bs,PETSC_NULL,PETSC_NULL,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 1968130634dSSatish Balay break; 19724b2b559SSatish Balay default: 19887bddb72SLois Curfman McInnes ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 19924b2b559SSatish Balay break; 200dfa27b74SSatish Balay } 20164761f52SSatish Balay return 0; 2027807a1faSBarry Smith } 2037807a1faSBarry Smith 204dae03382SLois Curfman McInnes #include "matimpl.h" 205dae03382SLois Curfman McInnes /*@C 2064b0e389bSBarry Smith MatGetType - Gets the matrix type and name (as a string) from the matrix. 207dae03382SLois Curfman McInnes 208dae03382SLois Curfman McInnes Input Parameter: 209dae03382SLois Curfman McInnes . mat - the matrix 210dae03382SLois Curfman McInnes 211dae03382SLois Curfman McInnes Output Parameter: 2129a28b0a6SLois Curfman McInnes . type - the matrix type (or use PETSC_NULL) 2139a28b0a6SLois Curfman McInnes . name - name of matrix type (or use PETSC_NULL) 214dae03382SLois Curfman McInnes 2155f44292fSLois Curfman McInnes .keywords: matrix, get, type, name 216dae03382SLois Curfman McInnes @*/ 2174b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name) 218dae03382SLois Curfman McInnes { 219dae03382SLois Curfman McInnes int itype = (int)mat->type; 22039ddd567SLois Curfman McInnes char *matname[10]; 221d5d45c9bSBarry Smith 2224b0e389bSBarry Smith if (type) *type = (MatType) mat->type; 2234b0e389bSBarry Smith if (name) { 224416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 225ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 226ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 227dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 228dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 229c456f294SBarry Smith matname[4] = "MATMPIROWBS"; 230c456f294SBarry Smith matname[5] = "MATSEQBDIAG"; 231c456f294SBarry Smith matname[6] = "MATMPIBDIAG"; 232c456f294SBarry Smith matname[7] = "MATMPIDENSE"; 233da045f9dSSatish Balay matname[8] = "MATSEQBAIJ"; 234da045f9dSSatish Balay 235e1ecba12SSatish Balay if (itype < 0 || itype > 8) *name = "Unknown matrix type"; 236dae03382SLois Curfman McInnes else *name = matname[itype]; 2374b0e389bSBarry Smith } 238dae03382SLois Curfman McInnes return 0; 239dae03382SLois Curfman McInnes } 240dae03382SLois Curfman McInnes 241d5d45c9bSBarry Smith 242d5d45c9bSBarry Smith 243