1cb512458SBarry Smith #ifndef lint 2*0452661fSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.55 1995/10/26 21:39:52 curfman 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 = "-"; 32e3726954SLois Curfman McInnes if (pre) p = pre; 3317699dbbSLois Curfman McInnes MPI_Comm_size(comm,&size); 34dbb450caSBarry Smith if (OptionsHasName(0,"-help")) { 35e3726954SLois Curfman McInnes MPIU_printf(comm,"Matrix format options:\n"); 36e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p); 37e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_row, %smat_seqrow, %smat_mpirow\n",p,p,p); 38e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p); 39e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p); 40e3726954SLois Curfman McInnes /* We need to move the following to MatPrintHelp or some analogous routine */ 41cda99f1eSLois Curfman McInnes MPIU_printf(comm,"More matrix options:\n"); 42e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_view_info : view basic matrix info during MatAssemblyEnd()\n",p); 43e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_view_info_detailed : view detailed matrix info during MatAssemblyEnd()\n",p); 44e3726954SLois Curfman McInnes MPIU_printf(comm," %smat_view_draw : draw nonzero matrix structure during MatAssemblyEnd()\n",p); 456a819050SLois Curfman McInnes MPIU_printf(comm," -pause <sec> : set seconds of display pause\n"); 466a819050SLois Curfman McInnes MPIU_printf(comm," -display <name> : set alternate display\n"); 47dbb450caSBarry Smith } 48e3726954SLois Curfman McInnes if (OptionsHasName(pre,"-mat_seqdense")) { 49dbb450caSBarry Smith *type = MATSEQDENSE; 50dbb450caSBarry Smith *set = 1; 51dbb450caSBarry Smith } 52e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpidense")) { 5339ddd567SLois Curfman McInnes *type = MATMPIDENSE; 5439ddd567SLois Curfman McInnes *set = 1; 5539ddd567SLois Curfman McInnes } 56e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_seqbdiag")) { 57dbb450caSBarry Smith *type = MATSEQBDIAG; 58dbb450caSBarry Smith *set = 1; 59dbb450caSBarry Smith } 60e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpibdiag")) { 61dbb450caSBarry Smith *type = MATMPIBDIAG; 62dbb450caSBarry Smith *set = 1; 63dbb450caSBarry Smith } 64e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpirowbs")) { 65dbb450caSBarry Smith *type = MATMPIROWBS; 66dbb450caSBarry Smith *set = 1; 67dbb450caSBarry Smith } 68e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpirow")) { 69dbb450caSBarry Smith *type = MATMPIROW; 70dbb450caSBarry Smith *set = 1; 71dbb450caSBarry Smith } 72e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_seqrow")){ 73dbb450caSBarry Smith *type = MATSEQROW; 74dbb450caSBarry Smith *set = 1; 75dbb450caSBarry Smith } 76e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_mpiaij")) { 77dbb450caSBarry Smith *type = MATMPIAIJ; 78dbb450caSBarry Smith *set = 1; 79dbb450caSBarry Smith } 80e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_seqaij")){ 81dbb450caSBarry Smith *type = MATSEQAIJ; 82dbb450caSBarry Smith *set = 1; 83dbb450caSBarry Smith } 84e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_aij")){ 8517699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 86dbb450caSBarry Smith else *type = MATMPIAIJ; 87dbb450caSBarry Smith *set = 1; 88dbb450caSBarry Smith } 89e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_row")){ 9017699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQROW; 91dbb450caSBarry Smith else *type = MATMPIROW; 92dbb450caSBarry Smith *set = 1; 93dbb450caSBarry Smith } 94e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_bdiag")){ 9517699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 96dbb450caSBarry Smith else *type = MATMPIBDIAG; 97dbb450caSBarry Smith *set = 1; 98dbb450caSBarry Smith } 99e3726954SLois Curfman McInnes else if (OptionsHasName(pre,"-mat_dense")){ 10039ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 10139ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 10239ddd567SLois Curfman McInnes *set = 1; 10339ddd567SLois Curfman McInnes } 104dbb450caSBarry Smith else { 10517699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 106dbb450caSBarry Smith else *type = MATMPIAIJ; 107dbb450caSBarry Smith *set = 0; 108dbb450caSBarry Smith } 109dbb450caSBarry Smith return 0; 110dbb450caSBarry Smith } 111dbb450caSBarry Smith 112325ab940SBarry Smith /*@C 1136469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 11402a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 11502a82ca1SLois Curfman McInnes communicator has more than one processor. 1167807a1faSBarry Smith 1177807a1faSBarry Smith Input Parameters: 118e0b365e2SLois Curfman McInnes . m - number of global rows 119e0b365e2SLois Curfman McInnes . n - number of global columns 1206b5873e3SBarry Smith . comm - MPI communicator 1217807a1faSBarry Smith 1227807a1faSBarry Smith Output Parameter: 123df998da4SLois Curfman McInnes . V - location to stash resulting matrix 124e0b365e2SLois Curfman McInnes 125e0b365e2SLois Curfman McInnes Options Database Keywords: 1262a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1272a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1282a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 129dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 1305f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 131dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 132dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 133fafbff53SBarry Smith $ MatCreateSeqBDiag() 1347641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1357641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1367641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1377641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1387641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 13939ddd567SLois Curfman McInnes $ -mat_dense : dense type, (Seq or MPI depending on comm) 14039ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateSeqDense() 14139ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 142e0b365e2SLois Curfman McInnes 143e0b365e2SLois Curfman McInnes Notes: 144fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 145e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 146e0b365e2SLois Curfman McInnes 147e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 148e0b365e2SLois Curfman McInnes 149fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 150fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 151fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 15239ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 15339ddd567SLois Curfman McInnes MatCreateMPIRowbs(), MatConvert() 154416022c9SBarry Smith MatGetFormatFromOptions() 1557807a1faSBarry Smith @*/ 1566469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1577807a1faSBarry Smith { 158dbb450caSBarry Smith MatType type; 159dbb450caSBarry Smith int set,ierr; 160dbb450caSBarry Smith 161e3726954SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 162dbb450caSBarry Smith if (type == MATSEQDENSE) { 163fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1647807a1faSBarry Smith } 165dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 166dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 167f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 1688c645567SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize <block_size>\n"); 1698c645567SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag <number_diags> \n"); 1708c645567SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals <d1,d2,d3,...> (diagonal numbers)\n"); 171f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 172f59b1570SLois Curfman McInnes } 173e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 174e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1750de55854SLois Curfman McInnes if (ndiag) { 176*0452661fSBarry Smith d = (int *)PetscMalloc( ndiag * sizeof(int) ); CHKPTRQ(d); 177e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 178e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1790de55854SLois Curfman McInnes if (ndiag2 != ndiag) 180bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 181416022c9SBarry Smith } else if (OptionsHasName(0,"-mat_bdiag_dvals")) { 1820de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 183416022c9SBarry Smith } 184dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1850de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1860de55854SLois Curfman McInnes } else { 187fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 188e452cd2fSLois Curfman McInnes } 189*0452661fSBarry Smith if (d) PetscFree(d); 190aa6b49bfSBarry Smith return 0; 191e452cd2fSLois Curfman McInnes } 192dbb450caSBarry Smith if (type == MATMPIROWBS) { 1939b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1949b779142SLois Curfman McInnes } 195dbb450caSBarry Smith if (type == MATMPIROW) { 1966b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 197df998da4SLois Curfman McInnes } 198dbb450caSBarry Smith if (type == MATSEQROW) { 199fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 2003dfeaf31SLois Curfman McInnes } 20139ddd567SLois Curfman McInnes if (type == MATMPIDENSE) { 20239ddd567SLois Curfman McInnes return MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,V); 20339ddd567SLois Curfman McInnes } 204dbb450caSBarry Smith if (type == MATMPIAIJ) { 2055f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 2065f52d6abSBarry Smith } 207aa6b49bfSBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); 2087807a1faSBarry Smith } 2097807a1faSBarry Smith 210dae03382SLois Curfman McInnes #include "matimpl.h" 211dae03382SLois Curfman McInnes /*@C 212dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 213dae03382SLois Curfman McInnes 214dae03382SLois Curfman McInnes Input Parameter: 215dae03382SLois Curfman McInnes . mat - the matrix 216dae03382SLois Curfman McInnes 217dae03382SLois Curfman McInnes Output Parameter: 218dae03382SLois Curfman McInnes . name - name of matrix type 219dae03382SLois Curfman McInnes 220dae03382SLois Curfman McInnes .keywords: matrix, get, name 221dae03382SLois Curfman McInnes 222dae03382SLois Curfman McInnes .seealso: MatGetType() 223dae03382SLois Curfman McInnes @*/ 224dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 225dae03382SLois Curfman McInnes { 226dae03382SLois Curfman McInnes int itype = (int)mat->type; 22739ddd567SLois Curfman McInnes char *matname[10]; 228416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 229ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 230ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 231dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 232dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 233ec8511deSBarry Smith matname[4] = "MATSEQROW"; 234dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 235ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 236ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 2374c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 23839ddd567SLois Curfman McInnes matname[9] = "MATMPIDENSE"; 239096963f5SLois Curfman McInnes if (itype < 0 || itype > 9) *name = "Unknown matrix type"; 240dae03382SLois Curfman McInnes else *name = matname[itype]; 241dae03382SLois Curfman McInnes return 0; 242dae03382SLois Curfman McInnes } 243dae03382SLois Curfman McInnes 244