xref: /petsc/src/mat/utils/gcreate.c (revision 273d9f13de75c4ed17021f7f2c11eebb99d26f0d)
1*273d9f13SBarry Smith /*$Id: gcreate.c,v 1.123 2000/09/25 19:57:36 curfman Exp bsmith $*/
27807a1faSBarry Smith 
3e090d566SSatish Balay #include "petscsys.h"
4*273d9f13SBarry Smith #include "src/mat/matimpl.h"       /*I "petscmat.h"  I*/
57807a1faSBarry Smith 
65615d1e5SSatish Balay #undef __FUNC__
7b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatCreate"
8325ab940SBarry Smith /*@C
969dd0797SLois Curfman McInnes    MatCreate - Creates a matrix where the type is determined
1002a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
1183e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
1283e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
1383e1b59cSLois Curfman McInnes 
14cb13003dSBarry Smith    Collective on MPI_Comm
15cb13003dSBarry Smith 
167807a1faSBarry Smith    Input Parameters:
1782b900a8SBarry Smith +  m - number of local rows (or PETSC_DECIDE)
1882b900a8SBarry Smith .  n - number of local columns (or PETSC_DECIDE)
1982b900a8SBarry Smith .  M - number of global rows (or PETSC_DETERMINE)
2082b900a8SBarry Smith .  N - number of global columns (or PETSC_DETERMINE)
21cb13003dSBarry Smith -  comm - MPI communicator
227807a1faSBarry Smith 
237807a1faSBarry Smith    Output Parameter:
24dc401e71SLois Curfman McInnes .  A - the matrix
25e0b365e2SLois Curfman McInnes 
26*273d9f13SBarry Smith    Options Database Keys:
27*273d9f13SBarry Smith +    -mat_type seqaij   - AIJ type, uses MatCreateSeqAIJ()
28*273d9f13SBarry Smith .    -mat_type mpiaij   - AIJ type, uses MatCreateMPIAIJ()
29*273d9f13SBarry Smith .    -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag()
30*273d9f13SBarry Smith .    -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag()
31*273d9f13SBarry Smith .    -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs()
32*273d9f13SBarry Smith .    -mat_type seqdense - dense type, uses MatCreateSeqDense()
33*273d9f13SBarry Smith .    -mat_type mpidense - dense type, uses MatCreateMPIDense()
34*273d9f13SBarry Smith .    -mat_type seqbaij  - block AIJ type, uses MatCreateSeqBAIJ()
35*273d9f13SBarry Smith -    -mat_type mpibaij  - block AIJ type, uses MatCreateMPIBAIJ()
36e0b365e2SLois Curfman McInnes 
3783e1b59cSLois Curfman McInnes    Even More Options Database Keys:
3883e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
3983e1b59cSLois Curfman McInnes    for additional format-specific options.
40e0b365e2SLois Curfman McInnes 
41bd9ce289SLois Curfman McInnes    Notes:
42ec6e0d80SSatish Balay    If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the
43ec6e0d80SSatish Balay    user must ensure that they are chosen to be compatible with the
44ec6e0d80SSatish Balay    vectors. To do this, one first considers the matrix-vector product
45ec6e0d80SSatish Balay    'y = A x'. The 'm' that is used in the above routine must match the
46ec6e0d80SSatish Balay    local size used in the vector creation routine VecCreateMPI() for 'y'.
47ec6e0d80SSatish Balay    Likewise, the 'n' used must match that used as the local size in
48ec6e0d80SSatish Balay    VecCreateMPI() for 'x'.
49ec6e0d80SSatish Balay 
50*273d9f13SBarry Smith    Level: beginner
51*273d9f13SBarry Smith 
52*273d9f13SBarry Smith .keywords: matrix, create
53*273d9f13SBarry Smith 
54*273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
55*273d9f13SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
56*273d9f13SBarry Smith           MatCreateSeqDense(), MatCreateMPIDense(),
57*273d9f13SBarry Smith           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
58*273d9f13SBarry Smith           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
59*273d9f13SBarry Smith           MatConvert()
60*273d9f13SBarry Smith @*/
61*273d9f13SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,int M,int N,Mat *A)
62*273d9f13SBarry Smith {
63*273d9f13SBarry Smith   Mat B;
64*273d9f13SBarry Smith 
65*273d9f13SBarry Smith   PetscFunctionBegin;
66*273d9f13SBarry Smith   PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_COOKIE,0,"Mat",comm,MatDestroy,MatView);
67*273d9f13SBarry Smith   PLogObjectCreate(B);
68*273d9f13SBarry Smith 
69*273d9f13SBarry Smith   B->m = m;
70*273d9f13SBarry Smith   B->n = n;
71*273d9f13SBarry Smith   B->M = M;
72*273d9f13SBarry Smith   B->N = N;
73*273d9f13SBarry Smith 
74*273d9f13SBarry Smith   B->preallocated = PETSC_FALSE;
75*273d9f13SBarry Smith 
76*273d9f13SBarry Smith   *A = B;
77*273d9f13SBarry Smith   PetscFunctionReturn(0);
78*273d9f13SBarry Smith }
79*273d9f13SBarry Smith 
80*273d9f13SBarry Smith #undef __FUNC__
81*273d9f13SBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatSetFromOptions"
82*273d9f13SBarry Smith /*@C
83*273d9f13SBarry Smith    MatSetFromOptions - Creates a matrix where the type is determined
84*273d9f13SBarry Smith    from the options database. Generates a parallel MPI matrix if the
85*273d9f13SBarry Smith    communicator has more than one processor.  The default matrix type is
86*273d9f13SBarry Smith    AIJ, using the routines MatSetFromOptionsSeqAIJ() and MatSetFromOptionsMPIAIJ().
87*273d9f13SBarry Smith 
88*273d9f13SBarry Smith    Collective on Mat
89*273d9f13SBarry Smith 
90*273d9f13SBarry Smith    Input Parameter:
91*273d9f13SBarry Smith .  A - the matrix
92*273d9f13SBarry Smith 
93*273d9f13SBarry Smith    Options Database Keys:
94*273d9f13SBarry Smith +    -mat_type seqaij   - AIJ type, uses MatCreateSeqAIJ()
95*273d9f13SBarry Smith .    -mat_type mpiaij   - AIJ type, uses MatCreateMPIAIJ()
96*273d9f13SBarry Smith .    -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag()
97*273d9f13SBarry Smith .    -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag()
98*273d9f13SBarry Smith .    -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs()
99*273d9f13SBarry Smith .    -mat_type seqdense - dense type, uses MatCreateSeqDense()
100*273d9f13SBarry Smith .    -mat_type mpidense - dense type, uses MatCreateMPIDense()
101*273d9f13SBarry Smith .    -mat_type seqbaij  - block AIJ type, uses MatCreateSeqBAIJ()
102*273d9f13SBarry Smith -    -mat_type mpibaij  - block AIJ type, uses MatCreateMPIBAIJ()
103*273d9f13SBarry Smith 
104*273d9f13SBarry Smith    Even More Options Database Keys:
105*273d9f13SBarry Smith    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
106*273d9f13SBarry Smith    for additional format-specific options.
107bd9ce289SLois Curfman McInnes 
1081d69843bSLois Curfman McInnes    Level: beginner
1091d69843bSLois Curfman McInnes 
110dc401e71SLois Curfman McInnes .keywords: matrix, create
111e0b365e2SLois Curfman McInnes 
112fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
113fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
11439ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
115a209d233SLois Curfman McInnes           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
116a209d233SLois Curfman McInnes           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
117*273d9f13SBarry Smith           MatConvert()
1187807a1faSBarry Smith @*/
119*273d9f13SBarry Smith int MatSetFromOptions(Mat B)
1207807a1faSBarry Smith {
121*273d9f13SBarry Smith   int        ierr,size;
122*273d9f13SBarry Smith   char       mtype[256];
123*273d9f13SBarry Smith   PetscTruth flg;
124dbb450caSBarry Smith 
1253a40ed3dSBarry Smith   PetscFunctionBegin;
126*273d9f13SBarry Smith   ierr = OptionsGetString(B->prefix,"-mat_type",mtype,256,&flg);CHKERRQ(ierr);
127*273d9f13SBarry Smith   if (flg) {
128*273d9f13SBarry Smith     ierr = MatSetType(B,mtype);CHKERRQ(ierr);
129*273d9f13SBarry Smith   }
130*273d9f13SBarry Smith   if (!B->type_name) {
131*273d9f13SBarry Smith     ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr);
132*273d9f13SBarry Smith     if (size == 1) {
133*273d9f13SBarry Smith       ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
134*273d9f13SBarry Smith     } else {
135*273d9f13SBarry Smith       ierr = MatSetType(B,MATMPIAIJ);CHKERRQ(ierr);
136*273d9f13SBarry Smith     }
137dfa27b74SSatish Balay   }
1383a40ed3dSBarry Smith   PetscFunctionReturn(0);
1397807a1faSBarry Smith }
1407807a1faSBarry Smith 
141*273d9f13SBarry Smith #undef __FUNC__
142*273d9f13SBarry Smith #define __FUNC__ /*<a name=""></a>*/"MatSetUpPreallocation"
143*273d9f13SBarry Smith /*@C
144*273d9f13SBarry Smith    MatSetUpPreallocation
145dae03382SLois Curfman McInnes 
146*273d9f13SBarry Smith    Collective on Mat
147dae03382SLois Curfman McInnes 
148*273d9f13SBarry Smith    Input Parameter:
149*273d9f13SBarry Smith .  A - the matrix
150d5d45c9bSBarry Smith 
151*273d9f13SBarry Smith    Level: beginner
152d5d45c9bSBarry Smith 
153*273d9f13SBarry Smith .keywords: matrix, create
154*273d9f13SBarry Smith 
155*273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
156*273d9f13SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
157*273d9f13SBarry Smith           MatCreateSeqDense(), MatCreateMPIDense(),
158*273d9f13SBarry Smith           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
159*273d9f13SBarry Smith           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
160*273d9f13SBarry Smith           MatConvert()
161*273d9f13SBarry Smith @*/
162*273d9f13SBarry Smith int MatSetUpPreallocation(Mat B)
163*273d9f13SBarry Smith {
164*273d9f13SBarry Smith   int        ierr;
165*273d9f13SBarry Smith 
166*273d9f13SBarry Smith   PetscFunctionBegin;
167*273d9f13SBarry Smith   if (B->ops->setuppreallocation) {
168*273d9f13SBarry Smith     PLogInfo(B,"MatSetTpPreallocation: Warning not preallocating matrix storage");
169*273d9f13SBarry Smith     ierr = (*B->ops->setuppreallocation)(B);CHKERRQ(ierr);
170*273d9f13SBarry Smith     B->ops->setuppreallocation = 0;
171*273d9f13SBarry Smith     B->preallocated            = PETSC_TRUE;
172*273d9f13SBarry Smith   }
173*273d9f13SBarry Smith   PetscFunctionReturn(0);
174*273d9f13SBarry Smith }
175*273d9f13SBarry Smith 
176*273d9f13SBarry Smith /*
177*273d9f13SBarry Smith         Copies from Cs header to A
178*273d9f13SBarry Smith */
179*273d9f13SBarry Smith #undef __FUNC__
180*273d9f13SBarry Smith #define __FUNC__ /*<a name="MatHeaderCopy"></a>*/"MatHeaderCopy"
181*273d9f13SBarry Smith int MatHeaderCopy(Mat A,Mat C)
182*273d9f13SBarry Smith {
183*273d9f13SBarry Smith   int         ierr,refct;
184*273d9f13SBarry Smith   PetscOps    *Abops;
185*273d9f13SBarry Smith   MatOps      Aops;
186*273d9f13SBarry Smith   char        *mtype,*mname;
187*273d9f13SBarry Smith 
188*273d9f13SBarry Smith   PetscFunctionBegin;
189*273d9f13SBarry Smith   /* free all the interior data structures from mat */
190*273d9f13SBarry Smith   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
191*273d9f13SBarry Smith 
192*273d9f13SBarry Smith   ierr = MapDestroy(A->rmap);CHKERRQ(ierr);
193*273d9f13SBarry Smith   ierr = MapDestroy(A->cmap);CHKERRQ(ierr);
194*273d9f13SBarry Smith 
195*273d9f13SBarry Smith   /* save the parts of A we need */
196*273d9f13SBarry Smith   Abops = A->bops;
197*273d9f13SBarry Smith   Aops  = A->ops;
198*273d9f13SBarry Smith   refct = A->refct;
199*273d9f13SBarry Smith   mtype = A->type_name;
200*273d9f13SBarry Smith   mname = A->name;
201*273d9f13SBarry Smith 
202*273d9f13SBarry Smith   /* copy C over to A */
203*273d9f13SBarry Smith   ierr  = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr);
204*273d9f13SBarry Smith 
205*273d9f13SBarry Smith   /* return the parts of A we saved */
206*273d9f13SBarry Smith   A->bops      = Abops;
207*273d9f13SBarry Smith   A->ops       = Aops;
208*273d9f13SBarry Smith   A->qlist     = 0;
209*273d9f13SBarry Smith   A->refct     = refct;
210*273d9f13SBarry Smith   A->type_name = mtype;
211*273d9f13SBarry Smith   A->name      = mname;
212*273d9f13SBarry Smith 
213*273d9f13SBarry Smith   PetscHeaderDestroy(C);
214*273d9f13SBarry Smith   PetscFunctionReturn(0);
215*273d9f13SBarry Smith }
216