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",(int)m,(int)M); 86 if (N > 0 && n > N) SETERRQ2(PETSC_ERR_ARG_INCOMP,"Local row size %d cannot be larger than global row size %d",(int)n,(int)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 PetscLogObjectCreate(B); 95 96 B->m = m; 97 B->n = n; 98 B->M = M; 99 B->N = N; 100 101 B->preallocated = PETSC_FALSE; 102 B->bops->publish = MatPublish_Base; 103 *A = B; 104 PetscFunctionReturn(0); 105 } 106 107 #undef __FUNCT__ 108 #define __FUNCT__ "MatSetFromOptions" 109 /*@C 110 MatSetFromOptions - Creates a matrix where the type is determined 111 from the options database. Generates a parallel MPI matrix if the 112 communicator has more than one processor. The default matrix type is 113 AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ() if 114 you do not select a type in the options database. 115 116 Collective on Mat 117 118 Input Parameter: 119 . A - the matrix 120 121 Options Database Keys: 122 + -mat_type seqaij - AIJ type, uses MatCreateSeqAIJ() 123 . -mat_type mpiaij - AIJ type, uses MatCreateMPIAIJ() 124 . -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag() 125 . -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag() 126 . -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs() 127 . -mat_type seqdense - dense type, uses MatCreateSeqDense() 128 . -mat_type mpidense - dense type, uses MatCreateMPIDense() 129 . -mat_type seqbaij - block AIJ type, uses MatCreateSeqBAIJ() 130 - -mat_type mpibaij - block AIJ type, uses MatCreateMPIBAIJ() 131 132 Even More Options Database Keys: 133 See the manpages for particular formats (e.g., MatCreateSeqAIJ()) 134 for additional format-specific options. 135 136 Level: beginner 137 138 .keywords: matrix, create 139 140 .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 141 MatCreateSeqBDiag(),MatCreateMPIBDiag(), 142 MatCreateSeqDense(), MatCreateMPIDense(), 143 MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 144 MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 145 MatConvert() 146 @*/ 147 PetscErrorCode MatSetFromOptions(Mat B) 148 { 149 PetscErrorCode ierr; 150 int size; 151 char mtype[256]; 152 PetscTruth flg; 153 154 PetscFunctionBegin; 155 ierr = PetscOptionsGetString(B->prefix,"-mat_type",mtype,256,&flg);CHKERRQ(ierr); 156 if (flg) { 157 ierr = MatSetType(B,mtype);CHKERRQ(ierr); 158 } 159 if (!B->type_name) { 160 ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 161 ierr = MatSetType(B,MATAIJ);CHKERRQ(ierr); 162 } 163 #if defined(__cplusplus) && !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE) && defined(PETSC_HAVE_CXX_NAMESPACE) 164 ierr = MatESISetFromOptions(B);CHKERRQ(ierr); 165 #endif 166 PetscFunctionReturn(0); 167 } 168 169 #undef __FUNCT__ 170 #define __FUNCT__ "MatSetUpPreallocation" 171 /*@C 172 MatSetUpPreallocation 173 174 Collective on Mat 175 176 Input Parameter: 177 . A - the matrix 178 179 Level: beginner 180 181 .keywords: matrix, create 182 183 .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(), 184 MatCreateSeqBDiag(),MatCreateMPIBDiag(), 185 MatCreateSeqDense(), MatCreateMPIDense(), 186 MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), 187 MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(), 188 MatConvert() 189 @*/ 190 PetscErrorCode MatSetUpPreallocation(Mat B) 191 { 192 PetscErrorCode ierr; 193 194 PetscFunctionBegin; 195 if (B->ops->setuppreallocation) { 196 PetscLogInfo(B,"MatSetUpPreallocation: Warning not preallocating matrix storage"); 197 ierr = (*B->ops->setuppreallocation)(B);CHKERRQ(ierr); 198 B->ops->setuppreallocation = 0; 199 B->preallocated = PETSC_TRUE; 200 } 201 PetscFunctionReturn(0); 202 } 203 204 /* 205 Copies from Cs header to A 206 */ 207 #undef __FUNCT__ 208 #define __FUNCT__ "MatHeaderCopy" 209 PetscErrorCode MatHeaderCopy(Mat A,Mat C) 210 { 211 PetscErrorCode ierr; 212 int refct; 213 PetscOps *Abops; 214 MatOps Aops; 215 char *mtype,*mname; 216 217 PetscFunctionBegin; 218 /* free all the interior data structures from mat */ 219 ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 220 221 ierr = PetscMapDestroy(A->rmap);CHKERRQ(ierr); 222 ierr = PetscMapDestroy(A->cmap);CHKERRQ(ierr); 223 224 /* save the parts of A we need */ 225 Abops = A->bops; 226 Aops = A->ops; 227 refct = A->refct; 228 mtype = A->type_name; 229 mname = A->name; 230 231 /* copy C over to A */ 232 ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); 233 234 /* return the parts of A we saved */ 235 A->bops = Abops; 236 A->ops = Aops; 237 A->qlist = 0; 238 A->refct = refct; 239 A->type_name = mtype; 240 A->name = mname; 241 242 PetscLogObjectDestroy(C); 243 PetscHeaderDestroy(C); 244 PetscFunctionReturn(0); 245 } 246