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