1cb512458SBarry Smith #ifndef lint 2*cda99f1eSLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.51 1995/10/22 22:44:07 bsmith 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 /*@ 9932b0c3eSLois Curfman McInnes MatGetFormatFromOptions - Determines from the options database what matrix format 10932b0c3eSLois Curfman McInnes 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 1939ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options 2039ddd567SLois Curfman McInnes 21416022c9SBarry Smith .seealso: MatCreate() 22416022c9SBarry Smith @*/ 23ce6d8b76SLois Curfman McInnes int MatGetFormatFromOptions(MPI_Comm comm,MatType *type,int *set) 24dbb450caSBarry Smith { 2517699dbbSLois Curfman McInnes int size; 2617699dbbSLois Curfman McInnes MPI_Comm_size(comm,&size); 27dbb450caSBarry Smith if (OptionsHasName(0,"-help")) { 28932b0c3eSLois Curfman McInnes MPIU_printf(comm,"Matrix format options: -mat_aij, -mat_seqaij, -mat_mpiaij\n"); 29dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 30*cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_dense, -mat_seqdense, -mat_mpidense\n"); 31*cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_mpirowbs, -mat_bdiag, -mat_seqbdiag, -mat_mpibdiag\n"); 32*cda99f1eSLois Curfman McInnes MPIU_printf(comm,"More matrix options:\n"); 33*cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_view_info : view basic matrix info during MatAssemblyEnd()\n"); 34*cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_view_info_detailed : view detailed matrix info during MatAssemblyEnd()\n"); 35*cda99f1eSLois Curfman McInnes MPIU_printf(comm," -mat_view_draw : draw nonzero matrix structure during MatAssemblyEnd()\n"); 36*cda99f1eSLois Curfman McInnes MPIU_printf(comm," Use -pause <sec> to set seconds of display pause.\n"); 37*cda99f1eSLois Curfman McInnes MPIU_printf(comm," Use -display <name> to set alternate display\n"); 38dbb450caSBarry Smith } 39dbb450caSBarry Smith if (OptionsHasName(0,"-mat_seqdense")) { 40dbb450caSBarry Smith *type = MATSEQDENSE; 41dbb450caSBarry Smith *set = 1; 42dbb450caSBarry Smith } 4339ddd567SLois Curfman McInnes else if (OptionsHasName(0,"-mat_mpidense")) { 4439ddd567SLois Curfman McInnes *type = MATMPIDENSE; 4539ddd567SLois Curfman McInnes *set = 1; 4639ddd567SLois Curfman McInnes } 47dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqbdiag")) { 48dbb450caSBarry Smith *type = MATSEQBDIAG; 49dbb450caSBarry Smith *set = 1; 50dbb450caSBarry Smith } 51dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpibdiag")) { 52dbb450caSBarry Smith *type = MATMPIBDIAG; 53dbb450caSBarry Smith *set = 1; 54dbb450caSBarry Smith } 55dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirowbs")) { 56dbb450caSBarry Smith *type = MATMPIROWBS; 57dbb450caSBarry Smith *set = 1; 58dbb450caSBarry Smith } 59dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirow")) { 60dbb450caSBarry Smith *type = MATMPIROW; 61dbb450caSBarry Smith *set = 1; 62dbb450caSBarry Smith } 63dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqrow")){ 64dbb450caSBarry Smith *type = MATSEQROW; 65dbb450caSBarry Smith *set = 1; 66dbb450caSBarry Smith } 67dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpiaij")) { 68dbb450caSBarry Smith *type = MATMPIAIJ; 69dbb450caSBarry Smith *set = 1; 70dbb450caSBarry Smith } 71dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqaij")){ 72dbb450caSBarry Smith *type = MATSEQAIJ; 73dbb450caSBarry Smith *set = 1; 74dbb450caSBarry Smith } 75dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_aij")){ 7617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 77dbb450caSBarry Smith else *type = MATMPIAIJ; 78dbb450caSBarry Smith *set = 1; 79dbb450caSBarry Smith } 80dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_row")){ 8117699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQROW; 82dbb450caSBarry Smith else *type = MATMPIROW; 83dbb450caSBarry Smith *set = 1; 84dbb450caSBarry Smith } 85dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_bdiag")){ 8617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 87dbb450caSBarry Smith else *type = MATMPIBDIAG; 88dbb450caSBarry Smith *set = 1; 89dbb450caSBarry Smith } 9039ddd567SLois Curfman McInnes else if (OptionsHasName(0,"-mat_dense")){ 9139ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 9239ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 9339ddd567SLois Curfman McInnes *set = 1; 9439ddd567SLois Curfman McInnes } 95dbb450caSBarry Smith else { 9617699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 97dbb450caSBarry Smith else *type = MATMPIAIJ; 98dbb450caSBarry Smith *set = 0; 99dbb450caSBarry Smith } 100dbb450caSBarry Smith return 0; 101dbb450caSBarry Smith } 102dbb450caSBarry Smith 103325ab940SBarry Smith /*@C 1046469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 10502a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 10602a82ca1SLois Curfman McInnes communicator has more than one processor. 1077807a1faSBarry Smith 1087807a1faSBarry Smith Input Parameters: 109e0b365e2SLois Curfman McInnes . m - number of global rows 110e0b365e2SLois Curfman McInnes . n - number of global columns 1116b5873e3SBarry Smith . comm - MPI communicator 1127807a1faSBarry Smith 1137807a1faSBarry Smith Output Parameter: 114df998da4SLois Curfman McInnes . V - location to stash resulting matrix 115e0b365e2SLois Curfman McInnes 116e0b365e2SLois Curfman McInnes Options Database Keywords: 1172a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1182a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1192a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 120dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 1215f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 122dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 123dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 124fafbff53SBarry Smith $ MatCreateSeqBDiag() 1257641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1267641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1277641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1287641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1297641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 13039ddd567SLois Curfman McInnes $ -mat_dense : dense type, (Seq or MPI depending on comm) 13139ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateSeqDense() 13239ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 133e0b365e2SLois Curfman McInnes 134e0b365e2SLois Curfman McInnes Notes: 135fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 136e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 137e0b365e2SLois Curfman McInnes 138e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 139e0b365e2SLois Curfman McInnes 140fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 141fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 142fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 14339ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 14439ddd567SLois Curfman McInnes MatCreateMPIRowbs(), MatConvert() 145416022c9SBarry Smith MatGetFormatFromOptions() 1467807a1faSBarry Smith @*/ 1476469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1487807a1faSBarry Smith { 149dbb450caSBarry Smith MatType type; 150dbb450caSBarry Smith int set,ierr; 151dbb450caSBarry Smith 152ce6d8b76SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,&type,&set); CHKERRQ(ierr); 153dbb450caSBarry Smith if (type == MATSEQDENSE) { 154fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1557807a1faSBarry Smith } 156dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 157dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 158f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 159f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 160f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 161f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 162f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 163f59b1570SLois Curfman McInnes } 164e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 165e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1660de55854SLois Curfman McInnes if (ndiag) { 16778b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 168e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 169e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1700de55854SLois Curfman McInnes if (ndiag2 != ndiag) 171bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 172416022c9SBarry Smith } else if (OptionsHasName(0,"-mat_bdiag_dvals")) { 1730de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 174416022c9SBarry Smith } 175dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1760de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1770de55854SLois Curfman McInnes } else { 178fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 179e452cd2fSLois Curfman McInnes } 18078b31e54SBarry Smith if (d) PETSCFREE(d); 181aa6b49bfSBarry Smith return 0; 182e452cd2fSLois Curfman McInnes } 183dbb450caSBarry Smith if (type == MATMPIROWBS) { 1849b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1859b779142SLois Curfman McInnes } 186dbb450caSBarry Smith if (type == MATMPIROW) { 1876b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 188df998da4SLois Curfman McInnes } 189dbb450caSBarry Smith if (type == MATSEQROW) { 190fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 1913dfeaf31SLois Curfman McInnes } 19239ddd567SLois Curfman McInnes if (type == MATMPIDENSE) { 19339ddd567SLois Curfman McInnes return MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,V); 19439ddd567SLois Curfman McInnes } 195dbb450caSBarry Smith if (type == MATMPIAIJ) { 1965f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 1975f52d6abSBarry Smith } 198aa6b49bfSBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); 1997807a1faSBarry Smith } 2007807a1faSBarry Smith 201dae03382SLois Curfman McInnes #include "matimpl.h" 202dae03382SLois Curfman McInnes /*@C 203dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 204dae03382SLois Curfman McInnes 205dae03382SLois Curfman McInnes Input Parameter: 206dae03382SLois Curfman McInnes . mat - the matrix 207dae03382SLois Curfman McInnes 208dae03382SLois Curfman McInnes Output Parameter: 209dae03382SLois Curfman McInnes . name - name of matrix type 210dae03382SLois Curfman McInnes 211dae03382SLois Curfman McInnes .keywords: matrix, get, name 212dae03382SLois Curfman McInnes 213dae03382SLois Curfman McInnes .seealso: MatGetType() 214dae03382SLois Curfman McInnes @*/ 215dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 216dae03382SLois Curfman McInnes { 217dae03382SLois Curfman McInnes int itype = (int)mat->type; 21839ddd567SLois Curfman McInnes char *matname[10]; 219416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 220ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 221ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 222dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 223dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 224ec8511deSBarry Smith matname[4] = "MATSEQROW"; 225dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 226ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 227ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 2284c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 22939ddd567SLois Curfman McInnes matname[9] = "MATMPIDENSE"; 230096963f5SLois Curfman McInnes if (itype < 0 || itype > 9) *name = "Unknown matrix type"; 231dae03382SLois Curfman McInnes else *name = matname[itype]; 232dae03382SLois Curfman McInnes return 0; 233dae03382SLois Curfman McInnes } 234dae03382SLois Curfman McInnes 235