1*273d9f13SBarry Smith /*$Id: gcreate.c,v 1.123 2000/09/25 19:57:36 curfman Exp bsmith $*/ 27807a1faSBarry Smith 3e090d566SSatish Balay #include "petscsys.h" 4*273d9f13SBarry Smith #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 57807a1faSBarry Smith 65615d1e5SSatish Balay #undef __FUNC__ 7b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatCreate" 8325ab940SBarry Smith /*@C 969dd0797SLois Curfman McInnes MatCreate - Creates a matrix where the type is determined 1002a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 1183e1b59cSLois Curfman McInnes communicator has more than one processor. The default matrix type is 1283e1b59cSLois Curfman McInnes AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ(). 1383e1b59cSLois Curfman McInnes 14cb13003dSBarry Smith Collective on MPI_Comm 15cb13003dSBarry Smith 167807a1faSBarry Smith Input Parameters: 1782b900a8SBarry Smith + m - number of local rows (or PETSC_DECIDE) 1882b900a8SBarry Smith . n - number of local columns (or PETSC_DECIDE) 1982b900a8SBarry Smith . M - number of global rows (or PETSC_DETERMINE) 2082b900a8SBarry Smith . N - number of global columns (or PETSC_DETERMINE) 21cb13003dSBarry Smith - comm - MPI communicator 227807a1faSBarry Smith 237807a1faSBarry Smith Output Parameter: 24dc401e71SLois Curfman McInnes . A - the matrix 25e0b365e2SLois Curfman McInnes 26*273d9f13SBarry Smith Options Database Keys: 27*273d9f13SBarry Smith + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 28*273d9f13SBarry Smith . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 29*273d9f13SBarry Smith . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 30*273d9f13SBarry Smith . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 31*273d9f13SBarry Smith . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 32*273d9f13SBarry Smith . -mat_type seqdense - dense type, uses MatCreateSeqDense() 33*273d9f13SBarry Smith . -mat_type mpidense - dense type, uses MatCreateMPIDense() 34*273d9f13SBarry Smith . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 35*273d9f13SBarry Smith - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 36e0b365e2SLois Curfman McInnes 3783e1b59cSLois Curfman McInnes Even More Options Database Keys: 3883e1b59cSLois Curfman McInnes See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 3983e1b59cSLois Curfman McInnes for additional format-specific options. 40e0b365e2SLois Curfman McInnes 41bd9ce289SLois Curfman McInnes Notes: 42ec6e0d80SSatish Balay If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the 43ec6e0d80SSatish Balay user must ensure that they are chosen to be compatible with the 44ec6e0d80SSatish Balay vectors. To do this, one first considers the matrix-vector product 45ec6e0d80SSatish Balay 'y = A x'. The 'm' that is used in the above routine must match the 46ec6e0d80SSatish Balay local size used in the vector creation routine VecCreateMPI() for 'y'. 47ec6e0d80SSatish Balay Likewise, the 'n' used must match that used as the local size in 48ec6e0d80SSatish Balay VecCreateMPI() for 'x'. 49ec6e0d80SSatish Balay 50*273d9f13SBarry Smith Level: beginner 51*273d9f13SBarry Smith 52*273d9f13SBarry Smith .keywords: matrix, create 53*273d9f13SBarry Smith 54*273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 55*273d9f13SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 56*273d9f13SBarry Smith MatCreateSeqDense(), MatCreateMPIDense(), 57*273d9f13SBarry Smith MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 58*273d9f13SBarry Smith MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 59*273d9f13SBarry Smith MatConvert() 60*273d9f13SBarry Smith @*/ 61*273d9f13SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,int M,int N,Mat *A) 62*273d9f13SBarry Smith { 63*273d9f13SBarry Smith Mat B; 64*273d9f13SBarry Smith 65*273d9f13SBarry Smith PetscFunctionBegin; 66*273d9f13SBarry Smith PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_COOKIE,0,"Mat",comm,MatDestroy,MatView); 67*273d9f13SBarry Smith PLogObjectCreate(B); 68*273d9f13SBarry Smith 69*273d9f13SBarry Smith B->m = m; 70*273d9f13SBarry Smith B->n = n; 71*273d9f13SBarry Smith B->M = M; 72*273d9f13SBarry Smith B->N = N; 73*273d9f13SBarry Smith 74*273d9f13SBarry Smith B->preallocated = PETSC_FALSE; 75*273d9f13SBarry Smith 76*273d9f13SBarry Smith *A = B; 77*273d9f13SBarry Smith PetscFunctionReturn(0); 78*273d9f13SBarry Smith } 79*273d9f13SBarry Smith 80*273d9f13SBarry Smith #undef __FUNC__ 81*273d9f13SBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatSetFromOptions" 82*273d9f13SBarry Smith /*@C 83*273d9f13SBarry Smith MatSetFromOptions - Creates a matrix where the type is determined 84*273d9f13SBarry Smith from the options database. Generates a parallel MPI matrix if the 85*273d9f13SBarry Smith communicator has more than one processor. The default matrix type is 86*273d9f13SBarry Smith AIJ, using the routines MatSetFromOptionsSeqAIJ() and MatSetFromOptionsMPIAIJ(). 87*273d9f13SBarry Smith 88*273d9f13SBarry Smith Collective on Mat 89*273d9f13SBarry Smith 90*273d9f13SBarry Smith Input Parameter: 91*273d9f13SBarry Smith . A - the matrix 92*273d9f13SBarry Smith 93*273d9f13SBarry Smith Options Database Keys: 94*273d9f13SBarry Smith + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 95*273d9f13SBarry Smith . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 96*273d9f13SBarry Smith . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 97*273d9f13SBarry Smith . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 98*273d9f13SBarry Smith . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 99*273d9f13SBarry Smith . -mat_type seqdense - dense type, uses MatCreateSeqDense() 100*273d9f13SBarry Smith . -mat_type mpidense - dense type, uses MatCreateMPIDense() 101*273d9f13SBarry Smith . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 102*273d9f13SBarry Smith - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 103*273d9f13SBarry Smith 104*273d9f13SBarry Smith Even More Options Database Keys: 105*273d9f13SBarry Smith See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 106*273d9f13SBarry Smith for additional format-specific options. 107bd9ce289SLois Curfman McInnes 1081d69843bSLois Curfman McInnes Level: beginner 1091d69843bSLois Curfman McInnes 110dc401e71SLois Curfman McInnes .keywords: matrix, create 111e0b365e2SLois Curfman McInnes 112fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 113fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 11439ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 115a209d233SLois Curfman McInnes MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 116a209d233SLois Curfman McInnes MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 117*273d9f13SBarry Smith MatConvert() 1187807a1faSBarry Smith @*/ 119*273d9f13SBarry Smith int MatSetFromOptions(Mat B) 1207807a1faSBarry Smith { 121*273d9f13SBarry Smith int ierr,size; 122*273d9f13SBarry Smith char mtype[256]; 123*273d9f13SBarry Smith PetscTruth flg; 124dbb450caSBarry Smith 1253a40ed3dSBarry Smith PetscFunctionBegin; 126*273d9f13SBarry Smith ierr = OptionsGetString(B->prefix,"-mat_type",mtype,256,&flg);CHKERRQ(ierr); 127*273d9f13SBarry Smith if (flg) { 128*273d9f13SBarry Smith ierr = MatSetType(B,mtype);CHKERRQ(ierr); 129*273d9f13SBarry Smith } 130*273d9f13SBarry Smith if (!B->type_name) { 131*273d9f13SBarry Smith ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 132*273d9f13SBarry Smith if (size == 1) { 133*273d9f13SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 134*273d9f13SBarry Smith } else { 135*273d9f13SBarry Smith ierr = MatSetType(B,MATMPIAIJ);CHKERRQ(ierr); 136*273d9f13SBarry Smith } 137dfa27b74SSatish Balay } 1383a40ed3dSBarry Smith PetscFunctionReturn(0); 1397807a1faSBarry Smith } 1407807a1faSBarry Smith 141*273d9f13SBarry Smith #undef __FUNC__ 142*273d9f13SBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatSetUpPreallocation" 143*273d9f13SBarry Smith /*@C 144*273d9f13SBarry Smith MatSetUpPreallocation 145dae03382SLois Curfman McInnes 146*273d9f13SBarry Smith Collective on Mat 147dae03382SLois Curfman McInnes 148*273d9f13SBarry Smith Input Parameter: 149*273d9f13SBarry Smith . A - the matrix 150d5d45c9bSBarry Smith 151*273d9f13SBarry Smith Level: beginner 152d5d45c9bSBarry Smith 153*273d9f13SBarry Smith .keywords: matrix, create 154*273d9f13SBarry Smith 155*273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 156*273d9f13SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 157*273d9f13SBarry Smith MatCreateSeqDense(), MatCreateMPIDense(), 158*273d9f13SBarry Smith MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 159*273d9f13SBarry Smith MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 160*273d9f13SBarry Smith MatConvert() 161*273d9f13SBarry Smith @*/ 162*273d9f13SBarry Smith int MatSetUpPreallocation(Mat B) 163*273d9f13SBarry Smith { 164*273d9f13SBarry Smith int ierr; 165*273d9f13SBarry Smith 166*273d9f13SBarry Smith PetscFunctionBegin; 167*273d9f13SBarry Smith if (B->ops->setuppreallocation) { 168*273d9f13SBarry Smith PLogInfo(B,"MatSetTpPreallocation: Warning not preallocating matrix storage"); 169*273d9f13SBarry Smith ierr = (*B->ops->setuppreallocation)(B);CHKERRQ(ierr); 170*273d9f13SBarry Smith B->ops->setuppreallocation = 0; 171*273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 172*273d9f13SBarry Smith } 173*273d9f13SBarry Smith PetscFunctionReturn(0); 174*273d9f13SBarry Smith } 175*273d9f13SBarry Smith 176*273d9f13SBarry Smith /* 177*273d9f13SBarry Smith Copies from Cs header to A 178*273d9f13SBarry Smith */ 179*273d9f13SBarry Smith #undef __FUNC__ 180*273d9f13SBarry Smith #define __FUNC__ /*<a name="MatHeaderCopy"></a>*/"MatHeaderCopy" 181*273d9f13SBarry Smith int MatHeaderCopy(Mat A,Mat C) 182*273d9f13SBarry Smith { 183*273d9f13SBarry Smith int ierr,refct; 184*273d9f13SBarry Smith PetscOps *Abops; 185*273d9f13SBarry Smith MatOps Aops; 186*273d9f13SBarry Smith char *mtype,*mname; 187*273d9f13SBarry Smith 188*273d9f13SBarry Smith PetscFunctionBegin; 189*273d9f13SBarry Smith /* free all the interior data structures from mat */ 190*273d9f13SBarry Smith ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 191*273d9f13SBarry Smith 192*273d9f13SBarry Smith ierr = MapDestroy(A->rmap);CHKERRQ(ierr); 193*273d9f13SBarry Smith ierr = MapDestroy(A->cmap);CHKERRQ(ierr); 194*273d9f13SBarry Smith 195*273d9f13SBarry Smith /* save the parts of A we need */ 196*273d9f13SBarry Smith Abops = A->bops; 197*273d9f13SBarry Smith Aops = A->ops; 198*273d9f13SBarry Smith refct = A->refct; 199*273d9f13SBarry Smith mtype = A->type_name; 200*273d9f13SBarry Smith mname = A->name; 201*273d9f13SBarry Smith 202*273d9f13SBarry Smith /* copy C over to A */ 203*273d9f13SBarry Smith ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); 204*273d9f13SBarry Smith 205*273d9f13SBarry Smith /* return the parts of A we saved */ 206*273d9f13SBarry Smith A->bops = Abops; 207*273d9f13SBarry Smith A->ops = Aops; 208*273d9f13SBarry Smith A->qlist = 0; 209*273d9f13SBarry Smith A->refct = refct; 210*273d9f13SBarry Smith A->type_name = mtype; 211*273d9f13SBarry Smith A->name = mname; 212*273d9f13SBarry Smith 213*273d9f13SBarry Smith PetscHeaderDestroy(C); 214*273d9f13SBarry Smith PetscFunctionReturn(0); 215*273d9f13SBarry Smith } 216