1cb512458SBarry Smith #ifndef lint 2*8c645567SLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.53 1995/10/23 20:31:16 curfman Exp curfman $"; 3cb512458SBarry Smith #endif 47807a1faSBarry Smith 57807a1faSBarry Smith #include "sys.h" 648b35521SBarry Smith #include "mat.h" /*I "mat.h" I*/ 77807a1faSBarry Smith 8416022c9SBarry Smith /*@ 9*8c645567SLois Curfman McInnes MatGetFormatFromOptions - Determines from the options database what matrix 10*8c645567SLois 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 15416022c9SBarry Smith 16416022c9SBarry Smith Output Parameters: 17932b0c3eSLois Curfman McInnes . set - flag indicating whether user set matrix type option. 18416022c9SBarry Smith 19*8c645567SLois Curfman McInnes Note: 20*8c645567SLois Curfman McInnes This routine is automatically called within MatCreate(). 21*8c645567SLois Curfman McInnes 2239ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options 2339ddd567SLois Curfman McInnes 24416022c9SBarry Smith .seealso: MatCreate() 25416022c9SBarry Smith @*/ 26ce6d8b76SLois Curfman McInnes int MatGetFormatFromOptions(MPI_Comm comm,MatType *type,int *set) 27dbb450caSBarry Smith { 2817699dbbSLois Curfman McInnes int size; 2917699dbbSLois Curfman McInnes MPI_Comm_size(comm,&size); 30dbb450caSBarry Smith if (OptionsHasName(0,"-help")) { 31932b0c3eSLois Curfman McInnes MPIU_printf(comm,"Matrix format options: -mat_aij, -mat_seqaij, -mat_mpiaij\n"); 32dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 33cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_dense, -mat_seqdense, -mat_mpidense\n"); 34cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_mpirowbs, -mat_bdiag, -mat_seqbdiag, -mat_mpibdiag\n"); 35cda99f1eSLois Curfman McInnes MPIU_printf(comm,"More matrix options:\n"); 36cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_view_info : view basic matrix info during MatAssemblyEnd()\n"); 37cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_view_info_detailed : view detailed matrix info during MatAssemblyEnd()\n"); 38cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_view_draw : draw nonzero matrix structure during MatAssemblyEnd()\n"); 396a819050SLois Curfman McInnes MPIU_printf(comm," -pause <sec> : set seconds of display pause\n"); 406a819050SLois Curfman McInnes MPIU_printf(comm," -display <name> : set alternate display\n"); 41dbb450caSBarry Smith } 42dbb450caSBarry Smith if (OptionsHasName(0,"-mat_seqdense")) { 43dbb450caSBarry Smith *type = MATSEQDENSE; 44dbb450caSBarry Smith *set = 1; 45dbb450caSBarry Smith } 4639ddd567SLois Curfman McInnes else if (OptionsHasName(0,"-mat_mpidense")) { 4739ddd567SLois Curfman McInnes *type = MATMPIDENSE; 4839ddd567SLois Curfman McInnes *set = 1; 4939ddd567SLois Curfman McInnes } 50dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqbdiag")) { 51dbb450caSBarry Smith *type = MATSEQBDIAG; 52dbb450caSBarry Smith *set = 1; 53dbb450caSBarry Smith } 54dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpibdiag")) { 55dbb450caSBarry Smith *type = MATMPIBDIAG; 56dbb450caSBarry Smith *set = 1; 57dbb450caSBarry Smith } 58dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirowbs")) { 59dbb450caSBarry Smith *type = MATMPIROWBS; 60dbb450caSBarry Smith *set = 1; 61dbb450caSBarry Smith } 62dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirow")) { 63dbb450caSBarry Smith *type = MATMPIROW; 64dbb450caSBarry Smith *set = 1; 65dbb450caSBarry Smith } 66dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqrow")){ 67dbb450caSBarry Smith *type = MATSEQROW; 68dbb450caSBarry Smith *set = 1; 69dbb450caSBarry Smith } 70dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpiaij")) { 71dbb450caSBarry Smith *type = MATMPIAIJ; 72dbb450caSBarry Smith *set = 1; 73dbb450caSBarry Smith } 74dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqaij")){ 75dbb450caSBarry Smith *type = MATSEQAIJ; 76dbb450caSBarry Smith *set = 1; 77dbb450caSBarry Smith } 78dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_aij")){ 7917699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 80dbb450caSBarry Smith else *type = MATMPIAIJ; 81dbb450caSBarry Smith *set = 1; 82dbb450caSBarry Smith } 83dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_row")){ 8417699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQROW; 85dbb450caSBarry Smith else *type = MATMPIROW; 86dbb450caSBarry Smith *set = 1; 87dbb450caSBarry Smith } 88dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_bdiag")){ 8917699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 90dbb450caSBarry Smith else *type = MATMPIBDIAG; 91dbb450caSBarry Smith *set = 1; 92dbb450caSBarry Smith } 9339ddd567SLois Curfman McInnes else if (OptionsHasName(0,"-mat_dense")){ 9439ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 9539ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 9639ddd567SLois Curfman McInnes *set = 1; 9739ddd567SLois Curfman McInnes } 98dbb450caSBarry Smith else { 9917699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 100dbb450caSBarry Smith else *type = MATMPIAIJ; 101dbb450caSBarry Smith *set = 0; 102dbb450caSBarry Smith } 103dbb450caSBarry Smith return 0; 104dbb450caSBarry Smith } 105dbb450caSBarry Smith 106325ab940SBarry Smith /*@C 1076469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 10802a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 10902a82ca1SLois Curfman McInnes communicator has more than one processor. 1107807a1faSBarry Smith 1117807a1faSBarry Smith Input Parameters: 112e0b365e2SLois Curfman McInnes . m - number of global rows 113e0b365e2SLois Curfman McInnes . n - number of global columns 1146b5873e3SBarry Smith . comm - MPI communicator 1157807a1faSBarry Smith 1167807a1faSBarry Smith Output Parameter: 117df998da4SLois Curfman McInnes . V - location to stash resulting matrix 118e0b365e2SLois Curfman McInnes 119e0b365e2SLois Curfman McInnes Options Database Keywords: 1202a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1212a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1222a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 123dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 1245f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 125dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 126dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 127fafbff53SBarry Smith $ MatCreateSeqBDiag() 1287641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1297641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1307641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1317641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1327641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 13339ddd567SLois Curfman McInnes $ -mat_dense : dense type, (Seq or MPI depending on comm) 13439ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateSeqDense() 13539ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 136e0b365e2SLois Curfman McInnes 137e0b365e2SLois Curfman McInnes Notes: 138fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 139e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 140e0b365e2SLois Curfman McInnes 141e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 142e0b365e2SLois Curfman McInnes 143fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 144fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 145fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 14639ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 14739ddd567SLois Curfman McInnes MatCreateMPIRowbs(), MatConvert() 148416022c9SBarry Smith MatGetFormatFromOptions() 1497807a1faSBarry Smith @*/ 1506469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1517807a1faSBarry Smith { 152dbb450caSBarry Smith MatType type; 153dbb450caSBarry Smith int set,ierr; 154dbb450caSBarry Smith 155ce6d8b76SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,&type,&set); CHKERRQ(ierr); 156dbb450caSBarry Smith if (type == MATSEQDENSE) { 157fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1587807a1faSBarry Smith } 159dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 160dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 161f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 162*8c645567SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize <block_size>\n"); 163*8c645567SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag <number_diags> \n"); 164*8c645567SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals <d1,d2,d3,...> (diagonal numbers)\n"); 165f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 166f59b1570SLois Curfman McInnes } 167e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 168e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1690de55854SLois Curfman McInnes if (ndiag) { 17078b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 171e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 172e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1730de55854SLois Curfman McInnes if (ndiag2 != ndiag) 174bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 175416022c9SBarry Smith } else if (OptionsHasName(0,"-mat_bdiag_dvals")) { 1760de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 177416022c9SBarry Smith } 178dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1790de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1800de55854SLois Curfman McInnes } else { 181fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 182e452cd2fSLois Curfman McInnes } 18378b31e54SBarry Smith if (d) PETSCFREE(d); 184aa6b49bfSBarry Smith return 0; 185e452cd2fSLois Curfman McInnes } 186dbb450caSBarry Smith if (type == MATMPIROWBS) { 1879b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1889b779142SLois Curfman McInnes } 189dbb450caSBarry Smith if (type == MATMPIROW) { 1906b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 191df998da4SLois Curfman McInnes } 192dbb450caSBarry Smith if (type == MATSEQROW) { 193fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 1943dfeaf31SLois Curfman McInnes } 19539ddd567SLois Curfman McInnes if (type == MATMPIDENSE) { 19639ddd567SLois Curfman McInnes return MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,V); 19739ddd567SLois Curfman McInnes } 198dbb450caSBarry Smith if (type == MATMPIAIJ) { 1995f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 2005f52d6abSBarry Smith } 201aa6b49bfSBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); 2027807a1faSBarry Smith } 2037807a1faSBarry Smith 204dae03382SLois Curfman McInnes #include "matimpl.h" 205dae03382SLois Curfman McInnes /*@C 206dae03382SLois Curfman McInnes MatGetName - Gets the matrix type 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: 212dae03382SLois Curfman McInnes . name - name of matrix type 213dae03382SLois Curfman McInnes 214dae03382SLois Curfman McInnes .keywords: matrix, get, name 215dae03382SLois Curfman McInnes 216dae03382SLois Curfman McInnes .seealso: MatGetType() 217dae03382SLois Curfman McInnes @*/ 218dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 219dae03382SLois Curfman McInnes { 220dae03382SLois Curfman McInnes int itype = (int)mat->type; 22139ddd567SLois Curfman McInnes char *matname[10]; 222416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 223ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 224ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 225dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 226dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 227ec8511deSBarry Smith matname[4] = "MATSEQROW"; 228dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 229ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 230ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 2314c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 23239ddd567SLois Curfman McInnes matname[9] = "MATMPIDENSE"; 233096963f5SLois Curfman McInnes if (itype < 0 || itype > 9) *name = "Unknown matrix type"; 234dae03382SLois Curfman McInnes else *name = matname[itype]; 235dae03382SLois Curfman McInnes return 0; 236dae03382SLois Curfman McInnes } 237dae03382SLois Curfman McInnes 238