148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*932b0c3eSLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.46 1995/09/30 19:29:59 bsmith Exp curfman $"; 4cb512458SBarry Smith #endif 57807a1faSBarry Smith 67807a1faSBarry Smith #include "sys.h" 748b35521SBarry Smith #include "mat.h" /*I "mat.h" I*/ 87807a1faSBarry Smith 9416022c9SBarry Smith /*@ 10*932b0c3eSLois Curfman McInnes MatGetFormatFromOptions - Determines from the options database what matrix format 11*932b0c3eSLois Curfman McInnes the user has specified. 12416022c9SBarry Smith 13*932b0c3eSLois Curfman McInnes Input Parameter: 14*932b0c3eSLois Curfman McInnes . comm - the MPI communicator 15*932b0c3eSLois Curfman McInnes . type - the type of matrix desired, for example MATSEQAIJ 16416022c9SBarry Smith 17416022c9SBarry Smith Output Parameters: 18*932b0c3eSLois Curfman McInnes . set - flag indicating whether user set matrix type option. 19416022c9SBarry Smith 20416022c9SBarry Smith .seealso: MatCreate() 21416022c9SBarry Smith @*/ 22ce6d8b76SLois Curfman McInnes int MatGetFormatFromOptions(MPI_Comm comm,MatType *type,int *set) 23dbb450caSBarry Smith { 24dbb450caSBarry Smith int numtid; 25dbb450caSBarry Smith MPI_Comm_size(comm,&numtid); 26dbb450caSBarry Smith if (OptionsHasName(0,"-help")) { 27*932b0c3eSLois Curfman McInnes MPIU_printf(comm,"Matrix format options: -mat_aij, -mat_seqaij, -mat_mpiaij\n"); 28dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 29dbb450caSBarry Smith MPIU_printf(comm," -mat_mpirowbs, -mat_seqdense\n"); 30dbb450caSBarry Smith MPIU_printf(comm," -mat_bdiag, -mat_seqbdiag,-mat_mpibdiag\n"); 31*932b0c3eSLois Curfman McInnes MPIU_printf(comm,"More matrix options: -mat_draw : draw nonzero structure of matrix\n"); 32*932b0c3eSLois Curfman McInnes MPIU_printf(comm," at conclusion of MatAssemblyEnd(). Use -pause <sec> to set\n"); 33*932b0c3eSLois Curfman McInnes MPIU_printf(comm," seconds of display pause. Use -display <name> to set alternate display\n"); 34dbb450caSBarry Smith } 35dbb450caSBarry Smith if (OptionsHasName(0,"-mat_seqdense")) { 36dbb450caSBarry Smith *type = MATSEQDENSE; 37dbb450caSBarry Smith *set = 1; 38dbb450caSBarry Smith } 39dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqbdiag")) { 40dbb450caSBarry Smith *type = MATSEQBDIAG; 41dbb450caSBarry Smith *set = 1; 42dbb450caSBarry Smith } 43dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpibdiag")) { 44dbb450caSBarry Smith *type = MATMPIBDIAG; 45dbb450caSBarry Smith *set = 1; 46dbb450caSBarry Smith } 47dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirowbs")) { 48dbb450caSBarry Smith *type = MATMPIROWBS; 49dbb450caSBarry Smith *set = 1; 50dbb450caSBarry Smith } 51dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirow")) { 52dbb450caSBarry Smith *type = MATMPIROW; 53dbb450caSBarry Smith *set = 1; 54dbb450caSBarry Smith } 55dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqrow")){ 56dbb450caSBarry Smith *type = MATSEQROW; 57dbb450caSBarry Smith *set = 1; 58dbb450caSBarry Smith } 59dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpiaij")) { 60dbb450caSBarry Smith *type = MATMPIAIJ; 61dbb450caSBarry Smith *set = 1; 62dbb450caSBarry Smith } 63dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqaij")){ 64dbb450caSBarry Smith *type = MATSEQAIJ; 65dbb450caSBarry Smith *set = 1; 66dbb450caSBarry Smith } 67dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_aij")){ 68dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 69dbb450caSBarry Smith else *type = MATMPIAIJ; 70dbb450caSBarry Smith *set = 1; 71dbb450caSBarry Smith } 72dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_row")){ 73dbb450caSBarry Smith if (numtid == 1) *type = MATSEQROW; 74dbb450caSBarry Smith else *type = MATMPIROW; 75dbb450caSBarry Smith *set = 1; 76dbb450caSBarry Smith } 77dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_bdiag")){ 78dbb450caSBarry Smith if (numtid == 1) *type = MATSEQBDIAG; 79dbb450caSBarry Smith else *type = MATMPIBDIAG; 80dbb450caSBarry Smith *set = 1; 81dbb450caSBarry Smith } 82dbb450caSBarry Smith else { 83dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 84dbb450caSBarry Smith else *type = MATMPIAIJ; 85dbb450caSBarry Smith *set = 0; 86dbb450caSBarry Smith } 87dbb450caSBarry Smith return 0; 88dbb450caSBarry Smith } 89dbb450caSBarry Smith 90325ab940SBarry Smith /*@C 916469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 9202a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 9302a82ca1SLois Curfman McInnes communicator has more than one processor. 947807a1faSBarry Smith 957807a1faSBarry Smith Input Parameters: 96e0b365e2SLois Curfman McInnes . m - number of global rows 97e0b365e2SLois Curfman McInnes . n - number of global columns 986b5873e3SBarry Smith . comm - MPI communicator 997807a1faSBarry Smith 1007807a1faSBarry Smith Output Parameter: 101df998da4SLois Curfman McInnes . V - location to stash resulting matrix 102e0b365e2SLois Curfman McInnes 103e0b365e2SLois Curfman McInnes Options Database Keywords: 1042a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1052a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1062a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 107dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 1085f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 109dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 110dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 111fafbff53SBarry Smith $ MatCreateSeqBDiag() 1127641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1137641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1147641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1157641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1167641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 1177641ccfcSLois Curfman McInnes $ -mat_seqdense : dense type, uses MatCreateSeqDense() 118e0b365e2SLois Curfman McInnes 119e0b365e2SLois Curfman McInnes Notes: 120fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 121e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 122e0b365e2SLois Curfman McInnes 123e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 124e0b365e2SLois Curfman McInnes 125fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 126fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 127fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 128fafbff53SBarry Smith MatCreateSeqDense(), MatCreateMPIRowbs(), MatConvert() 129416022c9SBarry Smith MatGetFormatFromOptions() 1307807a1faSBarry Smith @*/ 1316469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1327807a1faSBarry Smith { 133dbb450caSBarry Smith MatType type; 134dbb450caSBarry Smith int set,ierr; 135dbb450caSBarry Smith 136ce6d8b76SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,&type,&set); CHKERRQ(ierr); 137dbb450caSBarry Smith 138dbb450caSBarry Smith if (type == MATSEQDENSE) { 139fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1407807a1faSBarry Smith } 141dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 142dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 143f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 144f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 145f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 146f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 147f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 148f59b1570SLois Curfman McInnes } 149e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 150e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1510de55854SLois Curfman McInnes if (ndiag) { 15278b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 153e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 154e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1550de55854SLois Curfman McInnes if (ndiag2 != ndiag) 156bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 157416022c9SBarry Smith } else if (OptionsHasName(0,"-mat_bdiag_dvals")) { 1580de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 159416022c9SBarry Smith } 160dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1610de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1620de55854SLois Curfman McInnes } else { 163fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 164e452cd2fSLois Curfman McInnes } 16578b31e54SBarry Smith if (d) PETSCFREE(d); 166e452cd2fSLois Curfman McInnes return ierr; 167e452cd2fSLois Curfman McInnes } 168dbb450caSBarry Smith if (type == MATMPIROWBS) { 1699b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1709b779142SLois Curfman McInnes } 171dbb450caSBarry Smith if (type == MATMPIROW) { 1726b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 173df998da4SLois Curfman McInnes } 174dbb450caSBarry Smith if (type == MATSEQROW) { 175fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 1763dfeaf31SLois Curfman McInnes } 177dbb450caSBarry Smith if (type == MATMPIAIJ) { 1785f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 1795f52d6abSBarry Smith } 180fafbff53SBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); /* default uniprocessor format */ 1817807a1faSBarry Smith } 1827807a1faSBarry Smith 183dae03382SLois Curfman McInnes #include "matimpl.h" 184dae03382SLois Curfman McInnes /*@C 185dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 186dae03382SLois Curfman McInnes 187dae03382SLois Curfman McInnes Input Parameter: 188dae03382SLois Curfman McInnes . mat - the matrix 189dae03382SLois Curfman McInnes 190dae03382SLois Curfman McInnes Output Parameter: 191dae03382SLois Curfman McInnes . name - name of matrix type 192dae03382SLois Curfman McInnes 193dae03382SLois Curfman McInnes .keywords: matrix, get, name 194dae03382SLois Curfman McInnes 195dae03382SLois Curfman McInnes .seealso: MatGetType() 196dae03382SLois Curfman McInnes @*/ 197dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 198dae03382SLois Curfman McInnes { 199dae03382SLois Curfman McInnes int itype = (int)mat->type; 200dae03382SLois Curfman McInnes char *matname[9]; 201416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 202ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 203ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 204dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 205dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 206ec8511deSBarry Smith matname[4] = "MATSEQROW"; 207dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 208ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 209ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 2104c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 211416022c9SBarry Smith if (itype < 0 || itype > 8) *name = "Unknown matrix type"; 212dae03382SLois Curfman McInnes else *name = matname[itype]; 213dae03382SLois Curfman McInnes return 0; 214dae03382SLois Curfman McInnes } 215dae03382SLois Curfman McInnes 216