148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*416022c9SBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.45 1995/09/22 23:05:38 curfman Exp bsmith $"; 4cb512458SBarry Smith #endif 57807a1faSBarry Smith 67807a1faSBarry Smith #include "sys.h" 748b35521SBarry Smith #include "mat.h" /*I "mat.h" I*/ 87807a1faSBarry Smith 9*416022c9SBarry Smith /*@ 10*416022c9SBarry Smith MatGetFormatFromOptions - Determines from the options database what 11*416022c9SBarry Smith matrix format the users wants to use. 12*416022c9SBarry Smith 13*416022c9SBarry Smith Input Parameters: 14*416022c9SBarry Smith . comm - the MPI communicator to share matrix 15*416022c9SBarry Smith 16*416022c9SBarry Smith Output Parameters: 17*416022c9SBarry Smith . type - the type of matrix desired, for example MATSEQAIJ 18*416022c9SBarry Smith . set - flag indicating whether user set matrix format option. 19*416022c9SBarry Smith 20*416022c9SBarry Smith .seealso: MatCreate() 21*416022c9SBarry 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")) { 27dbb450caSBarry Smith MPIU_printf(comm,"Matrix format options: -mat_seqaij, -mat_aij, -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"); 31dbb450caSBarry Smith } 32dbb450caSBarry Smith if (OptionsHasName(0,"-mat_seqdense")) { 33dbb450caSBarry Smith *type = MATSEQDENSE; 34dbb450caSBarry Smith *set = 1; 35dbb450caSBarry Smith } 36dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqbdiag")) { 37dbb450caSBarry Smith *type = MATSEQBDIAG; 38dbb450caSBarry Smith *set = 1; 39dbb450caSBarry Smith } 40dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpibdiag")) { 41dbb450caSBarry Smith *type = MATMPIBDIAG; 42dbb450caSBarry Smith *set = 1; 43dbb450caSBarry Smith } 44dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirowbs")) { 45dbb450caSBarry Smith *type = MATMPIROWBS; 46dbb450caSBarry Smith *set = 1; 47dbb450caSBarry Smith } 48dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirow")) { 49dbb450caSBarry Smith *type = MATMPIROW; 50dbb450caSBarry Smith *set = 1; 51dbb450caSBarry Smith } 52dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqrow")){ 53dbb450caSBarry Smith *type = MATSEQROW; 54dbb450caSBarry Smith *set = 1; 55dbb450caSBarry Smith } 56dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpiaij")) { 57dbb450caSBarry Smith *type = MATMPIAIJ; 58dbb450caSBarry Smith *set = 1; 59dbb450caSBarry Smith } 60dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqaij")){ 61dbb450caSBarry Smith *type = MATSEQAIJ; 62dbb450caSBarry Smith *set = 1; 63dbb450caSBarry Smith } 64dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_aij")){ 65dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 66dbb450caSBarry Smith else *type = MATMPIAIJ; 67dbb450caSBarry Smith *set = 1; 68dbb450caSBarry Smith } 69dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_row")){ 70dbb450caSBarry Smith if (numtid == 1) *type = MATSEQROW; 71dbb450caSBarry Smith else *type = MATMPIROW; 72dbb450caSBarry Smith *set = 1; 73dbb450caSBarry Smith } 74dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_bdiag")){ 75dbb450caSBarry Smith if (numtid == 1) *type = MATSEQBDIAG; 76dbb450caSBarry Smith else *type = MATMPIBDIAG; 77dbb450caSBarry Smith *set = 1; 78dbb450caSBarry Smith } 79dbb450caSBarry Smith else { 80dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 81dbb450caSBarry Smith else *type = MATMPIAIJ; 82dbb450caSBarry Smith *set = 0; 83dbb450caSBarry Smith } 84dbb450caSBarry Smith return 0; 85dbb450caSBarry Smith } 86dbb450caSBarry Smith 87325ab940SBarry Smith /*@C 886469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 8902a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 9002a82ca1SLois Curfman McInnes communicator has more than one processor. 917807a1faSBarry Smith 927807a1faSBarry Smith Input Parameters: 93e0b365e2SLois Curfman McInnes . m - number of global rows 94e0b365e2SLois Curfman McInnes . n - number of global columns 956b5873e3SBarry Smith . comm - MPI communicator 967807a1faSBarry Smith 977807a1faSBarry Smith Output Parameter: 98df998da4SLois Curfman McInnes . V - location to stash resulting matrix 99e0b365e2SLois Curfman McInnes 100e0b365e2SLois Curfman McInnes Options Database Keywords: 1012a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 1022a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 1032a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 104dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 1055f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 106dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 107dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 108fafbff53SBarry Smith $ MatCreateSeqBDiag() 1097641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1107641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1117641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 1127641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1137641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 1147641ccfcSLois Curfman McInnes $ -mat_seqdense : dense type, uses MatCreateSeqDense() 115e0b365e2SLois Curfman McInnes 116e0b365e2SLois Curfman McInnes Notes: 117fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 118e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 119e0b365e2SLois Curfman McInnes 120e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 121e0b365e2SLois Curfman McInnes 122fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 123fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 124fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 125fafbff53SBarry Smith MatCreateSeqDense(), MatCreateMPIRowbs(), MatConvert() 126*416022c9SBarry Smith MatGetFormatFromOptions() 1277807a1faSBarry Smith @*/ 1286469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1297807a1faSBarry Smith { 130dbb450caSBarry Smith MatType type; 131dbb450caSBarry Smith int set,ierr; 132dbb450caSBarry Smith 133ce6d8b76SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,&type,&set); CHKERRQ(ierr); 134dbb450caSBarry Smith 135dbb450caSBarry Smith if (type == MATSEQDENSE) { 136fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1377807a1faSBarry Smith } 138dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 139dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 140f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 141f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 142f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 143f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 144f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 145f59b1570SLois Curfman McInnes } 146e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 147e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1480de55854SLois Curfman McInnes if (ndiag) { 14978b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 150e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 151e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1520de55854SLois Curfman McInnes if (ndiag2 != ndiag) 153bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 154*416022c9SBarry Smith } else if (OptionsHasName(0,"-mat_bdiag_dvals")) { 1550de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 156*416022c9SBarry Smith } 157dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1580de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1590de55854SLois Curfman McInnes } else { 160fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 161e452cd2fSLois Curfman McInnes } 16278b31e54SBarry Smith if (d) PETSCFREE(d); 163e452cd2fSLois Curfman McInnes return ierr; 164e452cd2fSLois Curfman McInnes } 165dbb450caSBarry Smith if (type == MATMPIROWBS) { 1669b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1679b779142SLois Curfman McInnes } 168dbb450caSBarry Smith if (type == MATMPIROW) { 1696b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 170df998da4SLois Curfman McInnes } 171dbb450caSBarry Smith if (type == MATSEQROW) { 172fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 1733dfeaf31SLois Curfman McInnes } 174dbb450caSBarry Smith if (type == MATMPIAIJ) { 1755f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 1765f52d6abSBarry Smith } 177fafbff53SBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); /* default uniprocessor format */ 1787807a1faSBarry Smith } 1797807a1faSBarry Smith 180dae03382SLois Curfman McInnes #include "matimpl.h" 181dae03382SLois Curfman McInnes /*@C 182dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 183dae03382SLois Curfman McInnes 184dae03382SLois Curfman McInnes Input Parameter: 185dae03382SLois Curfman McInnes . mat - the matrix 186dae03382SLois Curfman McInnes 187dae03382SLois Curfman McInnes Output Parameter: 188dae03382SLois Curfman McInnes . name - name of matrix type 189dae03382SLois Curfman McInnes 190dae03382SLois Curfman McInnes .keywords: matrix, get, name 191dae03382SLois Curfman McInnes 192dae03382SLois Curfman McInnes .seealso: MatGetType() 193dae03382SLois Curfman McInnes @*/ 194dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 195dae03382SLois Curfman McInnes { 196dae03382SLois Curfman McInnes int itype = (int)mat->type; 197dae03382SLois Curfman McInnes char *matname[9]; 198*416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 199ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 200ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 201dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 202dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 203ec8511deSBarry Smith matname[4] = "MATSEQROW"; 204dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 205ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 206ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 2074c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 208*416022c9SBarry Smith if (itype < 0 || itype > 8) *name = "Unknown matrix type"; 209dae03382SLois Curfman McInnes else *name = matname[itype]; 210dae03382SLois Curfman McInnes return 0; 211dae03382SLois Curfman McInnes } 212dae03382SLois Curfman McInnes 213