1 2 #ifndef lint 3 static char vcid[] = "$Id: gcreate.c,v 1.31 1995/07/12 20:22:11 curfman Exp bsmith $"; 4 #endif 5 6 #include "sys.h" 7 #include "mat.h" /*I "mat.h" I*/ 8 9 /*@ 10 MatCreate - Creates a matrix, where the type is determined 11 from the options database. Generates a parallel MPI matrix if the 12 communicator has more than one processor. 13 14 Input Parameters: 15 . m - number of global rows 16 . n - number of global columns 17 . comm - MPI communicator 18 19 Output Parameter: 20 . V - location to stash resulting matrix 21 22 Options Database Keywords: 23 $ -mat_aij : AIJ type, uses MatCreateSequentialAIJ() 24 $ and MatCreateMPIAIJ() 25 $ -mat_dense : dense type, uses MatCreateSequentialDense() 26 $ -mat_row : row type, uses MatCreateSequentialRow() 27 $ and MatCreateMPIRow() 28 $ -mat_rowbs : rowbs type (for parallel symmetric matrices only), 29 $ uses MatCreateMPIRowbs() 30 $ -mat_bdiag : block diagonal type, uses 31 $ MatCreateSequentialBDiag() and 32 $ MatCreateMPIBDiag() 33 $ 34 $ -mpi_objects : uses MPI matrix (parallel format), even for one processor 35 36 Notes: 37 The default matrix type is AIJ, using MatCreateSequentialAIJ() and 38 MatCreateMPIAIJ(). 39 40 .keywords: matrix, create, initial 41 42 .seealso: MatCreateSequentialAIJ((), MatCreateMPIAIJ(), 43 MatCreateSequentialRow(), MatCreateMPIRow(), 44 MatCreateSequentialBDiag(),MatCreateMPIBDiag(), 45 MatCreateSequentialDense(), MatCreateMPIRowbs(), MatConvert() 46 @*/ 47 int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 48 { 49 int numtid; 50 MPI_Comm_size(comm,&numtid); 51 if (OptionsHasName(0,"-help")) { 52 MPIU_printf(comm,"MatCreate() options: -mat_dense, -mat_row -mat_rowbs\n"); 53 MPIU_printf(comm," -mat_bdiag, -mpi_objects\n"); 54 } 55 if (OptionsHasName(0,"-mat_dense")) { 56 return MatCreateSequentialDense(comm,m,n,V); 57 } 58 if (OptionsHasName(0,"-mat_bdiag")) { 59 int nb = 1, ndiag = 0, ndiag2, *d, ierr; 60 OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 61 OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 62 if (!ndiag) SETERRQ(1,"MatCreate:Must set diagonals before creating mat"); 63 d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 64 ndiag2 = ndiag; 65 OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 66 if (ndiag2 != ndiag) { 67 SETERRQ(1,"MatCreate:Incompatible number of diags and diagonal vals"); 68 } 69 if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) 70 ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); 71 else 72 ierr = MatCreateSequentialBDiag(comm,m,n,ndiag,nb,d,0,V); 73 CHKERRQ(ierr); 74 if (d) PETSCFREE(d); 75 return ierr; 76 } 77 #if defined(HAVE_BLOCKSOLVE) && !defined(__cplusplus) 78 if (OptionsHasName(0,"-mat_rowbs")) { 79 return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 80 } 81 #endif 82 if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) { 83 if (OptionsHasName(0,"-mat_row")) { 84 return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 85 } 86 return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 87 } 88 if (OptionsHasName(0,"-mat_row")) { 89 return MatCreateSequentialRow(comm,m,n,10,0,V); 90 } 91 return MatCreateSequentialAIJ(comm,m,n,10,0,V); 92 } 93 94 #include "matimpl.h" 95 /*@C 96 MatGetName - Gets the matrix type name (as a string) from the matrix. 97 98 Input Parameter: 99 . mat - the matrix 100 101 Output Parameter: 102 . name - name of matrix type 103 104 .keywords: matrix, get, name 105 106 .seealso: MatGetType() 107 @*/ 108 int MatGetName(Mat mat,char **name) 109 { 110 /* Note: Be sure that this list corresponds to the enum in mat.h */ 111 int itype = (int)mat->type; 112 char *matname[9]; 113 matname[0] = "MATDENSE"; 114 matname[1] = "MATAIJ"; 115 matname[2] = "MATMPIAIJ"; 116 matname[3] = "MATSHELL"; 117 matname[4] = "MATROW"; 118 matname[5] = "MATMPIROW"; 119 matname[6] = "MATMPIROW_BS"; 120 matname[7] = "MATMPIBDIAG"; 121 matname[8] = "MATBDIAG"; 122 if (itype < 0 || itype > 8) *name = "unknown matrix type"; 123 else *name = matname[itype]; 124 return 0; 125 } 126 127