148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*f59b1570SLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.36 1995/09/04 17:05:59 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: 23a8bb4b34SLois Curfman McInnes $ -mat_aij : AIJ type, uses MatCreateSequentialAIJ() 24a8bb4b34SLois Curfman McInnes $ and MatCreateMPIAIJ() 2527b4b7ebSLois Curfman McInnes $ -mat_dense : dense type, uses MatCreateSequentialDense() 2627b4b7ebSLois Curfman McInnes $ -mat_row : row type, uses MatCreateSequentialRow() 27e0b365e2SLois Curfman McInnes $ and MatCreateMPIRow() 289566a192SBarry Smith $ -mat_rowbs : rowbs type. 29e0b365e2SLois Curfman McInnes $ uses MatCreateMPIRowbs() 3027b4b7ebSLois Curfman McInnes $ -mat_bdiag : block diagonal type, uses 31e0b365e2SLois Curfman McInnes $ MatCreateSequentialBDiag() and 32e0b365e2SLois Curfman McInnes $ MatCreateMPIBDiag() 33e0b365e2SLois Curfman McInnes $ 34a8bb4b34SLois Curfman McInnes $ -mpi_objects : uses MPI matrix (parallel format), even for one processor 35e0b365e2SLois Curfman McInnes 36e0b365e2SLois Curfman McInnes Notes: 37e0b365e2SLois Curfman McInnes The default matrix type is AIJ, using MatCreateSequentialAIJ() and 38e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 39e0b365e2SLois Curfman McInnes 40e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 41e0b365e2SLois Curfman McInnes 42e0b365e2SLois Curfman McInnes .seealso: MatCreateSequentialAIJ((), MatCreateMPIAIJ(), 43e0b365e2SLois Curfman McInnes MatCreateSequentialRow(), MatCreateMPIRow(), 440c28153cSLois Curfman McInnes MatCreateSequentialBDiag(),MatCreateMPIBDiag(), 450c28153cSLois Curfman McInnes MatCreateSequentialDense(), MatCreateMPIRowbs(), MatConvert() 467807a1faSBarry Smith @*/ 476469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 487807a1faSBarry Smith { 49d6dfbf8fSBarry Smith int numtid; 506b5873e3SBarry Smith MPI_Comm_size(comm,&numtid); 517f813858SBarry Smith if (OptionsHasName(0,"-help")) { 527f813858SBarry Smith MPIU_printf(comm,"MatCreate() options: -mat_dense, -mat_row -mat_rowbs\n"); 537f813858SBarry Smith MPIU_printf(comm," -mat_bdiag, -mpi_objects\n"); 547f813858SBarry Smith } 55df60cc22SBarry Smith if (OptionsHasName(0,"-mat_dense")) { 566b5873e3SBarry Smith return MatCreateSequentialDense(comm,m,n,V); 577807a1faSBarry Smith } 58e452cd2fSLois Curfman McInnes if (OptionsHasName(0,"-mat_bdiag")) { 59e452cd2fSLois Curfman McInnes int nb = 1, ndiag = 0, ndiag2, *d, ierr; 60*f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 61*f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 62*f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 63*f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 64*f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 65*f59b1570SLois Curfman McInnes } 66e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 67e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 68bbb6d6a8SBarry Smith if (!ndiag) SETERRQ(1,"MatCreate:Must set diagonals before creating mat"); 6978b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 70e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 71e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 72e452cd2fSLois Curfman McInnes if (ndiag2 != ndiag) { 73bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate:Incompatible number of diags and diagonal vals"); 74e452cd2fSLois Curfman McInnes } 75e452cd2fSLois Curfman McInnes if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) 76e452cd2fSLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); 77e452cd2fSLois Curfman McInnes else 78e452cd2fSLois Curfman McInnes ierr = MatCreateSequentialBDiag(comm,m,n,ndiag,nb,d,0,V); 7978b31e54SBarry Smith CHKERRQ(ierr); 8078b31e54SBarry Smith if (d) PETSCFREE(d); 81e452cd2fSLois Curfman McInnes return ierr; 82e452cd2fSLois Curfman McInnes } 839b779142SLois Curfman McInnes #if defined(HAVE_BLOCKSOLVE) && !defined(__cplusplus) 849b779142SLois Curfman McInnes if (OptionsHasName(0,"-mat_rowbs")) { 859b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 869b779142SLois Curfman McInnes } 879b779142SLois Curfman McInnes #endif 88df60cc22SBarry Smith if (numtid > 1 || OptionsHasName(0,"-mpi_objects")) { 89df60cc22SBarry Smith if (OptionsHasName(0,"-mat_row")) { 906b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 91df998da4SLois Curfman McInnes } 920b5753b4SLois Curfman McInnes return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 930b5753b4SLois Curfman McInnes } 94df60cc22SBarry Smith if (OptionsHasName(0,"-mat_row")) { 953dfeaf31SLois Curfman McInnes return MatCreateSequentialRow(comm,m,n,10,0,V); 963dfeaf31SLois Curfman McInnes } 976b5873e3SBarry Smith return MatCreateSequentialAIJ(comm,m,n,10,0,V); 987807a1faSBarry Smith } 997807a1faSBarry Smith 100dae03382SLois Curfman McInnes #include "matimpl.h" 101dae03382SLois Curfman McInnes /*@C 102dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 103dae03382SLois Curfman McInnes 104dae03382SLois Curfman McInnes Input Parameter: 105dae03382SLois Curfman McInnes . mat - the matrix 106dae03382SLois Curfman McInnes 107dae03382SLois Curfman McInnes Output Parameter: 108dae03382SLois Curfman McInnes . name - name of matrix type 109dae03382SLois Curfman McInnes 110dae03382SLois Curfman McInnes .keywords: matrix, get, name 111dae03382SLois Curfman McInnes 112dae03382SLois Curfman McInnes .seealso: MatGetType() 113dae03382SLois Curfman McInnes @*/ 114dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 115dae03382SLois Curfman McInnes { 116dae03382SLois Curfman McInnes /* Note: Be sure that this list corresponds to the enum in mat.h */ 117dae03382SLois Curfman McInnes int itype = (int)mat->type; 118dae03382SLois Curfman McInnes char *matname[9]; 119dae03382SLois Curfman McInnes matname[0] = "MATDENSE"; 120dae03382SLois Curfman McInnes matname[1] = "MATAIJ"; 121dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 122dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 123dae03382SLois Curfman McInnes matname[4] = "MATROW"; 124dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 125dae03382SLois Curfman McInnes matname[6] = "MATMPIROW_BS"; 1264c742c1bSLois Curfman McInnes matname[7] = "MATBDIAG"; 1274c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 128dae03382SLois Curfman McInnes if (itype < 0 || itype > 8) *name = "unknown matrix type"; 129dae03382SLois Curfman McInnes else *name = matname[itype]; 130dae03382SLois Curfman McInnes return 0; 131dae03382SLois Curfman McInnes } 132dae03382SLois Curfman McInnes 133