1cb512458SBarry Smith #ifndef lint 2*8d4e7251SLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.20 1995/05/10 00:23:55 bsmith Exp curfman $"; 3cb512458SBarry Smith #endif 47807a1faSBarry Smith 57807a1faSBarry Smith #include "sys.h" 67807a1faSBarry Smith #include "options.h" 77807a1faSBarry Smith #include "sysio.h" 87807a1faSBarry Smith #include "mat.h" 97807a1faSBarry Smith 107807a1faSBarry Smith /*@C 116469c4f9SBarry Smith MatCreate - Creates a matrix, where the type is determined 1202a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 1302a82ca1SLois Curfman McInnes communicator has more than one processor. 147807a1faSBarry Smith 157807a1faSBarry Smith Input Parameters: 16e0b365e2SLois Curfman McInnes . m - number of global rows 17e0b365e2SLois Curfman McInnes . n - number of global columns 186b5873e3SBarry Smith . comm - MPI communicator 197807a1faSBarry Smith 207807a1faSBarry Smith Output Parameter: 21df998da4SLois Curfman McInnes . V - location to stash resulting matrix 22e0b365e2SLois Curfman McInnes 23e0b365e2SLois Curfman McInnes Options Database Keywords: 2427b4b7ebSLois Curfman McInnes $ -mat_dense : dense type, uses MatCreateSequentialDense() 2527b4b7ebSLois Curfman McInnes $ -mat_row : row type, uses MatCreateSequentialRow() 26e0b365e2SLois Curfman McInnes $ and MatCreateMPIRow() 2727b4b7ebSLois Curfman McInnes $ -mat_rowbs : rowbs type (for parallel symmetric matrices), 28e0b365e2SLois Curfman McInnes $ uses MatCreateMPIRowbs() 2927b4b7ebSLois Curfman McInnes $ -mat_bdiag : block diagonal type, uses 30e0b365e2SLois Curfman McInnes $ MatCreateSequentialBDiag() and 31e0b365e2SLois Curfman McInnes $ MatCreateMPIBDiag() 32e0b365e2SLois Curfman McInnes $ 3302a82ca1SLois Curfman McInnes $ -mpi_objects : uses MPI matrix, even for one processor 34e0b365e2SLois Curfman McInnes 35e0b365e2SLois Curfman McInnes Notes: 36e0b365e2SLois Curfman McInnes The default matrix type is AIJ, using MatCreateSequentialAIJ() and 37e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 38e0b365e2SLois Curfman McInnes 39e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 40e0b365e2SLois Curfman McInnes 41e0b365e2SLois Curfman McInnes .seealso: MatCreateSequentialAIJ((), MatCreateMPIAIJ(), 42e0b365e2SLois Curfman McInnes MatCreateSequentialRow(), MatCreateMPIRow(), 430c28153cSLois Curfman McInnes MatCreateSequentialBDiag(),MatCreateMPIBDiag(), 440c28153cSLois Curfman McInnes MatCreateSequentialDense(), 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); 5027b4b7ebSLois Curfman McInnes if (OptionsHasName(0,0,"-mat_dense")) { 516b5873e3SBarry Smith return MatCreateSequentialDense(comm,m,n,V); 527807a1faSBarry Smith } 53a5a9c739SBarry Smith if (numtid > 1 || OptionsHasName(0,0,"-mpi_objects")) { 5427b4b7ebSLois Curfman McInnes if (OptionsHasName(0,0,"-mat_row")) { 556b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 56df998da4SLois Curfman McInnes } 57*8d4e7251SLois Curfman McInnes #if defined(HAVE_BLOCKSOLVE) && !defined(__cplusplus) 5827b4b7ebSLois Curfman McInnes if (OptionsHasName(0,0,"-mat_rowbs")) { 596b5873e3SBarry Smith return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 607c636fe7SLois Curfman McInnes } 615f05bc04SLois Curfman McInnes #endif 626b5873e3SBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 63d6dfbf8fSBarry Smith } 6427b4b7ebSLois Curfman McInnes if (OptionsHasName(0,0,"-mat_row")) { 653dfeaf31SLois Curfman McInnes return MatCreateSequentialRow(comm,m,n,10,0,V); 663dfeaf31SLois Curfman McInnes } 67f3ba505bSLois Curfman McInnes if (OptionsHasName(0,0,"-mat_bdiag")) { 68160018dcSBarry Smith int nb = 1, ndiag = 0, ndiag2, *d, ierr; 69f3ba505bSLois Curfman McInnes OptionsGetInt(0,0,"-mat_bdiag_bsize",&nb); 70f3ba505bSLois Curfman McInnes OptionsGetInt(0,0,"-mat_bdiag_ndiag",&ndiag); 71f3ba505bSLois Curfman McInnes if (ndiag) { 72f3ba505bSLois Curfman McInnes d = (int *)MALLOC( ndiag * sizeof(int) ); CHKPTR(d); 73f3ba505bSLois Curfman McInnes ndiag2 = ndiag; 74f3ba505bSLois Curfman McInnes OptionsGetIntArray(0,0,"-mat_bdiag_dvals",d,&ndiag2); 75160018dcSBarry Smith if (ndiag2 != ndiag) { 76f3ba505bSLois Curfman McInnes SETERR(1,"Incompatible number of diagonals and diagonal values."); 77160018dcSBarry Smith } 78160018dcSBarry Smith } 79160018dcSBarry Smith else SETERR(1,"Must set diagonals before creating matrix."); 80f3ba505bSLois Curfman McInnes ierr = MatCreateSequentialBDiag(comm,m,n,ndiag,nb,d,0,V); 81f3ba505bSLois Curfman McInnes if (d) FREE(d); 82f3ba505bSLois Curfman McInnes return ierr; 83f3ba505bSLois Curfman McInnes } 846b5873e3SBarry Smith return MatCreateSequentialAIJ(comm,m,n,10,0,V); 857807a1faSBarry Smith } 867807a1faSBarry Smith 87