1 2 #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 3 #include "petscsys.h" 4 5 #undef __FUNCT__ 6 #define __FUNCT__ "MatPublish_Base" 7 static PetscErrorCode MatPublish_Base(PetscObject obj) 8 { 9 PetscFunctionBegin; 10 PetscFunctionReturn(0); 11 } 12 13 14 #undef __FUNCT__ 15 #define __FUNCT__ "MatCreate" 16 /*@C 17 MatCreate - Creates a matrix where the type is determined 18 from either a call to MatSetType() or from the options database 19 with a call to MatSetFromOptions(). The default matrix type is 20 AIJ, using the routines MatCreateSeqAIJ() or MatCreateMPIAIJ() 21 if you do not set a type in the options database. If you never 22 call MatSetType() or MatSetFromOptions() it will generate an 23 error when you try to use the matrix. 24 25 Collective on MPI_Comm 26 27 Input Parameters: 28 + m - number of local rows (or PETSC_DECIDE) 29 . n - number of local columns (or PETSC_DECIDE) 30 . M - number of global rows (or PETSC_DETERMINE) 31 . N - number of global columns (or PETSC_DETERMINE) 32 - comm - MPI communicator 33 34 Output Parameter: 35 . A - the matrix 36 37 Options Database Keys: 38 + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 39 . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 40 . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 41 . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 42 . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 43 . -mat_type seqdense - dense type, uses MatCreateSeqDense() 44 . -mat_type mpidense - dense type, uses MatCreateMPIDense() 45 . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 46 - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 47 48 Even More Options Database Keys: 49 See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 50 for additional format-specific options. 51 52 Notes: 53 If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the 54 user must ensure that they are chosen to be compatible with the 55 vectors. To do this, one first considers the matrix-vector product 56 'y = A x'. The 'm' that is used in the above routine must match the 57 local size used in the vector creation routine VecCreateMPI() for 'y'. 58 Likewise, the 'n' used must match that used as the local size in 59 VecCreateMPI() for 'x'. 60 61 Level: beginner 62 63 User manual sections: 64 + sec_matcreate 65 - chapter_matrices 66 67 .keywords: matrix, create 68 69 .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 70 MatCreateSeqBDiag(),MatCreateMPIBDiag(), 71 MatCreateSeqDense(), MatCreateMPIDense(), 72 MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 73 MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 74 MatConvert() 75 @*/ 76 PetscErrorCode MatCreate(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,Mat *A) 77 { 78 Mat B; 79 #ifndef PETSC_USE_DYNAMIC_LIBRARIES 80 PetscErrorCode ierr; 81 #endif 82 83 PetscFunctionBegin; 84 PetscValidPointer(A,6); 85 if (M > 0 && m > M) SETERRQ2(PETSC_ERR_ARG_INCOMP,"Local column size %D cannot be larger than global column size %D",m,M); 86 if (N > 0 && n > N) SETERRQ2(PETSC_ERR_ARG_INCOMP,"Local row size %D cannot be larger than global row size %D",n,N); 87 88 *A = PETSC_NULL; 89 #ifndef PETSC_USE_DYNAMIC_LIBRARIES 90 ierr = MatInitializePackage(PETSC_NULL);CHKERRQ(ierr); 91 #endif 92 93 PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_COOKIE,0,"Mat",comm,MatDestroy,MatView); 94 95 B->m = m; 96 B->n = n; 97 B->M = M; 98 B->N = N; 99 B->bs = 1; 100 B->preallocated = PETSC_FALSE; 101 B->bops->publish = MatPublish_Base; 102 *A = B; 103 PetscFunctionReturn(0); 104 } 105 106 #undef __FUNCT__ 107 #define __FUNCT__ "MatSetFromOptions" 108 /*@C 109 MatSetFromOptions - Creates a matrix where the type is determined 110 from the options database. Generates a parallel MPI matrix if the 111 communicator has more than one processor. The default matrix type is 112 AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ() if 113 you do not select a type in the options database. 114 115 Collective on Mat 116 117 Input Parameter: 118 . A - the matrix 119 120 Options Database Keys: 121 + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 122 . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 123 . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 124 . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 125 . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 126 . -mat_type seqdense - dense type, uses MatCreateSeqDense() 127 . -mat_type mpidense - dense type, uses MatCreateMPIDense() 128 . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 129 - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 130 131 Even More Options Database Keys: 132 See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 133 for additional format-specific options. 134 135 Level: beginner 136 137 .keywords: matrix, create 138 139 .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 140 MatCreateSeqBDiag(),MatCreateMPIBDiag(), 141 MatCreateSeqDense(), MatCreateMPIDense(), 142 MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 143 MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 144 MatConvert() 145 @*/ 146 PetscErrorCode MatSetFromOptions(Mat B) 147 { 148 PetscErrorCode ierr; 149 PetscMPIInt size; 150 char mtype[256]; 151 PetscTruth flg; 152 153 PetscFunctionBegin; 154 ierr = PetscOptionsGetString(B->prefix,"-mat_type",mtype,256,&flg);CHKERRQ(ierr); 155 if (flg) { 156 ierr = MatSetType(B,mtype);CHKERRQ(ierr); 157 } 158 if (!B->type_name) { 159 ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 160 ierr = MatSetType(B,MATAIJ);CHKERRQ(ierr); 161 } 162 PetscFunctionReturn(0); 163 } 164 165 #undef __FUNCT__ 166 #define __FUNCT__ "MatSetUpPreallocation" 167 /*@C 168 MatSetUpPreallocation 169 170 Collective on Mat 171 172 Input Parameter: 173 . A - the matrix 174 175 Level: beginner 176 177 .keywords: matrix, create 178 179 .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 180 MatCreateSeqBDiag(),MatCreateMPIBDiag(), 181 MatCreateSeqDense(), MatCreateMPIDense(), 182 MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 183 MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 184 MatConvert() 185 @*/ 186 PetscErrorCode MatSetUpPreallocation(Mat B) 187 { 188 PetscErrorCode ierr; 189 190 PetscFunctionBegin; 191 if (B->ops->setuppreallocation) { 192 PetscLogInfo(B,"MatSetUpPreallocation: Warning not preallocating matrix storage"); 193 ierr = (*B->ops->setuppreallocation)(B);CHKERRQ(ierr); 194 B->ops->setuppreallocation = 0; 195 B->preallocated = PETSC_TRUE; 196 } 197 PetscFunctionReturn(0); 198 } 199 200 /* 201 Copies from Cs header to A 202 */ 203 #undef __FUNCT__ 204 #define __FUNCT__ "MatHeaderCopy" 205 PetscErrorCode MatHeaderCopy(Mat A,Mat C) 206 { 207 PetscErrorCode ierr; 208 PetscInt refct; 209 PetscOps *Abops; 210 MatOps Aops; 211 char *mtype,*mname; 212 213 PetscFunctionBegin; 214 /* free all the interior data structures from mat */ 215 ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 216 217 ierr = PetscMapDestroy(A->rmap);CHKERRQ(ierr); 218 ierr = PetscMapDestroy(A->cmap);CHKERRQ(ierr); 219 220 /* save the parts of A we need */ 221 Abops = A->bops; 222 Aops = A->ops; 223 refct = A->refct; 224 mtype = A->type_name; 225 mname = A->name; 226 227 /* copy C over to A */ 228 ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); 229 230 /* return the parts of A we saved */ 231 A->bops = Abops; 232 A->ops = Aops; 233 A->qlist = 0; 234 A->refct = refct; 235 A->type_name = mtype; 236 A->name = mname; 237 238 ierr = PetscHeaderDestroy(C);CHKERRQ(ierr); 239 PetscFunctionReturn(0); 240 } 241