148b35521SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*0de55854SLois Curfman McInnes static char vcid[] = "$Id: gcreate.c,v 1.38 1995/09/07 22:36:56 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() 245f52d6abSBarry Smith $ -mat_mpiaij : MatCreateMPIAIJ() 2527b4b7ebSLois Curfman McInnes $ -mat_dense : dense type, uses MatCreateSequentialDense() 2627b4b7ebSLois Curfman McInnes $ -mat_row : row type, uses MatCreateSequentialRow() 275f52d6abSBarry Smith $ -mat_mpirow : MatCreateMPIRow() 285f52d6abSBarry Smith $ -mat_mpirowbs : rowbs type. 29e0b365e2SLois Curfman McInnes $ uses MatCreateMPIRowbs() 3027b4b7ebSLois Curfman McInnes $ -mat_bdiag : block diagonal type, uses 315f52d6abSBarry Smith $ MatCreateSequentialBDiag() 325f52d6abSBarry Smith $ -mat_mpibdiag : MatCreateMPIBDiag() 33e0b365e2SLois Curfman McInnes 34e0b365e2SLois Curfman McInnes Notes: 35e0b365e2SLois Curfman McInnes The default matrix type is AIJ, using MatCreateSequentialAIJ() and 36e0b365e2SLois Curfman McInnes MatCreateMPIAIJ(). 37e0b365e2SLois Curfman McInnes 38e0b365e2SLois Curfman McInnes .keywords: matrix, create, initial 39e0b365e2SLois Curfman McInnes 40e0b365e2SLois Curfman McInnes .seealso: MatCreateSequentialAIJ((), MatCreateMPIAIJ(), 41e0b365e2SLois Curfman McInnes MatCreateSequentialRow(), MatCreateMPIRow(), 420c28153cSLois Curfman McInnes MatCreateSequentialBDiag(),MatCreateMPIBDiag(), 430c28153cSLois Curfman McInnes MatCreateSequentialDense(), MatCreateMPIRowbs(), MatConvert() 447807a1faSBarry Smith @*/ 456469c4f9SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,Mat *V) 467807a1faSBarry Smith { 47d6dfbf8fSBarry Smith int numtid; 486b5873e3SBarry Smith MPI_Comm_size(comm,&numtid); 497f813858SBarry Smith if (OptionsHasName(0,"-help")) { 50*0de55854SLois Curfman McInnes MPIU_printf(comm,"MatCreate() options: -mat_dense, -mat_aij, -mat_mpiaij, -mat_row\n"); 51*0de55854SLois Curfman McInnes MPIU_printf(comm," -mat_mpirow, -mat_mpirowbs, -mat_bdiag, -mat_mpibdiag\n"); 527f813858SBarry Smith } 53df60cc22SBarry Smith if (OptionsHasName(0,"-mat_dense")) { 546b5873e3SBarry Smith return MatCreateSequentialDense(comm,m,n,V); 557807a1faSBarry Smith } 565f52d6abSBarry Smith if (OptionsHasName(0,"-mat_bdiag") || OptionsHasName(0,"-mat_mpibdiag")) { 57*0de55854SLois Curfman McInnes int nb = 1, ndiag = 0, ndiag2 = 0, *d = 0, ierr; 58f59b1570SLois Curfman McInnes if (OptionsHasName(0,"-help")) { 59f59b1570SLois Curfman McInnes MPIU_printf(comm,"Options with -mat_bdiag: -mat_bdiag_bsize block_size\n"); 60f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_ndiag number_diags \n"); 61f59b1570SLois Curfman McInnes MPIU_printf(comm," -mat_bdiag_dvals d1,d2,d3... (diagonal numbers)\n"); 62f59b1570SLois Curfman McInnes MPIU_printf(comm," (for example) -mat_bdiag_dvals -5,-1,0,1,5\n"); 63f59b1570SLois Curfman McInnes } 64e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_bsize",&nb); 65e452cd2fSLois Curfman McInnes OptionsGetInt(0,"-mat_bdiag_ndiag",&ndiag); 66*0de55854SLois Curfman McInnes if (ndiag) { 6778b31e54SBarry Smith d = (int *)PETSCMALLOC( ndiag * sizeof(int) ); CHKPTRQ(d); 68e452cd2fSLois Curfman McInnes ndiag2 = ndiag; 69e452cd2fSLois Curfman McInnes OptionsGetIntArray(0,"-mat_bdiag_dvals",d,&ndiag2); 70*0de55854SLois Curfman McInnes if (ndiag2 != ndiag) 71bbb6d6a8SBarry Smith SETERRQ(1,"MatCreate: Incompatible number of diags and diagonal vals"); 72*0de55854SLois Curfman McInnes } else if (OptionsHasName(0,"-mat_bdiag_dvals")) 73*0de55854SLois Curfman McInnes SETERRQ(1,"MatCreate: Must specify number of diagonals with -mat_bdiag_ndiag"); 74*0de55854SLois Curfman McInnes if (OptionsHasName(0,"-mpi_mpibdiag") || numtid>1) { 75*0de55854SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 76*0de55854SLois Curfman McInnes } else { 77*0de55854SLois Curfman McInnes ierr = MatCreateSequentialBDiag(comm,m,n,ndiag,nb,d,0,V); CHKERRQ(ierr); 78e452cd2fSLois Curfman McInnes } 7978b31e54SBarry Smith if (d) PETSCFREE(d); 80e452cd2fSLois Curfman McInnes return ierr; 81e452cd2fSLois Curfman McInnes } 825f52d6abSBarry Smith if (OptionsHasName(0,"-mat_mpirowbs")) { 839b779142SLois Curfman McInnes return MatCreateMPIRowbs(comm,PETSC_DECIDE,m,5,0,0,V); 849b779142SLois Curfman McInnes } 85*0de55854SLois Curfman McInnes if (OptionsHasName(0,"-mat_mpirow") || (OptionsHasName(0,"-mat_row") && numtid >1)) { 866b5873e3SBarry Smith return MatCreateMPIRow(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 87df998da4SLois Curfman McInnes } 88df60cc22SBarry Smith if (OptionsHasName(0,"-mat_row")) { 893dfeaf31SLois Curfman McInnes return MatCreateSequentialRow(comm,m,n,10,0,V); 903dfeaf31SLois Curfman McInnes } 91*0de55854SLois Curfman McInnes if (OptionsHasName(0,"-mat_mpiaij") || (numtid >1)) { /* Default parallel format */ 925f52d6abSBarry Smith return MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,5,0,0,0,V); 935f52d6abSBarry Smith } 94*0de55854SLois Curfman McInnes return MatCreateSequentialAIJ(comm,m,n,10,0,V); /* default uniprocessor format */ 957807a1faSBarry Smith } 967807a1faSBarry Smith 97dae03382SLois Curfman McInnes #include "matimpl.h" 98dae03382SLois Curfman McInnes /*@C 99dae03382SLois Curfman McInnes MatGetName - Gets the matrix type name (as a string) from the matrix. 100dae03382SLois Curfman McInnes 101dae03382SLois Curfman McInnes Input Parameter: 102dae03382SLois Curfman McInnes . mat - the matrix 103dae03382SLois Curfman McInnes 104dae03382SLois Curfman McInnes Output Parameter: 105dae03382SLois Curfman McInnes . name - name of matrix type 106dae03382SLois Curfman McInnes 107dae03382SLois Curfman McInnes .keywords: matrix, get, name 108dae03382SLois Curfman McInnes 109dae03382SLois Curfman McInnes .seealso: MatGetType() 110dae03382SLois Curfman McInnes @*/ 111dae03382SLois Curfman McInnes int MatGetName(Mat mat,char **name) 112dae03382SLois Curfman McInnes { 113dae03382SLois Curfman McInnes /* Note: Be sure that this list corresponds to the enum in mat.h */ 114dae03382SLois Curfman McInnes int itype = (int)mat->type; 115dae03382SLois Curfman McInnes char *matname[9]; 116dae03382SLois Curfman McInnes matname[0] = "MATDENSE"; 117dae03382SLois Curfman McInnes matname[1] = "MATAIJ"; 118dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 119dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 120dae03382SLois Curfman McInnes matname[4] = "MATROW"; 121dae03382SLois Curfman McInnes matname[5] = "MATMPIROW"; 122dae03382SLois Curfman McInnes matname[6] = "MATMPIROW_BS"; 1234c742c1bSLois Curfman McInnes matname[7] = "MATBDIAG"; 1244c742c1bSLois Curfman McInnes matname[8] = "MATMPIBDIAG"; 125dae03382SLois Curfman McInnes if (itype < 0 || itype > 8) *name = "unknown matrix type"; 126dae03382SLois Curfman McInnes else *name = matname[itype]; 127dae03382SLois Curfman McInnes return 0; 128dae03382SLois Curfman McInnes } 129dae03382SLois Curfman McInnes 130