xref: /petsc/src/mat/utils/gcreate.c (revision e005ede52eafe2fed2813abb7a7eb3df04d5f886)
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