1cb512458SBarry Smith #ifndef lint 2*4b0e389bSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.61 1995/12/21 18:33:04 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 { 3017699dbbSLois Curfman McInnes int size; 31e3726954SLois Curfman McInnes char *p = "-"; 32d5d45c9bSBarry Smith 33e3726954SLois Curfman McInnes if (pre) p = pre; 3417699dbbSLois Curfman McInnes MPI_Comm_size(comm,&size); 35b4fd4287SBarry Smith if (OptionsHasName(PETSC_NULL,"-help")) { 36e3726954SLois Curfman McInnes MPIU_printf(comm,"Matrix format options:\n"); 37e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p); 38e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_row, %smat_seqrow, %smat_mpirow\n",p,p,p); 39e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p); 40e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p); 41e3726954SLois Curfman McInnes /* We need to move the following to MatPrintHelp or some analogous routine */ 42cda99f1eSLois Curfman McInnes MPIU_printf(comm,"More matrix options:\n"); 43e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_view_info : view basic matrix info during MatAssemblyEnd()\n",p); 44e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_view_info_detailed : view detailed matrix info during MatAssemblyEnd()\n",p); 45e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_view_draw : draw nonzero matrix structure during MatAssemblyEnd()\n",p); 466a819050SLois Curfman McInnes MPIU_printf(comm," -pause <sec> : set seconds of display pause\n"); 476a819050SLois Curfman McInnes MPIU_printf(comm," -display <name> : set alternate display\n"); 48dbb450caSBarry Smith } 49e3726954SLois Curfman McInnes if (OptionsHasName(pre,"-mat_seqdense")) { 50dbb450caSBarry Smith *type = MATSEQDENSE; 51dbb450caSBarry Smith *set = 1; 52dbb450caSBarry Smith } 53e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpidense")) { 5439ddd567SLois Curfman McInnes *type = MATMPIDENSE; 5539ddd567SLois Curfman McInnes *set = 1; 5639ddd567SLois Curfman McInnes } 57e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_seqbdiag")) { 58dbb450caSBarry Smith *type = MATSEQBDIAG; 59dbb450caSBarry Smith *set = 1; 60dbb450caSBarry Smith } 61e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpibdiag")) { 62dbb450caSBarry Smith *type = MATMPIBDIAG; 63dbb450caSBarry Smith *set = 1; 64dbb450caSBarry Smith } 65e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpirowbs")) { 66dbb450caSBarry Smith *type = MATMPIROWBS; 67dbb450caSBarry Smith *set = 1; 68dbb450caSBarry Smith } 69e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpirow")) { 70dbb450caSBarry Smith *type = MATMPIROW; 71dbb450caSBarry Smith *set = 1; 72dbb450caSBarry Smith } 73e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_seqrow")){ 74dbb450caSBarry Smith *type = MATSEQROW; 75dbb450caSBarry Smith *set = 1; 76dbb450caSBarry Smith } 77e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpiaij")) { 78dbb450caSBarry Smith *type = MATMPIAIJ; 79dbb450caSBarry Smith *set = 1; 80dbb450caSBarry Smith } 81e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_seqaij")){ 82dbb450caSBarry Smith *type = MATSEQAIJ; 83dbb450caSBarry Smith *set = 1; 84dbb450caSBarry Smith } 85e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_aij")){ 8617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 87dbb450caSBarry Smith else *type = MATMPIAIJ; 88dbb450caSBarry Smith *set = 1; 89dbb450caSBarry Smith } 90e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_row")){ 9117699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQROW; 92dbb450caSBarry Smith else *type = MATMPIROW; 93dbb450caSBarry Smith *set = 1; 94dbb450caSBarry Smith } 95e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_bdiag")){ 9617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 97dbb450caSBarry Smith else *type = MATMPIBDIAG; 98dbb450caSBarry Smith *set = 1; 99dbb450caSBarry Smith } 100e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_dense")){ 10139ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 10239ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 10339ddd567SLois Curfman McInnes *set = 1; 10439ddd567SLois Curfman McInnes } 105dbb450caSBarry Smith else { 10617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 107dbb450caSBarry Smith else *type = MATMPIAIJ; 108dbb450caSBarry Smith *set = 0; 109dbb450caSBarry Smith } 110dbb450caSBarry Smith return 0; 111dbb450caSBarry Smith } 112dbb450caSBarry Smith 113325ab940SBarry Smith /*@C 1146469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 11502a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 11602a82ca1SLois Curfman McInnes communicator has more than one processor. 1177807a1faSBarry Smith 1187807a1faSBarry Smith Input Parameters: 119e0b365e2SLois Curfman McInnes . m - number of global rows 120e0b365e2SLois Curfman McInnes . n - number of global columns 1216b5873e3SBarry Smith . comm - MPI communicator 1227807a1faSBarry Smith 1237807a1faSBarry Smith Output Parameter: 124df998da4SLois Curfman McInnes . V - location to stash resulting matrix 125e0b365e2SLois Curfman McInnes 126e0b365e2SLois Curfman McInnes Options Database Keywords: 1272a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1282a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1292a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 130dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 1315f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 132dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 133dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 134fafbff53SBarry Smith $ MatCreateSeqBDiag() 1357641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1367641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1377641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1387641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1397641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 14039ddd567SLois Curfman McInnes $ -mat_dense : dense type, (Seq or MPI depending on comm) 14139ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateSeqDense() 14239ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 143e0b365e2SLois Curfman McInnes 144e0b365e2SLois Curfman McInnes Notes: 145fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 146e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 147e0b365e2SLois Curfman McInnes 148e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 149e0b365e2SLois Curfman McInnes 150fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 151fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 152fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 15339ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 15439ddd567SLois Curfman McInnes MatCreateMPIRowbs(), MatConvert() 155416022c9SBarry Smith MatGetFormatFromOptions() 1567807a1faSBarry Smith @*/ 1576469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1587807a1faSBarry Smith { 159dbb450caSBarry Smith MatType type; 160dbb450caSBarry Smith int set,ierr; 161dbb450caSBarry Smith 162e3726954SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 163dbb450caSBarry Smith if (type == MATSEQDENSE) { 164b4fd4287SBarry Smith return MatCreateSeqDense(comm,m,n,PETSC_NULL,V); 1657807a1faSBarry Smith } 166dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 167dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 168b4fd4287SBarry Smith if (OptionsHasName(PETSC_NULL,"-help")) { 169ed2daf61SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag, -mat_seqbdiag, -mat_mpibdiag:\n"); 170ed2daf61SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_bsize <block_size>\n"); 1718c645567SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag <number_diags> \n"); 1728c645567SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals <d1,d2,d3,...> (diagonal numbers)\n"); 173f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 174f59b1570SLois Curfman McInnes } 175b4fd4287SBarry Smith OptionsGetInt(PETSC_NULL,"-mat_bdiag_bsize",&nb); 176b4fd4287SBarry Smith OptionsGetInt(PETSC_NULL,"-mat_bdiag_ndiag",&ndiag); 1770de55854SLois Curfman McInnes if (ndiag) { 1780452661fSBarry Smith d = (int *)PetscMalloc( ndiag * sizeof(int) ); CHKPTRQ(d); 179e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 180b4fd4287SBarry Smith OptionsGetIntArray(PETSC_NULL,"-mat_bdiag_dvals",d,&ndiag2); 1810de55854SLois Curfman McInnes if (ndiag2 != ndiag) 182bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 183b4fd4287SBarry Smith } else if (OptionsHasName(PETSC_NULL,"-mat_bdiag_dvals")) { 1840de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 185416022c9SBarry Smith } 186dbb450caSBarry Smith if (type == MATMPIBDIAG) { 187b4fd4287SBarry Smith ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,PETSC_NULL,V); CHKERRQ(ierr); 1880de55854SLois Curfman McInnes } else { 189b4fd4287SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,PETSC_NULL,V); CHKERRQ(ierr); 190e452cd2fSLois Curfman McInnes } 1910452661fSBarry Smith if (d) PetscFree(d); 192aa6b49bfSBarry Smith return 0; 193e452cd2fSLois Curfman McInnes } 194dbb450caSBarry Smith if (type == MATMPIROWBS) { 195b4fd4287SBarry Smith return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,PETSC_NULL,PETSC_NULL,V); 1969b779142SLois Curfman McInnes } 197dbb450caSBarry Smith if (type == MATMPIROW) { 198b4fd4287SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,PETSC_NULL,0,PETSC_NULL,V); 199df998da4SLois Curfman McInnes } 200dbb450caSBarry Smith if (type == MATSEQROW) { 201b4fd4287SBarry Smith return MatCreateSeqRow(comm,m,n,10,PETSC_NULL,V); 2023dfeaf31SLois Curfman McInnes } 20339ddd567SLois Curfman McInnes if (type == MATMPIDENSE) { 204b4fd4287SBarry Smith return MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,V); 205ed2daf61SLois Curfman McInnes } 206b4fd4287SBarry Smith if (OptionsHasName(PETSC_NULL,"-help")) { 207ed2daf61SLois Curfman McInnes MPIU_printf(comm,"Options with default formats (-mat_aij, -mat_seqaij, -mat_mpiaij):\n"); 208ed2daf61SLois Curfman McInnes MPIU_printf(comm," -mat_aij_no_inode : Do not use inodes\n"); 209ed2daf61SLois Curfman McInnes MPIU_printf(comm," -mat_aij_inode_limit <limit> : Set inode limit (max limit=5)\n"); 21039ddd567SLois Curfman McInnes } 211dbb450caSBarry Smith if (type == MATMPIAIJ) { 212b4fd4287SBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,PETSC_NULL,0,PETSC_NULL,V); 2135f52d6abSBarry Smith } 214b4fd4287SBarry Smith return MatCreateSeqAIJ(comm,m,n,10,PETSC_NULL,V); 2157807a1faSBarry Smith } 2167807a1faSBarry Smith 217dae03382SLois Curfman McInnes #include "matimpl.h" 218dae03382SLois Curfman McInnes /*@C 219*4b0e389bSBarry Smith MatGetType - Gets the matrix type and name (as a string) from the matrix. 220dae03382SLois Curfman McInnes 221dae03382SLois Curfman McInnes Input Parameter: 222dae03382SLois Curfman McInnes . mat - the matrix 223dae03382SLois Curfman McInnes 224dae03382SLois Curfman McInnes Output Parameter: 225*4b0e389bSBarry Smith . type - the matrix type 226dae03382SLois Curfman McInnes . name - name of matrix type 227dae03382SLois Curfman McInnes 228dae03382SLois Curfman McInnes .keywords: matrix, get, name 229dae03382SLois Curfman McInnes 230dae03382SLois Curfman McInnes @*/ 231*4b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name) 232dae03382SLois Curfman McInnes { 233dae03382SLois Curfman McInnes int itype = (int)mat->type; 23439ddd567SLois Curfman McInnes char *matname[10]; 235d5d45c9bSBarry Smith 236*4b0e389bSBarry Smith if (type) *type = (MatType) mat->type; 237*4b0e389bSBarry Smith if (name) { 238416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 239ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 240ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 241dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 242dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 243ec8511deSBarry Smith matname[4] = "MATSEQROW"; 244dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 245ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 246ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 2474c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 24839ddd567SLois Curfman McInnes matname[9] = "MATMPIDENSE"; 249096963f5SLois Curfman McInnes if (itype < 0 || itype > 9) *name = "Unknown matrix type"; 250dae03382SLois Curfman McInnes else *name = matname[itype]; 251*4b0e389bSBarry Smith } 252dae03382SLois Curfman McInnes return 0; 253dae03382SLois Curfman McInnes } 254dae03382SLois Curfman McInnes 255d5d45c9bSBarry Smith 256d5d45c9bSBarry Smith 257