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