1*b0a32e0cSBarry Smith /*$Id: gcreate.c,v 1.125 2000/11/28 17:29:54 bsmith Exp bsmith $*/ 27807a1faSBarry Smith 3e090d566SSatish Balay #include "petscsys.h" 4273d9f13SBarry Smith #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 57807a1faSBarry Smith 65615d1e5SSatish Balay #undef __FUNC__ 7*b0a32e0cSBarry Smith #define __FUNC__ "MatPublish_Base" 835d8aa7fSBarry Smith static int MatPublish_Base(PetscObject obj) 935d8aa7fSBarry Smith { 1035d8aa7fSBarry Smith #if defined(PETSC_HAVE_AMS) 1135d8aa7fSBarry Smith Mat mat = (Mat)obj; 1235d8aa7fSBarry Smith int ierr; 1335d8aa7fSBarry Smith #endif 1435d8aa7fSBarry Smith 1535d8aa7fSBarry Smith PetscFunctionBegin; 1635d8aa7fSBarry Smith #if defined(PETSC_HAVE_AMS) 1735d8aa7fSBarry Smith /* if it is already published then return */ 1835d8aa7fSBarry Smith if (mat->amem >=0) PetscFunctionReturn(0); 1935d8aa7fSBarry Smith 2035d8aa7fSBarry Smith ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr); 2135d8aa7fSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)mat->amem,"globalsizes",&mat->M,2,AMS_INT,AMS_READ, 2235d8aa7fSBarry Smith AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 2335d8aa7fSBarry Smith ierr = AMS_Memory_add_field((AMS_Memory)mat->amem,"localsizes",&mat->m,2,AMS_INT,AMS_READ, 2435d8aa7fSBarry Smith AMS_DISTRIBUTED,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 2535d8aa7fSBarry Smith ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr); 2635d8aa7fSBarry Smith #endif 2735d8aa7fSBarry Smith 2835d8aa7fSBarry Smith PetscFunctionReturn(0); 2935d8aa7fSBarry Smith } 3035d8aa7fSBarry Smith 3135d8aa7fSBarry Smith 3235d8aa7fSBarry Smith #undef __FUNC__ 33*b0a32e0cSBarry Smith #define __FUNC__ "MatCreate" 34325ab940SBarry Smith /*@C 3569dd0797SLois Curfman McInnes MatCreate - Creates a matrix where the type is determined 3602a82ca1SLois Curfman McInnes from the options database. Generates a parallel MPI matrix if the 3783e1b59cSLois Curfman McInnes communicator has more than one processor. The default matrix type is 3883e1b59cSLois Curfman McInnes AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ(). 3983e1b59cSLois Curfman McInnes 40cb13003dSBarry Smith Collective on MPI_Comm 41cb13003dSBarry Smith 427807a1faSBarry Smith Input Parameters: 4382b900a8SBarry Smith + m - number of local rows (or PETSC_DECIDE) 4482b900a8SBarry Smith . n - number of local columns (or PETSC_DECIDE) 4582b900a8SBarry Smith . M - number of global rows (or PETSC_DETERMINE) 4682b900a8SBarry Smith . N - number of global columns (or PETSC_DETERMINE) 47cb13003dSBarry Smith - comm - MPI communicator 487807a1faSBarry Smith 497807a1faSBarry Smith Output Parameter: 50dc401e71SLois Curfman McInnes . A - the matrix 51e0b365e2SLois Curfman McInnes 52273d9f13SBarry Smith Options Database Keys: 53273d9f13SBarry Smith + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 54273d9f13SBarry Smith . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 55273d9f13SBarry Smith . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 56273d9f13SBarry Smith . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 57273d9f13SBarry Smith . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 58273d9f13SBarry Smith . -mat_type seqdense - dense type, uses MatCreateSeqDense() 59273d9f13SBarry Smith . -mat_type mpidense - dense type, uses MatCreateMPIDense() 60273d9f13SBarry Smith . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 61273d9f13SBarry Smith - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 62e0b365e2SLois Curfman McInnes 6383e1b59cSLois Curfman McInnes Even More Options Database Keys: 6483e1b59cSLois Curfman McInnes See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 6583e1b59cSLois Curfman McInnes for additional format-specific options. 66e0b365e2SLois Curfman McInnes 67bd9ce289SLois Curfman McInnes Notes: 68ec6e0d80SSatish Balay If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the 69ec6e0d80SSatish Balay user must ensure that they are chosen to be compatible with the 70ec6e0d80SSatish Balay vectors. To do this, one first considers the matrix-vector product 71ec6e0d80SSatish Balay 'y = A x'. The 'm' that is used in the above routine must match the 72ec6e0d80SSatish Balay local size used in the vector creation routine VecCreateMPI() for 'y'. 73ec6e0d80SSatish Balay Likewise, the 'n' used must match that used as the local size in 74ec6e0d80SSatish Balay VecCreateMPI() for 'x'. 75ec6e0d80SSatish Balay 76273d9f13SBarry Smith Level: beginner 77273d9f13SBarry Smith 78273d9f13SBarry Smith .keywords: matrix, create 79273d9f13SBarry Smith 80273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 81273d9f13SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 82273d9f13SBarry Smith MatCreateSeqDense(), MatCreateMPIDense(), 83273d9f13SBarry Smith MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 84273d9f13SBarry Smith MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 85273d9f13SBarry Smith MatConvert() 86273d9f13SBarry Smith @*/ 87273d9f13SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,int M,int N,Mat *A) 88273d9f13SBarry Smith { 89273d9f13SBarry Smith Mat B; 90273d9f13SBarry Smith 91273d9f13SBarry Smith PetscFunctionBegin; 92273d9f13SBarry Smith PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_COOKIE,0,"Mat",comm,MatDestroy,MatView); 93*b0a32e0cSBarry Smith PetscLogObjectCreate(B); 94273d9f13SBarry Smith 95273d9f13SBarry Smith B->m = m; 96273d9f13SBarry Smith B->n = n; 97273d9f13SBarry Smith B->M = M; 98273d9f13SBarry Smith B->N = N; 99273d9f13SBarry Smith 100273d9f13SBarry Smith B->preallocated = PETSC_FALSE; 10135d8aa7fSBarry Smith B->bops->publish = MatPublish_Base; 102273d9f13SBarry Smith *A = B; 103273d9f13SBarry Smith PetscFunctionReturn(0); 104273d9f13SBarry Smith } 105273d9f13SBarry Smith 106273d9f13SBarry Smith #undef __FUNC__ 107*b0a32e0cSBarry Smith #define __FUNC__ "MatSetFromOptions" 108273d9f13SBarry Smith /*@C 109273d9f13SBarry Smith MatSetFromOptions - Creates a matrix where the type is determined 110273d9f13SBarry Smith from the options database. Generates a parallel MPI matrix if the 111273d9f13SBarry Smith communicator has more than one processor. The default matrix type is 112273d9f13SBarry Smith AIJ, using the routines MatSetFromOptionsSeqAIJ() and MatSetFromOptionsMPIAIJ(). 113273d9f13SBarry Smith 114273d9f13SBarry Smith Collective on Mat 115273d9f13SBarry Smith 116273d9f13SBarry Smith Input Parameter: 117273d9f13SBarry Smith . A - the matrix 118273d9f13SBarry Smith 119273d9f13SBarry Smith Options Database Keys: 120273d9f13SBarry Smith + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 121273d9f13SBarry Smith . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 122273d9f13SBarry Smith . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 123273d9f13SBarry Smith . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 124273d9f13SBarry Smith . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 125273d9f13SBarry Smith . -mat_type seqdense - dense type, uses MatCreateSeqDense() 126273d9f13SBarry Smith . -mat_type mpidense - dense type, uses MatCreateMPIDense() 127273d9f13SBarry Smith . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 128273d9f13SBarry Smith - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 129273d9f13SBarry Smith 130273d9f13SBarry Smith Even More Options Database Keys: 131273d9f13SBarry Smith See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 132273d9f13SBarry Smith for additional format-specific options. 133bd9ce289SLois Curfman McInnes 1341d69843bSLois Curfman McInnes Level: beginner 1351d69843bSLois Curfman McInnes 136dc401e71SLois Curfman McInnes .keywords: matrix, create 137e0b365e2SLois Curfman McInnes 138fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 139fafbff53SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 14039ddd567SLois Curfman McInnes MatCreateSeqDense(), MatCreateMPIDense(), 141a209d233SLois Curfman McInnes MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 142a209d233SLois Curfman McInnes MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 143273d9f13SBarry Smith MatConvert() 1447807a1faSBarry Smith @*/ 145273d9f13SBarry Smith int MatSetFromOptions(Mat B) 1467807a1faSBarry Smith { 147273d9f13SBarry Smith int ierr,size; 148273d9f13SBarry Smith char mtype[256]; 149273d9f13SBarry Smith PetscTruth flg; 150dbb450caSBarry Smith 1513a40ed3dSBarry Smith PetscFunctionBegin; 152*b0a32e0cSBarry Smith ierr = PetscOptionsGetString(B->prefix,"-mat_type",mtype,256,&flg);CHKERRQ(ierr); 153273d9f13SBarry Smith if (flg) { 154273d9f13SBarry Smith ierr = MatSetType(B,mtype);CHKERRQ(ierr); 155273d9f13SBarry Smith } 156273d9f13SBarry Smith if (!B->type_name) { 157273d9f13SBarry Smith ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 158273d9f13SBarry Smith if (size == 1) { 159273d9f13SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 160273d9f13SBarry Smith } else { 161273d9f13SBarry Smith ierr = MatSetType(B,MATMPIAIJ);CHKERRQ(ierr); 162273d9f13SBarry Smith } 163dfa27b74SSatish Balay } 1643a40ed3dSBarry Smith PetscFunctionReturn(0); 1657807a1faSBarry Smith } 1667807a1faSBarry Smith 167273d9f13SBarry Smith #undef __FUNC__ 168*b0a32e0cSBarry Smith #define __FUNC__ "MatSetUpPreallocation" 169273d9f13SBarry Smith /*@C 170273d9f13SBarry Smith MatSetUpPreallocation 171dae03382SLois Curfman McInnes 172273d9f13SBarry Smith Collective on Mat 173dae03382SLois Curfman McInnes 174273d9f13SBarry Smith Input Parameter: 175273d9f13SBarry Smith . A - the matrix 176d5d45c9bSBarry Smith 177273d9f13SBarry Smith Level: beginner 178d5d45c9bSBarry Smith 179273d9f13SBarry Smith .keywords: matrix, create 180273d9f13SBarry Smith 181273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 182273d9f13SBarry Smith MatCreateSeqBDiag(),MatCreateMPIBDiag(), 183273d9f13SBarry Smith MatCreateSeqDense(), MatCreateMPIDense(), 184273d9f13SBarry Smith MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 185273d9f13SBarry Smith MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 186273d9f13SBarry Smith MatConvert() 187273d9f13SBarry Smith @*/ 188273d9f13SBarry Smith int MatSetUpPreallocation(Mat B) 189273d9f13SBarry Smith { 190273d9f13SBarry Smith int ierr; 191273d9f13SBarry Smith 192273d9f13SBarry Smith PetscFunctionBegin; 193273d9f13SBarry Smith if (B->ops->setuppreallocation) { 194*b0a32e0cSBarry Smith PetscLogInfo(B,"MatSetTpPreallocation: Warning not preallocating matrix storage"); 195273d9f13SBarry Smith ierr = (*B->ops->setuppreallocation)(B);CHKERRQ(ierr); 196273d9f13SBarry Smith B->ops->setuppreallocation = 0; 197273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 198273d9f13SBarry Smith } 199273d9f13SBarry Smith PetscFunctionReturn(0); 200273d9f13SBarry Smith } 201273d9f13SBarry Smith 202273d9f13SBarry Smith /* 203273d9f13SBarry Smith Copies from Cs header to A 204273d9f13SBarry Smith */ 205273d9f13SBarry Smith #undef __FUNC__ 206*b0a32e0cSBarry Smith #define __FUNC__ "MatHeaderCopy" 207273d9f13SBarry Smith int MatHeaderCopy(Mat A,Mat C) 208273d9f13SBarry Smith { 209273d9f13SBarry Smith int ierr,refct; 210273d9f13SBarry Smith PetscOps *Abops; 211273d9f13SBarry Smith MatOps Aops; 212273d9f13SBarry Smith char *mtype,*mname; 213273d9f13SBarry Smith 214273d9f13SBarry Smith PetscFunctionBegin; 215273d9f13SBarry Smith /* free all the interior data structures from mat */ 216273d9f13SBarry Smith ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 217273d9f13SBarry Smith 218273d9f13SBarry Smith ierr = MapDestroy(A->rmap);CHKERRQ(ierr); 219273d9f13SBarry Smith ierr = MapDestroy(A->cmap);CHKERRQ(ierr); 220273d9f13SBarry Smith 221273d9f13SBarry Smith /* save the parts of A we need */ 222273d9f13SBarry Smith Abops = A->bops; 223273d9f13SBarry Smith Aops = A->ops; 224273d9f13SBarry Smith refct = A->refct; 225273d9f13SBarry Smith mtype = A->type_name; 226273d9f13SBarry Smith mname = A->name; 227273d9f13SBarry Smith 228273d9f13SBarry Smith /* copy C over to A */ 229273d9f13SBarry Smith ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); 230273d9f13SBarry Smith 231273d9f13SBarry Smith /* return the parts of A we saved */ 232273d9f13SBarry Smith A->bops = Abops; 233273d9f13SBarry Smith A->ops = Aops; 234273d9f13SBarry Smith A->qlist = 0; 235273d9f13SBarry Smith A->refct = refct; 236273d9f13SBarry Smith A->type_name = mtype; 237273d9f13SBarry Smith A->name = mname; 238273d9f13SBarry Smith 239273d9f13SBarry Smith PetscHeaderDestroy(C); 240273d9f13SBarry Smith PetscFunctionReturn(0); 241273d9f13SBarry Smith } 242