148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*dbb450caSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.42 1995/09/12 18:42:03 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*dbb450caSBarry Smith int MatGetFormatFromOptions_Private(MPI_Comm comm,MatType *type,int *set) 10*dbb450caSBarry Smith { 11*dbb450caSBarry Smith int numtid; 12*dbb450caSBarry Smith MPI_Comm_size(comm,&numtid); 13*dbb450caSBarry Smith if (OptionsHasName(0,"-help")) { 14*dbb450caSBarry Smith MPIU_printf(comm,"Matrix format options: -mat_seqaij, -mat_aij, -mat_mpiaij\n"); 15*dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 16*dbb450caSBarry Smith MPIU_printf(comm," -mat_mpirowbs, -mat_seqdense\n"); 17*dbb450caSBarry Smith MPIU_printf(comm," -mat_bdiag, -mat_seqbdiag,-mat_mpibdiag\n"); 18*dbb450caSBarry Smith } 19*dbb450caSBarry Smith if (OptionsHasName(0,"-mat_seqdense")) { 20*dbb450caSBarry Smith *type = MATSEQDENSE; 21*dbb450caSBarry Smith *set = 1; 22*dbb450caSBarry Smith } 23*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqbdiag")) { 24*dbb450caSBarry Smith *type = MATSEQBDIAG; 25*dbb450caSBarry Smith *set = 1; 26*dbb450caSBarry Smith } 27*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpibdiag")) { 28*dbb450caSBarry Smith *type = MATMPIBDIAG; 29*dbb450caSBarry Smith *set = 1; 30*dbb450caSBarry Smith } 31*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirowbs")) { 32*dbb450caSBarry Smith *type = MATMPIROWBS; 33*dbb450caSBarry Smith *set = 1; 34*dbb450caSBarry Smith } 35*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpirow")) { 36*dbb450caSBarry Smith *type = MATMPIROW; 37*dbb450caSBarry Smith *set = 1; 38*dbb450caSBarry Smith } 39*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqrow")){ 40*dbb450caSBarry Smith *type = MATSEQROW; 41*dbb450caSBarry Smith *set = 1; 42*dbb450caSBarry Smith } 43*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_mpiaij")) { 44*dbb450caSBarry Smith *type = MATMPIAIJ; 45*dbb450caSBarry Smith *set = 1; 46*dbb450caSBarry Smith } 47*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_seqaij")){ 48*dbb450caSBarry Smith *type = MATSEQAIJ; 49*dbb450caSBarry Smith *set = 1; 50*dbb450caSBarry Smith } 51*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_aij")){ 52*dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 53*dbb450caSBarry Smith else *type = MATMPIAIJ; 54*dbb450caSBarry Smith *set = 1; 55*dbb450caSBarry Smith } 56*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_row")){ 57*dbb450caSBarry Smith if (numtid == 1) *type = MATSEQROW; 58*dbb450caSBarry Smith else *type = MATMPIROW; 59*dbb450caSBarry Smith *set = 1; 60*dbb450caSBarry Smith } 61*dbb450caSBarry Smith else if (OptionsHasName(0,"-mat_bdiag")){ 62*dbb450caSBarry Smith if (numtid == 1) *type = MATSEQBDIAG; 63*dbb450caSBarry Smith else *type = MATMPIBDIAG; 64*dbb450caSBarry Smith *set = 1; 65*dbb450caSBarry Smith } 66*dbb450caSBarry Smith else { 67*dbb450caSBarry Smith if (numtid == 1) *type = MATSEQAIJ; 68*dbb450caSBarry Smith else *type = MATMPIAIJ; 69*dbb450caSBarry Smith *set = 0; 70*dbb450caSBarry Smith } 71*dbb450caSBarry Smith return 0; 72*dbb450caSBarry Smith } 73*dbb450caSBarry 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) 91*dbb450caSBarry Smith $ -mat_seqdense : dense type, uses MatCreateSeqDense() 92*dbb450caSBarry Smith $ -mat_seqrow : row type, uses MatCreateSeqRow() 935f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 94*dbb450caSBarry Smith $ -mat_row : row type,(Seq or MPI depending on comm) 955f52d6abSBarry Smith $ -mat_mpirowbs : rowbs type. 96e0b365e2SLois Curfman McInnes $ uses MatCreateMPIRowbs() 97*dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 98fafbff53SBarry Smith $ MatCreateSeqBDiag() 995f52d6abSBarry Smith $ -mat_mpibdiag : MatCreateMPIBDiag() 100*dbb450caSBarry Smith $ -mat_bdiag : block diagonal type, (Seq or MPI depending on comm) 101e0b365e2SLois Curfman McInnes 102e0b365e2SLois Curfman McInnes Notes: 103fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 104e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 105e0b365e2SLois Curfman McInnes 106e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 107e0b365e2SLois Curfman McInnes 108fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 109fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 110fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 111fafbff53SBarry Smith MatCreateSeqDense(), MatCreateMPIRowbs(), MatConvert() 1127807a1faSBarry Smith @*/ 1136469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 1147807a1faSBarry Smith { 115*dbb450caSBarry Smith MatType type; 116*dbb450caSBarry Smith int set,ierr; 117*dbb450caSBarry Smith 1187f813858SBarry Smith if (OptionsHasName(0,"-help")) { 119*dbb450caSBarry Smith MPIU_printf(comm,"MatCreate() options: -mat_seqaij, -mat_aij, -mat_mpiaij\n"); 120*dbb450caSBarry Smith MPIU_printf(comm," -mat_row, -mat_seqrow, -mat_mpirow\n"); 121*dbb450caSBarry Smith MPIU_printf(comm," -mat_mpirowbs, -mat_seqdense\n"); 122*dbb450caSBarry Smith MPIU_printf(comm," -mat_bdiag, -mat_seqbdiag,-mat_mpibdiag\n"); 1237f813858SBarry Smith } 124*dbb450caSBarry Smith ierr = MatGetFormatFromOptions_Private(comm,&type,&set); CHKERRQ(ierr); 125*dbb450caSBarry Smith 126*dbb450caSBarry Smith if (type == MATSEQDENSE) { 127fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 1287807a1faSBarry Smith } 129*dbb450caSBarry Smith if (type == MATSEQBDIAG || type == MATMPIBDIAG) { 130*dbb450caSBarry Smith int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0; 131f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 132f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 133f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 134f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 135f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 136f59b1570SLois Curfman McInnes } 137e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 138e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 1390de55854SLois Curfman McInnes if (ndiag) { 14078b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 141e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 142e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 1430de55854SLois Curfman McInnes if (ndiag2 != ndiag) 144bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 1450de55854SLois Curfman McInnes } else if (OptionsHasName(0,"-mat_bdiag_dvals")) 1460de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 147*dbb450caSBarry Smith if (type == MATMPIBDIAG) { 1480de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 1490de55854SLois Curfman McInnes } else { 150fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 151e452cd2fSLois Curfman McInnes } 15278b31e54SBarry Smith if (d) PETSCFREE(d); 153e452cd2fSLois Curfman McInnes return ierr; 154e452cd2fSLois Curfman McInnes } 155*dbb450caSBarry Smith if (type == MATMPIROWBS) { 1569b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 1579b779142SLois Curfman McInnes } 158*dbb450caSBarry Smith if (type == MATMPIROW) { 1596b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 160df998da4SLois Curfman McInnes } 161*dbb450caSBarry Smith if (type == MATSEQROW) { 162fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 1633dfeaf31SLois Curfman McInnes } 164*dbb450caSBarry Smith if (type == MATMPIAIJ) { 1655f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 1665f52d6abSBarry Smith } 167fafbff53SBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); /* default uniprocessor format */ 1687807a1faSBarry Smith } 1697807a1faSBarry Smith 170dae03382SLois Curfman McInnes #include "matimpl.h" 171dae03382SLois Curfman McInnes /*@C 172dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 173dae03382SLois Curfman McInnes 174dae03382SLois Curfman McInnes Input Parameter: 175dae03382SLois Curfman McInnes . mat - the matrix 176dae03382SLois Curfman McInnes 177dae03382SLois Curfman McInnes Output Parameter: 178dae03382SLois Curfman McInnes . name - name of matrix type 179dae03382SLois Curfman McInnes 180dae03382SLois Curfman McInnes .keywords: matrix, get, name 181dae03382SLois Curfman McInnes 182dae03382SLois Curfman McInnes .seealso: MatGetType() 183dae03382SLois Curfman McInnes @*/ 184dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 185dae03382SLois Curfman McInnes { 186dae03382SLois Curfman McInnes /* Note: Be sure that this list corresponds to the enum in mat.h */ 187dae03382SLois Curfman McInnes int itype = (int)mat->type; 188dae03382SLois Curfman McInnes char *matname[9]; 189ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 190ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 191dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 192dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 193ec8511deSBarry Smith matname[4] = "MATSEQROW"; 194dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 195ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 196ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 1974c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 198dae03382SLois Curfman McInnes if (itype < 0 || itype > 8) *name = "unknown matrix type"; 199dae03382SLois Curfman McInnes else *name = matname[itype]; 200dae03382SLois Curfman McInnes return 0; 201dae03382SLois Curfman McInnes } 202dae03382SLois Curfman McInnes 203