xref: /petsc/src/mat/utils/gcreate.c (revision b0a32e0c6855ee6a6cd3495fa7da12ea9885bc5d)
1*b0a32e0cSBarry Smith /*$Id: gcreate.c,v 1.125 2000/11/28 17:29:54 bsmith Exp bsmith $*/
27807a1faSBarry Smith 
3e090d566SSatish Balay #include "petscsys.h"
4273d9f13SBarry Smith #include "src/mat/matimpl.h"       /*I "petscmat.h"  I*/
57807a1faSBarry Smith 
65615d1e5SSatish Balay #undef __FUNC__
7*b0a32e0cSBarry Smith #define __FUNC__ "MatPublish_Base"
835d8aa7fSBarry Smith static int MatPublish_Base(PetscObject obj)
935d8aa7fSBarry Smith {
1035d8aa7fSBarry Smith #if defined(PETSC_HAVE_AMS)
1135d8aa7fSBarry Smith   Mat mat = (Mat)obj;
1235d8aa7fSBarry Smith   int ierr;
1335d8aa7fSBarry Smith #endif
1435d8aa7fSBarry Smith 
1535d8aa7fSBarry Smith   PetscFunctionBegin;
1635d8aa7fSBarry Smith #if defined(PETSC_HAVE_AMS)
1735d8aa7fSBarry Smith   /* if it is already published then return */
1835d8aa7fSBarry Smith   if (mat->amem >=0) PetscFunctionReturn(0);
1935d8aa7fSBarry Smith 
2035d8aa7fSBarry Smith   ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr);
2135d8aa7fSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)mat->amem,"globalsizes",&mat->M,2,AMS_INT,AMS_READ,
2235d8aa7fSBarry Smith                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
2335d8aa7fSBarry Smith   ierr = AMS_Memory_add_field((AMS_Memory)mat->amem,"localsizes",&mat->m,2,AMS_INT,AMS_READ,
2435d8aa7fSBarry Smith                                 AMS_DISTRIBUTED,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
2535d8aa7fSBarry Smith   ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr);
2635d8aa7fSBarry Smith #endif
2735d8aa7fSBarry Smith 
2835d8aa7fSBarry Smith   PetscFunctionReturn(0);
2935d8aa7fSBarry Smith }
3035d8aa7fSBarry Smith 
3135d8aa7fSBarry Smith 
3235d8aa7fSBarry Smith #undef __FUNC__
33*b0a32e0cSBarry Smith #define __FUNC__ "MatCreate"
34325ab940SBarry Smith /*@C
3569dd0797SLois Curfman McInnes    MatCreate - Creates a matrix where the type is determined
3602a82ca1SLois Curfman McInnes    from the options database. Generates a parallel MPI matrix if the
3783e1b59cSLois Curfman McInnes    communicator has more than one processor.  The default matrix type is
3883e1b59cSLois Curfman McInnes    AIJ, using the routines MatCreateSeqAIJ() and MatCreateMPIAIJ().
3983e1b59cSLois Curfman McInnes 
40cb13003dSBarry Smith    Collective on MPI_Comm
41cb13003dSBarry Smith 
427807a1faSBarry Smith    Input Parameters:
4382b900a8SBarry Smith +  m - number of local rows (or PETSC_DECIDE)
4482b900a8SBarry Smith .  n - number of local columns (or PETSC_DECIDE)
4582b900a8SBarry Smith .  M - number of global rows (or PETSC_DETERMINE)
4682b900a8SBarry Smith .  N - number of global columns (or PETSC_DETERMINE)
47cb13003dSBarry Smith -  comm - MPI communicator
487807a1faSBarry Smith 
497807a1faSBarry Smith    Output Parameter:
50dc401e71SLois Curfman McInnes .  A - the matrix
51e0b365e2SLois Curfman McInnes 
52273d9f13SBarry Smith    Options Database Keys:
53273d9f13SBarry Smith +    -mat_type seqaij   - AIJ type, uses MatCreateSeqAIJ()
54273d9f13SBarry Smith .    -mat_type mpiaij   - AIJ type, uses MatCreateMPIAIJ()
55273d9f13SBarry Smith .    -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag()
56273d9f13SBarry Smith .    -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag()
57273d9f13SBarry Smith .    -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs()
58273d9f13SBarry Smith .    -mat_type seqdense - dense type, uses MatCreateSeqDense()
59273d9f13SBarry Smith .    -mat_type mpidense - dense type, uses MatCreateMPIDense()
60273d9f13SBarry Smith .    -mat_type seqbaij  - block AIJ type, uses MatCreateSeqBAIJ()
61273d9f13SBarry Smith -    -mat_type mpibaij  - block AIJ type, uses MatCreateMPIBAIJ()
62e0b365e2SLois Curfman McInnes 
6383e1b59cSLois Curfman McInnes    Even More Options Database Keys:
6483e1b59cSLois Curfman McInnes    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
6583e1b59cSLois Curfman McInnes    for additional format-specific options.
66e0b365e2SLois Curfman McInnes 
67bd9ce289SLois Curfman McInnes    Notes:
68ec6e0d80SSatish Balay    If PETSC_DECIDE is not used for the arguments 'm' and 'n', then the
69ec6e0d80SSatish Balay    user must ensure that they are chosen to be compatible with the
70ec6e0d80SSatish Balay    vectors. To do this, one first considers the matrix-vector product
71ec6e0d80SSatish Balay    'y = A x'. The 'm' that is used in the above routine must match the
72ec6e0d80SSatish Balay    local size used in the vector creation routine VecCreateMPI() for 'y'.
73ec6e0d80SSatish Balay    Likewise, the 'n' used must match that used as the local size in
74ec6e0d80SSatish Balay    VecCreateMPI() for 'x'.
75ec6e0d80SSatish Balay 
76273d9f13SBarry Smith    Level: beginner
77273d9f13SBarry Smith 
78273d9f13SBarry Smith .keywords: matrix, create
79273d9f13SBarry Smith 
80273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
81273d9f13SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
82273d9f13SBarry Smith           MatCreateSeqDense(), MatCreateMPIDense(),
83273d9f13SBarry Smith           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
84273d9f13SBarry Smith           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
85273d9f13SBarry Smith           MatConvert()
86273d9f13SBarry Smith @*/
87273d9f13SBarry Smith int MatCreate(MPI_Comm comm,int m,int n,int M,int N,Mat *A)
88273d9f13SBarry Smith {
89273d9f13SBarry Smith   Mat B;
90273d9f13SBarry Smith 
91273d9f13SBarry Smith   PetscFunctionBegin;
92273d9f13SBarry Smith   PetscHeaderCreate(B,_p_Mat,struct _MatOps,MAT_COOKIE,0,"Mat",comm,MatDestroy,MatView);
93*b0a32e0cSBarry Smith   PetscLogObjectCreate(B);
94273d9f13SBarry Smith 
95273d9f13SBarry Smith   B->m = m;
96273d9f13SBarry Smith   B->n = n;
97273d9f13SBarry Smith   B->M = M;
98273d9f13SBarry Smith   B->N = N;
99273d9f13SBarry Smith 
100273d9f13SBarry Smith   B->preallocated  = PETSC_FALSE;
10135d8aa7fSBarry Smith   B->bops->publish = MatPublish_Base;
102273d9f13SBarry Smith   *A = B;
103273d9f13SBarry Smith   PetscFunctionReturn(0);
104273d9f13SBarry Smith }
105273d9f13SBarry Smith 
106273d9f13SBarry Smith #undef __FUNC__
107*b0a32e0cSBarry Smith #define __FUNC__ "MatSetFromOptions"
108273d9f13SBarry Smith /*@C
109273d9f13SBarry Smith    MatSetFromOptions - Creates a matrix where the type is determined
110273d9f13SBarry Smith    from the options database. Generates a parallel MPI matrix if the
111273d9f13SBarry Smith    communicator has more than one processor.  The default matrix type is
112273d9f13SBarry Smith    AIJ, using the routines MatSetFromOptionsSeqAIJ() and MatSetFromOptionsMPIAIJ().
113273d9f13SBarry Smith 
114273d9f13SBarry Smith    Collective on Mat
115273d9f13SBarry Smith 
116273d9f13SBarry Smith    Input Parameter:
117273d9f13SBarry Smith .  A - the matrix
118273d9f13SBarry Smith 
119273d9f13SBarry Smith    Options Database Keys:
120273d9f13SBarry Smith +    -mat_type seqaij   - AIJ type, uses MatCreateSeqAIJ()
121273d9f13SBarry Smith .    -mat_type mpiaij   - AIJ type, uses MatCreateMPIAIJ()
122273d9f13SBarry Smith .    -mat_type seqbdiag - block diagonal type, uses MatCreateSeqBDiag()
123273d9f13SBarry Smith .    -mat_type mpibdiag - block diagonal type, uses MatCreateMPIBDiag()
124273d9f13SBarry Smith .    -mat_type mpirowbs - rowbs type, uses MatCreateMPIRowbs()
125273d9f13SBarry Smith .    -mat_type seqdense - dense type, uses MatCreateSeqDense()
126273d9f13SBarry Smith .    -mat_type mpidense - dense type, uses MatCreateMPIDense()
127273d9f13SBarry Smith .    -mat_type seqbaij  - block AIJ type, uses MatCreateSeqBAIJ()
128273d9f13SBarry Smith -    -mat_type mpibaij  - block AIJ type, uses MatCreateMPIBAIJ()
129273d9f13SBarry Smith 
130273d9f13SBarry Smith    Even More Options Database Keys:
131273d9f13SBarry Smith    See the manpages for particular formats (e.g., MatCreateSeqAIJ())
132273d9f13SBarry Smith    for additional format-specific options.
133bd9ce289SLois Curfman McInnes 
1341d69843bSLois Curfman McInnes    Level: beginner
1351d69843bSLois Curfman McInnes 
136dc401e71SLois Curfman McInnes .keywords: matrix, create
137e0b365e2SLois Curfman McInnes 
138fafbff53SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
139fafbff53SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
14039ddd567SLois Curfman McInnes           MatCreateSeqDense(), MatCreateMPIDense(),
141a209d233SLois Curfman McInnes           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
142a209d233SLois Curfman McInnes           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
143273d9f13SBarry Smith           MatConvert()
1447807a1faSBarry Smith @*/
145273d9f13SBarry Smith int MatSetFromOptions(Mat B)
1467807a1faSBarry Smith {
147273d9f13SBarry Smith   int        ierr,size;
148273d9f13SBarry Smith   char       mtype[256];
149273d9f13SBarry Smith   PetscTruth flg;
150dbb450caSBarry Smith 
1513a40ed3dSBarry Smith   PetscFunctionBegin;
152*b0a32e0cSBarry Smith   ierr = PetscOptionsGetString(B->prefix,"-mat_type",mtype,256,&flg);CHKERRQ(ierr);
153273d9f13SBarry Smith   if (flg) {
154273d9f13SBarry Smith     ierr = MatSetType(B,mtype);CHKERRQ(ierr);
155273d9f13SBarry Smith   }
156273d9f13SBarry Smith   if (!B->type_name) {
157273d9f13SBarry Smith     ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr);
158273d9f13SBarry Smith     if (size == 1) {
159273d9f13SBarry Smith       ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
160273d9f13SBarry Smith     } else {
161273d9f13SBarry Smith       ierr = MatSetType(B,MATMPIAIJ);CHKERRQ(ierr);
162273d9f13SBarry Smith     }
163dfa27b74SSatish Balay   }
1643a40ed3dSBarry Smith   PetscFunctionReturn(0);
1657807a1faSBarry Smith }
1667807a1faSBarry Smith 
167273d9f13SBarry Smith #undef __FUNC__
168*b0a32e0cSBarry Smith #define __FUNC__ "MatSetUpPreallocation"
169273d9f13SBarry Smith /*@C
170273d9f13SBarry Smith    MatSetUpPreallocation
171dae03382SLois Curfman McInnes 
172273d9f13SBarry Smith    Collective on Mat
173dae03382SLois Curfman McInnes 
174273d9f13SBarry Smith    Input Parameter:
175273d9f13SBarry Smith .  A - the matrix
176d5d45c9bSBarry Smith 
177273d9f13SBarry Smith    Level: beginner
178d5d45c9bSBarry Smith 
179273d9f13SBarry Smith .keywords: matrix, create
180273d9f13SBarry Smith 
181273d9f13SBarry Smith .seealso: MatCreateSeqAIJ((), MatCreateMPIAIJ(),
182273d9f13SBarry Smith           MatCreateSeqBDiag(),MatCreateMPIBDiag(),
183273d9f13SBarry Smith           MatCreateSeqDense(), MatCreateMPIDense(),
184273d9f13SBarry Smith           MatCreateMPIRowbs(), MatCreateSeqBAIJ(), MatCreateMPIBAIJ(),
185273d9f13SBarry Smith           MatCreateSeqSBAIJ(), MatCreateMPISBAIJ(),
186273d9f13SBarry Smith           MatConvert()
187273d9f13SBarry Smith @*/
188273d9f13SBarry Smith int MatSetUpPreallocation(Mat B)
189273d9f13SBarry Smith {
190273d9f13SBarry Smith   int        ierr;
191273d9f13SBarry Smith 
192273d9f13SBarry Smith   PetscFunctionBegin;
193273d9f13SBarry Smith   if (B->ops->setuppreallocation) {
194*b0a32e0cSBarry Smith     PetscLogInfo(B,"MatSetTpPreallocation: Warning not preallocating matrix storage");
195273d9f13SBarry Smith     ierr = (*B->ops->setuppreallocation)(B);CHKERRQ(ierr);
196273d9f13SBarry Smith     B->ops->setuppreallocation = 0;
197273d9f13SBarry Smith     B->preallocated            = PETSC_TRUE;
198273d9f13SBarry Smith   }
199273d9f13SBarry Smith   PetscFunctionReturn(0);
200273d9f13SBarry Smith }
201273d9f13SBarry Smith 
202273d9f13SBarry Smith /*
203273d9f13SBarry Smith         Copies from Cs header to A
204273d9f13SBarry Smith */
205273d9f13SBarry Smith #undef __FUNC__
206*b0a32e0cSBarry Smith #define __FUNC__ "MatHeaderCopy"
207273d9f13SBarry Smith int MatHeaderCopy(Mat A,Mat C)
208273d9f13SBarry Smith {
209273d9f13SBarry Smith   int         ierr,refct;
210273d9f13SBarry Smith   PetscOps    *Abops;
211273d9f13SBarry Smith   MatOps      Aops;
212273d9f13SBarry Smith   char        *mtype,*mname;
213273d9f13SBarry Smith 
214273d9f13SBarry Smith   PetscFunctionBegin;
215273d9f13SBarry Smith   /* free all the interior data structures from mat */
216273d9f13SBarry Smith   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
217273d9f13SBarry Smith 
218273d9f13SBarry Smith   ierr = MapDestroy(A->rmap);CHKERRQ(ierr);
219273d9f13SBarry Smith   ierr = MapDestroy(A->cmap);CHKERRQ(ierr);
220273d9f13SBarry Smith 
221273d9f13SBarry Smith   /* save the parts of A we need */
222273d9f13SBarry Smith   Abops = A->bops;
223273d9f13SBarry Smith   Aops  = A->ops;
224273d9f13SBarry Smith   refct = A->refct;
225273d9f13SBarry Smith   mtype = A->type_name;
226273d9f13SBarry Smith   mname = A->name;
227273d9f13SBarry Smith 
228273d9f13SBarry Smith   /* copy C over to A */
229273d9f13SBarry Smith   ierr  = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr);
230273d9f13SBarry Smith 
231273d9f13SBarry Smith   /* return the parts of A we saved */
232273d9f13SBarry Smith   A->bops      = Abops;
233273d9f13SBarry Smith   A->ops       = Aops;
234273d9f13SBarry Smith   A->qlist     = 0;
235273d9f13SBarry Smith   A->refct     = refct;
236273d9f13SBarry Smith   A->type_name = mtype;
237273d9f13SBarry Smith   A->name      = mname;
238273d9f13SBarry Smith 
239273d9f13SBarry Smith   PetscHeaderDestroy(C);
240273d9f13SBarry Smith   PetscFunctionReturn(0);
241273d9f13SBarry Smith }
242