15baf8537SBarry Smith 2cb512458SBarry Smith #ifndef lint 3*90f02eecSBarry Smith static char vcid[] = "$Id: gcreate.c,v 1.98 1996/09/28 16:06:05 curfman Exp bsmith $"; 4cb512458SBarry Smith #endif 57807a1faSBarry Smith 67807a1faSBarry Smith #include "sys.h" 748b35521SBarry Smith #include "mat.h" /*I "mat.h" I*/ 87807a1faSBarry Smith 9e3726954SLois Curfman McInnes /*@C 1077c4ece6SBarry Smith MatGetTypeFromOptions - Determines from the options database what matrix 118c645567SLois Curfman McInnes format the user has specified. 12416022c9SBarry Smith 13932b0c3eSLois Curfman McInnes Input Parameter: 14932b0c3eSLois Curfman McInnes . comm - the MPI communicator 1539ddd567SLois Curfman McInnes . type - the type of matrix desired, for example MATSEQAIJ, MATMPIAIJ 16e3726954SLois Curfman McInnes . pre - optional string to prepend to the name 17416022c9SBarry Smith 18416022c9SBarry Smith Output Parameters: 19932b0c3eSLois Curfman McInnes . set - flag indicating whether user set matrix type option. 20416022c9SBarry Smith 2126b119abSLois Curfman McInnes Basic Options Database Keys: 2226b119abSLois Curfman McInnes These options return MATSEQxxx or MATMPIxxx, 2326b119abSLois Curfman McInnes depending on the communicator, comm. 2426b119abSLois Curfman McInnes $ -mat_aij : AIJ type 2526b119abSLois Curfman McInnes $ -mat_baij : block AIJ type 2626b119abSLois Curfman McInnes $ -mat_dense : dense type 2726b119abSLois Curfman McInnes $ -mat_bdiag : block diagonal type 2826b119abSLois Curfman McInnes 2926b119abSLois Curfman McInnes More Options Database Keys: 3026b119abSLois Curfman McInnes $ -mat_seqaij : MATSEQAIJ 3126b119abSLois Curfman McInnes $ -mat_mpiaij : MATMPIAIJ 3226b119abSLois Curfman McInnes $ -mat_seqbaij : MATSEQBAIJ 3326b119abSLois Curfman McInnes $ -mat_mpibaij : MATMPIBAIJ 3426b119abSLois Curfman McInnes $ -mat_seqbdiag : MATSEQBDAIG 3526b119abSLois Curfman McInnes $ -mat_mpibdiag : MATMPIBDIAG 3626b119abSLois Curfman McInnes $ -mat_mpirowbs : MATMPIROWBS 3726b119abSLois Curfman McInnes $ -mat_seqdense : MATSEQDENSE 3826b119abSLois Curfman McInnes $ -mat_mpidense : MATMPIDENSE 3926b119abSLois Curfman McInnes 408c645567SLois Curfman McInnes Note: 4126b119abSLois Curfman McInnes This routine is automatically called within MatCreate() and MatLoad(). 428c645567SLois Curfman McInnes 4339ddd567SLois Curfman McInnes .keywords: matrix, get, format, from, options 4439ddd567SLois Curfman McInnes 4526b119abSLois Curfman McInnes .seealso: MatCreate(), MatLoad() 46416022c9SBarry Smith @*/ 47e3726954SLois Curfman McInnes 4877c4ece6SBarry Smith int MatGetTypeFromOptions(MPI_Comm comm,char *pre,MatType *type,int *set) 49dbb450caSBarry Smith { 5090fe702eSLois Curfman McInnes int size,flg1,flg2,flg3,flg4,flg5,flg8,flg9,flg10,flg12,flg13,ierr,flg11,flg14,flg15; 516daaf66cSBarry Smith char p[64]; 52d5d45c9bSBarry Smith 53*90f02eecSBarry Smith PetscValidIntPointer(type); PetscValidIntPointer(set); 54*90f02eecSBarry Smith 556daaf66cSBarry Smith PetscStrcpy(p,"-"); 566daaf66cSBarry Smith if (pre) PetscStrcat(p,pre); 576daaf66cSBarry Smith 5817699dbbSLois Curfman McInnes MPI_Comm_size(comm,&size); 5925cdf11fSBarry Smith ierr = OptionsHasName(PETSC_NULL,"-help",&flg1); CHKERRQ(ierr); 6025cdf11fSBarry Smith if (flg1) { 6177c4ece6SBarry Smith PetscPrintf(comm,"Matrix format options:\n"); 6277c4ece6SBarry Smith PetscPrintf(comm," %smat_aij, %smat_seqaij, %smat_mpiaij\n",p,p,p); 6390fe702eSLois Curfman McInnes PetscPrintf(comm," %smat_baij, %smat_seqbaij, %smat_mpibaij\n",p,p,p); 6477c4ece6SBarry Smith PetscPrintf(comm," %smat_dense, %smat_seqdense, %smat_mpidense\n",p,p,p); 6577c4ece6SBarry Smith PetscPrintf(comm," %smat_mpirowbs, %smat_bdiag, %smat_seqbdiag, %smat_mpibdiag\n",p,p,p,p); 66dbb450caSBarry Smith } 6725cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqdense",&flg1); CHKERRQ(ierr); 6825cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpidense",&flg2); CHKERRQ(ierr); 6925cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqbdiag",&flg3); CHKERRQ(ierr); 7025cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpibdiag",&flg4); CHKERRQ(ierr); 7125cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpirowbs",&flg5); CHKERRQ(ierr); 7235aab85fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqbaij",&flg11); CHKERRQ(ierr); 73d218f8d9SSatish Balay ierr = OptionsHasName(pre,"-mat_mpibaij",&flg14); CHKERRQ(ierr); 7425cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_mpiaij",&flg8); CHKERRQ(ierr); 7525cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_seqaij",&flg9); CHKERRQ(ierr); 7625cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_aij",&flg10); CHKERRQ(ierr); 7725cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_bdiag",&flg12); CHKERRQ(ierr); 7825cdf11fSBarry Smith ierr = OptionsHasName(pre,"-mat_dense",&flg13); CHKERRQ(ierr); 7990fe702eSLois Curfman McInnes ierr = OptionsHasName(pre,"-mat_baij",&flg15); CHKERRQ(ierr); 8025cdf11fSBarry Smith if (flg1) { 81dbb450caSBarry Smith *type = MATSEQDENSE; 82dbb450caSBarry Smith *set = 1; 83dbb450caSBarry Smith } 8425cdf11fSBarry Smith else if (flg2) { 8539ddd567SLois Curfman McInnes *type = MATMPIDENSE; 8639ddd567SLois Curfman McInnes *set = 1; 8739ddd567SLois Curfman McInnes } 8825cdf11fSBarry Smith else if (flg3) { 89dbb450caSBarry Smith *type = MATSEQBDIAG; 90dbb450caSBarry Smith *set = 1; 91dbb450caSBarry Smith } 9225cdf11fSBarry Smith else if (flg4) { 93dbb450caSBarry Smith *type = MATMPIBDIAG; 94dbb450caSBarry Smith *set = 1; 95dbb450caSBarry Smith } 9625cdf11fSBarry Smith else if (flg5) { 97dbb450caSBarry Smith *type = MATMPIROWBS; 98dbb450caSBarry Smith *set = 1; 99dbb450caSBarry Smith } 10025cdf11fSBarry Smith else if (flg8) { 101dbb450caSBarry Smith *type = MATMPIAIJ; 102dbb450caSBarry Smith *set = 1; 103dbb450caSBarry Smith } 10425cdf11fSBarry Smith else if (flg9){ 105dbb450caSBarry Smith *type = MATSEQAIJ; 106dbb450caSBarry Smith *set = 1; 107dbb450caSBarry Smith } 10825cdf11fSBarry Smith else if (flg10) { 10917699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 110dbb450caSBarry Smith else *type = MATMPIAIJ; 111dbb450caSBarry Smith *set = 1; 112dbb450caSBarry Smith } 11335aab85fSBarry Smith else if (flg11) { 11435aab85fSBarry Smith *type = MATSEQBAIJ; 11535aab85fSBarry Smith *set = 1; 11635aab85fSBarry Smith } 11725cdf11fSBarry Smith else if (flg12) { 11817699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQBDIAG; 119dbb450caSBarry Smith else *type = MATMPIBDIAG; 120dbb450caSBarry Smith *set = 1; 121dbb450caSBarry Smith } 12225cdf11fSBarry Smith else if (flg13) { 12339ddd567SLois Curfman McInnes if (size == 1) *type = MATSEQDENSE; 12439ddd567SLois Curfman McInnes else *type = MATMPIDENSE; 12539ddd567SLois Curfman McInnes *set = 1; 12639ddd567SLois Curfman McInnes } 127d218f8d9SSatish Balay else if (flg14) { 12890fe702eSLois Curfman McInnes *type = MATMPIBAIJ; 12990fe702eSLois Curfman McInnes *set = 1; 13090fe702eSLois Curfman McInnes } 13190fe702eSLois Curfman McInnes else if (flg15) { 132d218f8d9SSatish Balay if (size == 1) *type = MATSEQBAIJ; 1332eadb931SSatish Balay else *type = MATMPIBAIJ; 134d218f8d9SSatish Balay *set = 1; 135d218f8d9SSatish Balay } 136dbb450caSBarry Smith else { 13717699dbbSLois Curfman McInnes if (size == 1) *type = MATSEQAIJ; 138dbb450caSBarry Smith else *type = MATMPIAIJ; 139dbb450caSBarry Smith *set = 0; 140dbb450caSBarry Smith } 141dbb450caSBarry Smith return 0; 142dbb450caSBarry Smith } 143dbb450caSBarry Smith 144325ab940SBarry Smith /*@C 14569dd0797SLois Curfman McInnes MatCreate - Creates a matrix where the type is determined 14602a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 14783e1b59cSLois Curfman McInnes communicator has more than one processor. The default matrix type is 14883e1b59cSLois Curfman McInnes AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ(). 14983e1b59cSLois Curfman McInnes 1507807a1faSBarry Smith Input Parameters: 151e0b365e2SLois Curfman McInnes . m - number of global rows 152e0b365e2SLois Curfman McInnes . n - number of global columns 1536b5873e3SBarry Smith . comm - MPI communicator 1547807a1faSBarry Smith 1557807a1faSBarry Smith Output Parameter: 156dc401e71SLois Curfman McInnes . A - the matrix 157e0b365e2SLois Curfman McInnes 158dc401e71SLois Curfman McInnes Basic Options Database Keys: 159dc401e71SLois Curfman McInnes These options use MatCreateSeqXXX or MatCreateMPIXXX, 160dc401e71SLois Curfman McInnes depending on the communicator, comm. 161dc401e71SLois Curfman McInnes $ -mat_aij : AIJ type 16283e1b59cSLois Curfman McInnes $ -mat_baij : block AIJ type 163dc401e71SLois Curfman McInnes $ -mat_dense : dense type 164dc401e71SLois Curfman McInnes $ -mat_bdiag : block diagonal type 165dc401e71SLois Curfman McInnes 166dc401e71SLois Curfman McInnes More Options Database Keys: 16783e1b59cSLois Curfman McInnes $ -mat_seqaij : AIJ type, uses MatCreateSeqAIJ() 16883e1b59cSLois Curfman McInnes $ -mat_mpiaij : AIJ type, uses MatCreateMPIAIJ() 169dbb450caSBarry Smith $ -mat_seqbdiag : block diagonal type, uses 170fafbff53SBarry Smith $ MatCreateSeqBDiag() 1717641ccfcSLois Curfman McInnes $ -mat_mpibdiag : block diagonal type, uses 1727641ccfcSLois Curfman McInnes $ MatCreateMPIBDiag() 1737641ccfcSLois Curfman McInnes $ -mat_mpirowbs : rowbs type, uses MatCreateMPIRowbs() 17458a0a7b1SLois Curfman McInnes $ -mat_seqdense : dense type, uses MatCreateSeqDense() 17539ddd567SLois Curfman McInnes $ -mat_mpidense : dense type, uses MatCreateMPIDense() 176dc401e71SLois Curfman McInnes $ -mat_seqbaij : block AIJ type, uses MatCreateSeqBAIJ() 17783e1b59cSLois Curfman McInnes $ -mat_mpibaij : block AIJ type, uses MatCreateMPIBAIJ() 178e0b365e2SLois Curfman McInnes 17983e1b59cSLois Curfman McInnes Even More Options Database Keys: 18083e1b59cSLois Curfman McInnes See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 18183e1b59cSLois Curfman McInnes for additional format-specific options. 182e0b365e2SLois Curfman McInnes 183bd9ce289SLois Curfman McInnes Notes: 184bd9ce289SLois Curfman McInnes This routine calls MatGetTypeFromOptions() to determind the matrix type. 185bd9ce289SLois Curfman McInnes 186dc401e71SLois Curfman McInnes .keywords: matrix, create 187e0b365e2SLois Curfman McInnes 188fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 189fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 19039ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 191ce4fbee9SSatish Balay MatCreateMPIRowbs(), MatCreateSeqBAIJ, 192ce4fbee9SSatish Balay MatConvert(), MatGetTypeFromOptions() 1937807a1faSBarry Smith @*/ 19487bddb72SLois Curfman McInnes int MatCreate(MPI_Comm comm,int m,int n,Mat *A) 1957807a1faSBarry Smith { 196dbb450caSBarry Smith MatType type; 197df7baab8SSatish Balay int set, ierr, bs=1, flg; 198dbb450caSBarry Smith 19977c4ece6SBarry Smith ierr = MatGetTypeFromOptions(comm,0,&type,&set); CHKERRQ(ierr); 200dfa27b74SSatish Balay switch (type) { 201dfa27b74SSatish Balay case MATSEQDENSE: 20287bddb72SLois Curfman McInnes ierr = MatCreateSeqDense(comm,m,n,PETSC_NULL,A); CHKERRQ(ierr); 203dfa27b74SSatish Balay break; 204dfa27b74SSatish Balay case MATMPIBDIAG: 205ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIBDiag(comm,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_DEFAULT, 20687bddb72SLois Curfman McInnes PETSC_NULL,PETSC_NULL,A); CHKERRQ(ierr); 207dfa27b74SSatish Balay break; 208dfa27b74SSatish Balay case MATSEQBDIAG: 209ed1f4bc7SLois Curfman McInnes ierr = MatCreateSeqBDiag(comm,m,n,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_NULL, 21087bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 211dfa27b74SSatish Balay break; 212dfa27b74SSatish Balay case MATMPIROWBS: 213ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIRowbs(comm,PETSC_DECIDE,m,PETSC_DEFAULT,PETSC_NULL, 21487bddb72SLois Curfman McInnes PETSC_NULL,A); CHKERRQ(ierr); 215dfa27b74SSatish Balay break; 216dfa27b74SSatish Balay case MATMPIDENSE: 21787bddb72SLois Curfman McInnes ierr = MatCreateMPIDense(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL,A); CHKERRQ(ierr); 218dfa27b74SSatish Balay break; 219dfa27b74SSatish Balay case MATMPIAIJ: 220ed1f4bc7SLois Curfman McInnes ierr = MatCreateMPIAIJ(comm,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT, 22187bddb72SLois Curfman McInnes PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 222dfa27b74SSatish Balay break; 223dfa27b74SSatish Balay case MATSEQBAIJ: 224cd0e1443SSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 22587bddb72SLois Curfman McInnes ierr = MatCreateSeqBAIJ(comm,bs,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 226ed1f4bc7SLois Curfman McInnes break; 2278130634dSSatish Balay case MATMPIBAIJ: 2288130634dSSatish Balay ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg); CHKERRQ(ierr); 229bf39df47SSatish Balay ierr = MatCreateMPIBAIJ(comm,bs,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_DEFAULT,PETSC_NULL,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 2308130634dSSatish Balay break; 23124b2b559SSatish Balay default: 23287bddb72SLois Curfman McInnes ierr = MatCreateSeqAIJ(comm,m,n,PETSC_DEFAULT,PETSC_NULL,A); CHKERRQ(ierr); 23324b2b559SSatish Balay break; 234dfa27b74SSatish Balay } 23564761f52SSatish Balay return 0; 2367807a1faSBarry Smith } 2377807a1faSBarry Smith 23870f55243SBarry Smith #include "src/mat/matimpl.h" 239dae03382SLois Curfman McInnes /*@C 2404b0e389bSBarry Smith MatGetType - Gets the matrix type and name (as a string) from the matrix. 241dae03382SLois Curfman McInnes 242dae03382SLois Curfman McInnes Input Parameter: 243dae03382SLois Curfman McInnes . mat - the matrix 244dae03382SLois Curfman McInnes 245dae03382SLois Curfman McInnes Output Parameter: 2469a28b0a6SLois Curfman McInnes . type - the matrix type (or use PETSC_NULL) 2479a28b0a6SLois Curfman McInnes . name - name of matrix type (or use PETSC_NULL) 248dae03382SLois Curfman McInnes 2495f44292fSLois Curfman McInnes .keywords: matrix, get, type, name 250dae03382SLois Curfman McInnes @*/ 2514b0e389bSBarry Smith int MatGetType(Mat mat,MatType *type,char **name) 252dae03382SLois Curfman McInnes { 253dae03382SLois Curfman McInnes int itype = (int)mat->type; 25439ddd567SLois Curfman McInnes char *matname[10]; 255d5d45c9bSBarry Smith 256*90f02eecSBarry Smith PetscValidHeaderSpecific(mat,MAT_COOKIE); 257*90f02eecSBarry Smith 2584b0e389bSBarry Smith if (type) *type = (MatType) mat->type; 2594b0e389bSBarry Smith if (name) { 260416022c9SBarry Smith /* Note: Be sure that this list corresponds to the enum in mat.h */ 261ec8511deSBarry Smith matname[0] = "MATSEQDENSE"; 262ec8511deSBarry Smith matname[1] = "MATSEQAIJ"; 263dae03382SLois Curfman McInnes matname[2] = "MATMPIAIJ"; 264dae03382SLois Curfman McInnes matname[3] = "MATSHELL"; 265c456f294SBarry Smith matname[4] = "MATMPIROWBS"; 266c456f294SBarry Smith matname[5] = "MATSEQBDIAG"; 267c456f294SBarry Smith matname[6] = "MATMPIBDIAG"; 268c456f294SBarry Smith matname[7] = "MATMPIDENSE"; 269da045f9dSSatish Balay matname[8] = "MATSEQBAIJ"; 27032e66d44SSatish Balay matname[9] = "MATMPIBAIJ"; 271da045f9dSSatish Balay 27232e66d44SSatish Balay if (itype < 0 || itype > 9) *name = "Unknown matrix type"; 273dae03382SLois Curfman McInnes else *name = matname[itype]; 2744b0e389bSBarry Smith } 275dae03382SLois Curfman McInnes return 0; 276dae03382SLois Curfman McInnes } 277dae03382SLois Curfman McInnes 278d5d45c9bSBarry Smith 279d5d45c9bSBarry Smith 280