148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*ce6d8b76SLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.44 1995/09/21 20:37:10 curfman Exp curfman $"; 4cb512458SBarry Smith #endif 57807a1faSBarry Smith 67807a1faSBarry Smith #include "sys.h" 748b35521SBarry Smith #include "mat.h" /*I "mat.h" I*/ 87807a1faSBarry Smith 9*ce6d8b76SLois Curfman McInnes int MatGetFormatFromOptions(MPI_Comm comm,MatType *type,int *set) 10dbb450caSBarry Smith { 11dbb450caSBarry Smith int numtid; 12dbb450caSBarry Smith MPI_Comm_size(comm,&numtid); 13dbb450caSBarry Smith if (OptionsHasName(0,"-help")) { 14dbb450caSBarry Smith MPIU_printf(comm,"Matrix format options: -mat_seqaij, -mat_aij, -mat_mpiaij\n"); 15dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 16dbb450caSBarry Smith MPIU_printf(comm," -mat_mpirowbs, -mat_seqdense\n"); 17dbb450caSBarry Smith MPIU_printf(comm," -mat_bdiag, -mat_seqbdiag,-mat_mpibdiag\n"); 18dbb450caSBarry Smith } 19dbb450caSBarry Smith if (OptionsHasName(0,"-mat_seqdense")) { 20dbb450caSBarry Smith *type = MATSEQDENSE; 21dbb450caSBarry Smith *set = 1; 22dbb450caSBarry Smith } 23dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqbdiag")) { 24dbb450caSBarry Smith *type = MATSEQBDIAG; 25dbb450caSBarry Smith *set = 1; 26dbb450caSBarry Smith } 27dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpibdiag")) { 28dbb450caSBarry Smith *type = MATMPIBDIAG; 29dbb450caSBarry Smith *set = 1; 30dbb450caSBarry Smith } 31dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirowbs")) { 32dbb450caSBarry Smith *type = MATMPIROWBS; 33dbb450caSBarry Smith *set = 1; 34dbb450caSBarry Smith } 35dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirow")) { 36dbb450caSBarry Smith *type = MATMPIROW; 37dbb450caSBarry Smith *set = 1; 38dbb450caSBarry Smith } 39dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqrow")){ 40dbb450caSBarry Smith *type = MATSEQROW; 41dbb450caSBarry Smith *set = 1; 42dbb450caSBarry Smith } 43dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpiaij")) { 44dbb450caSBarry Smith *type = MATMPIAIJ; 45dbb450caSBarry Smith *set = 1; 46dbb450caSBarry Smith } 47dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqaij")){ 48dbb450caSBarry Smith *type = MATSEQAIJ; 49dbb450caSBarry Smith *set = 1; 50dbb450caSBarry Smith } 51dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_aij")){ 52dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 53dbb450caSBarry Smith else *type = MATMPIAIJ; 54dbb450caSBarry Smith *set = 1; 55dbb450caSBarry Smith } 56dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_row")){ 57dbb450caSBarry Smith if (numtid == 1) *type = MATSEQROW; 58dbb450caSBarry Smith else *type = MATMPIROW; 59dbb450caSBarry Smith *set = 1; 60dbb450caSBarry Smith } 61dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_bdiag")){ 62dbb450caSBarry Smith if (numtid == 1) *type = MATSEQBDIAG; 63dbb450caSBarry Smith else *type = MATMPIBDIAG; 64dbb450caSBarry Smith *set = 1; 65dbb450caSBarry Smith } 66dbb450caSBarry Smith else { 67dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 68dbb450caSBarry Smith else *type = MATMPIAIJ; 69dbb450caSBarry Smith *set = 0; 70dbb450caSBarry Smith } 71dbb450caSBarry Smith return 0; 72dbb450caSBarry Smith } 73dbb450caSBarry Smith 74325ab940SBarry Smith /*@C 756469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 7602a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 7702a82ca1SLois Curfman McInnes communicator has more than one processor. 787807a1faSBarry Smith 797807a1faSBarry Smith Input Parameters: 80e0b365e2SLois Curfman McInnes . m - number of global rows 81e0b365e2SLois Curfman McInnes . n - number of global columns 826b5873e3SBarry Smith . comm - MPI communicator 837807a1faSBarry Smith 847807a1faSBarry Smith Output Parameter: 85df998da4SLois Curfman McInnes . V - location to stash resulting matrix 86e0b365e2SLois Curfman McInnes 87e0b365e2SLois Curfman McInnes Options Database Keywords: 882a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 892a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 902a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 91dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 925f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 93dbb450caSBarry Smith $ -mat_row : row type, (Seq or MPI depending on comm) 94dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 95fafbff53SBarry Smith $ MatCreateSeqBDiag() 967641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 977641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 987641ccfcSLois Curfman McInnes $ -mat_bdiag : block diagonal type, 997641ccfcSLois Curfman McInnes $ (Seq or MPI depending on comm) 1007641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 1017641ccfcSLois Curfman McInnes $ -mat_seqdense : dense type, uses MatCreateSeqDense() 102e0b365e2SLois Curfman McInnes 103e0b365e2SLois Curfman McInnes Notes: 104fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 105e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 106e0b365e2SLois Curfman McInnes 107e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 108e0b365e2SLois Curfman McInnes 109fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 110fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 111fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 112fafbff53SBarry Smith MatCreateSeqDense(), MatCreateMPIRowbs(), MatConvert() 1137807a1faSBarry Smith @*/ 1146469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1157807a1faSBarry Smith { 116dbb450caSBarry Smith MatType type; 117dbb450caSBarry Smith int set,ierr; 118dbb450caSBarry Smith 1197f813858SBarry Smith if (OptionsHasName(0,"-help")) { 120dbb450caSBarry Smith MPIU_printf(comm,"MatCreate() options: -mat_seqaij, -mat_aij, -mat_mpiaij\n"); 121dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 122dbb450caSBarry Smith MPIU_printf(comm," -mat_mpirowbs, -mat_seqdense\n"); 123dbb450caSBarry Smith MPIU_printf(comm," -mat_bdiag, -mat_seqbdiag,-mat_mpibdiag\n"); 1247f813858SBarry Smith } 125*ce6d8b76SLois Curfman McInnes ierr = MatGetFormatFromOptions(comm,&type,&set); CHKERRQ(ierr); 126dbb450caSBarry Smith 127dbb450caSBarry Smith if (type == MATSEQDENSE) { 128fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1297807a1faSBarry Smith } 130dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 131dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 132f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 133f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 134f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 135f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 136f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 137f59b1570SLois Curfman McInnes } 138e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 139e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1400de55854SLois Curfman McInnes if (ndiag) { 14178b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 142e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 143e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1440de55854SLois Curfman McInnes if (ndiag2 != ndiag) 145bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 1460de55854SLois Curfman McInnes } else if (OptionsHasName(0,"-mat_bdiag_dvals")) 1470de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 148dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1490de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1500de55854SLois Curfman McInnes } else { 151fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 152e452cd2fSLois Curfman McInnes } 15378b31e54SBarry Smith if (d) PETSCFREE(d); 154e452cd2fSLois Curfman McInnes return ierr; 155e452cd2fSLois Curfman McInnes } 156dbb450caSBarry Smith if (type == MATMPIROWBS) { 1579b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1589b779142SLois Curfman McInnes } 159dbb450caSBarry Smith if (type == MATMPIROW) { 1606b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 161df998da4SLois Curfman McInnes } 162dbb450caSBarry Smith if (type == MATSEQROW) { 163fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 1643dfeaf31SLois Curfman McInnes } 165dbb450caSBarry Smith if (type == MATMPIAIJ) { 1665f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 1675f52d6abSBarry Smith } 168fafbff53SBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); /* default uniprocessor format */ 1697807a1faSBarry Smith } 1707807a1faSBarry Smith 171dae03382SLois Curfman McInnes #include "matimpl.h" 172dae03382SLois Curfman McInnes /*@C 173dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 174dae03382SLois Curfman McInnes 175dae03382SLois Curfman McInnes Input Parameter: 176dae03382SLois Curfman McInnes . mat - the matrix 177dae03382SLois Curfman McInnes 178dae03382SLois Curfman McInnes Output Parameter: 179dae03382SLois Curfman McInnes . name - name of matrix type 180dae03382SLois Curfman McInnes 181dae03382SLois Curfman McInnes .keywords: matrix, get, name 182dae03382SLois Curfman McInnes 183dae03382SLois Curfman McInnes .seealso: MatGetType() 184dae03382SLois Curfman McInnes @*/ 185dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 186dae03382SLois Curfman McInnes { 187dae03382SLois Curfman McInnes /* Note: Be sure that this list corresponds to the enum in mat.h */ 188dae03382SLois Curfman McInnes int itype = (int)mat->type; 189dae03382SLois Curfman McInnes char *matname[9]; 190ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 191ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 192dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 193dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 194ec8511deSBarry Smith matname[4] = "MATSEQROW"; 195dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 196ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 197ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 1984c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 199dae03382SLois Curfman McInnes if (itype < 0 || itype > 8) *name = "unknown matrix type"; 200dae03382SLois Curfman McInnes else *name = matname[itype]; 201dae03382SLois Curfman McInnes return 0; 202dae03382SLois Curfman McInnes } 203dae03382SLois Curfman McInnes 204