148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*2a9f886eSLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.41 1995/09/12 03:26:11 bsmith Exp curfman $"; 4cb512458SBarry Smith #endif 57807a1faSBarry Smith 67807a1faSBarry Smith #include "sys.h" 748b35521SBarry Smith #include "mat.h" /*I "mat.h" I*/ 87807a1faSBarry Smith 9325ab940SBarry Smith /*@C 106469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 1102a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 1202a82ca1SLois Curfman McInnes communicator has more than one processor. 137807a1faSBarry Smith 147807a1faSBarry Smith Input Parameters: 15e0b365e2SLois Curfman McInnes . m - number of global rows 16e0b365e2SLois Curfman McInnes . n - number of global columns 176b5873e3SBarry Smith . comm - MPI communicator 187807a1faSBarry Smith 197807a1faSBarry Smith Output Parameter: 20df998da4SLois Curfman McInnes . V - location to stash resulting matrix 21e0b365e2SLois Curfman McInnes 22e0b365e2SLois Curfman McInnes Options Database Keywords: 23*2a9f886eSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ 24*2a9f886eSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ 25*2a9f886eSLois Curfman McInnes $ -mat_aij : AIJ type, (Seq or MPI depending on comm) 26fafbff53SBarry Smith $ -mat_dense : dense type, uses MatCreateSeqDense() 27fafbff53SBarry Smith $ -mat_row : row type, uses MatCreateSeqRow() 285f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 295f52d6abSBarry Smith $ -mat_mpirowbs : rowbs type. 30e0b365e2SLois Curfman McInnes $ uses MatCreateMPIRowbs() 3127b4b7ebSLois Curfman McInnes $ -mat_bdiag : block diagonal type, uses 32fafbff53SBarry Smith $ MatCreateSeqBDiag() 335f52d6abSBarry Smith $ -mat_mpibdiag : MatCreateMPIBDiag() 34e0b365e2SLois Curfman McInnes 35e0b365e2SLois Curfman McInnes Notes: 36fafbff53SBarry Smith The default matrix type is AIJ, using MatCreateSeqAIJ() and 37e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 38e0b365e2SLois Curfman McInnes 39e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 40e0b365e2SLois Curfman McInnes 41fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 42fafbff53SBarry Smith MatCreateSeqRow(), MatCreateMPIRow(), 43fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 44fafbff53SBarry Smith MatCreateSeqDense(), MatCreateMPIRowbs(), MatConvert() 457807a1faSBarry Smith @*/ 466469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 477807a1faSBarry Smith { 48d6dfbf8fSBarry Smith int numtid; 496b5873e3SBarry Smith MPI_Comm_size(comm,&numtid); 507f813858SBarry Smith if (OptionsHasName(0,"-help")) { 510de55854SLois Curfman McInnes MPIU_printf(comm,"MatCreate() options: -mat_dense, -mat_aij, -mat_mpiaij, -mat_row\n"); 520de55854SLois Curfman McInnes MPIU_printf(comm," -mat_mpirow, -mat_mpirowbs, -mat_bdiag, -mat_mpibdiag\n"); 537f813858SBarry Smith } 54df60cc22SBarry Smith if (OptionsHasName(0,"-mat_dense")) { 55fafbff53SBarry Smith return MatCreateSeqDense(comm,m,n,V); 567807a1faSBarry Smith } 575f52d6abSBarry Smith if (OptionsHasName(0,"-mat_bdiag") || OptionsHasName(0,"-mat_mpibdiag")) { 580de55854SLois Curfman McInnes int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0, ierr; 59f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 60f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 61f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 62f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 63f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 64f59b1570SLois Curfman McInnes } 65e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 66e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 670de55854SLois Curfman McInnes if (ndiag) { 6878b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 69e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 70e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 710de55854SLois Curfman McInnes if (ndiag2 != ndiag) 72bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 730de55854SLois Curfman McInnes } else if (OptionsHasName(0,"-mat_bdiag_dvals")) 740de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 750de55854SLois Curfman McInnes if (OptionsHasName(0,"-mpi_mpibdiag") || numtid>1) { 760de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 770de55854SLois Curfman McInnes } else { 78fafbff53SBarry Smith ierr = MatCreateSeqBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 79e452cd2fSLois Curfman McInnes } 8078b31e54SBarry Smith if (d) PETSCFREE(d); 81e452cd2fSLois Curfman McInnes return ierr; 82e452cd2fSLois Curfman McInnes } 835f52d6abSBarry Smith if (OptionsHasName(0,"-mat_mpirowbs")) { 849b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 859b779142SLois Curfman McInnes } 860de55854SLois Curfman McInnes if (OptionsHasName(0,"-mat_mpirow") || (OptionsHasName(0,"-mat_row") && numtid >1)) { 876b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 88df998da4SLois Curfman McInnes } 89df60cc22SBarry Smith if (OptionsHasName(0,"-mat_row")) { 90fafbff53SBarry Smith return MatCreateSeqRow(comm,m,n,10,0,V); 913dfeaf31SLois Curfman McInnes } 920de55854SLois Curfman McInnes if (OptionsHasName(0,"-mat_mpiaij") || (numtid >1)) { /* Default parallel format */ 935f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 945f52d6abSBarry Smith } 95fafbff53SBarry Smith return MatCreateSeqAIJ(comm,m,n,10,0,V); /* default uniprocessor format */ 967807a1faSBarry Smith } 977807a1faSBarry Smith 98dae03382SLois Curfman McInnes #include "matimpl.h" 99dae03382SLois Curfman McInnes /*@C 100dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 101dae03382SLois Curfman McInnes 102dae03382SLois Curfman McInnes Input Parameter: 103dae03382SLois Curfman McInnes . mat - the matrix 104dae03382SLois Curfman McInnes 105dae03382SLois Curfman McInnes Output Parameter: 106dae03382SLois Curfman McInnes . name - name of matrix type 107dae03382SLois Curfman McInnes 108dae03382SLois Curfman McInnes .keywords: matrix, get, name 109dae03382SLois Curfman McInnes 110dae03382SLois Curfman McInnes .seealso: MatGetType() 111dae03382SLois Curfman McInnes @*/ 112dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 113dae03382SLois Curfman McInnes { 114dae03382SLois Curfman McInnes /* Note: Be sure that this list corresponds to the enum in mat.h */ 115dae03382SLois Curfman McInnes int itype = (int)mat->type; 116dae03382SLois Curfman McInnes char *matname[9]; 117ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 118ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 119dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 120dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 121ec8511deSBarry Smith matname[4] = "MATSEQROW"; 122dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 123ec8511deSBarry Smith matname[6] = "MATMPIROWBS"; 124ec8511deSBarry Smith matname[7] = "MATSEQBDIAG"; 1254c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 126dae03382SLois Curfman McInnes if (itype < 0 || itype > 8) *name = "unknown matrix type"; 127dae03382SLois Curfman McInnes else *name = matname[itype]; 128dae03382SLois Curfman McInnes return 0; 129dae03382SLois Curfman McInnes } 130dae03382SLois Curfman McInnes 131