xref: /petsc/src/mat/impls/sbaij/seq/aijsbaij.c (revision a0e1a40435764602cf708e722792c63bbf788524)
159557b74SHong Zhang /*$Id: aijsbaij.c,v 1.9 2001/08/07 03:02:55 balay Exp $*/
259557b74SHong Zhang 
359557b74SHong Zhang #include "src/mat/impls/aij/seq/aij.h"
4861ba921SHong Zhang #include "src/mat/impls/sbaij/seq/sbaij.h"
559557b74SHong Zhang 
659557b74SHong Zhang EXTERN_C_BEGIN
759557b74SHong Zhang #undef __FUNCT__
84e5e7fe4SHong Zhang #define __FUNCT__ "MatConvert_SeqSBAI_SeqAIJ"
94e5e7fe4SHong Zhang int MatConvert_SeqSBAIJ_SeqAIJ(Mat A,const MatType newtype,Mat *newmat)
104e5e7fe4SHong Zhang {
114e5e7fe4SHong Zhang   Mat          B;
124e5e7fe4SHong Zhang   Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data;
134e5e7fe4SHong Zhang   Mat_SeqAIJ   *b;
14a7a3a9ebSHong Zhang   int          ierr,*ai=a->i,*aj=a->j,m=A->m,n=A->n,i,j,k,*bi,*bj,
15a7a3a9ebSHong Zhang                *rowlengths,nz,*rowstart,itmp;
16a7a3a9ebSHong Zhang   int          bs=a->bs,bs2=bs*bs,mbs=A->m/bs;
174e5e7fe4SHong Zhang   PetscScalar  *av,*bv;
184e5e7fe4SHong Zhang 
194e5e7fe4SHong Zhang   PetscFunctionBegin;
20a7a3a9ebSHong Zhang 
214e5e7fe4SHong Zhang   /* compute rowlengths of newmat */
22a7a3a9ebSHong Zhang   ierr = PetscMalloc((2*m+1)*sizeof(int),&rowlengths);CHKERRQ(ierr);
23a7a3a9ebSHong Zhang   rowstart = rowlengths + m;
24a7a3a9ebSHong Zhang 
25a7a3a9ebSHong Zhang   for (i=0; i<mbs; i++) rowlengths[i*bs] = 0;
264e5e7fe4SHong Zhang   aj = a->j;
27a7a3a9ebSHong Zhang   k = 0;
28a7a3a9ebSHong Zhang   for (i=0; i<mbs; i++) {
294e5e7fe4SHong Zhang     nz = ai[i+1] - ai[i];
30a7a3a9ebSHong Zhang     aj++; /* skip diagonal */
31a7a3a9ebSHong Zhang     for (j=1; j<nz; j++) { /* no. of lower triangular blocks */
32a7a3a9ebSHong Zhang       rowlengths[(*aj)*bs]++; aj++;
33a7a3a9ebSHong Zhang     }
34a7a3a9ebSHong Zhang     rowlengths[k] += nz;   /* no. of upper triangular blocks */
35a7a3a9ebSHong Zhang     rowlengths[k] *= bs;
36a7a3a9ebSHong Zhang     for (j=1; j<bs; j++) {
37a7a3a9ebSHong Zhang       rowlengths[k+j] = rowlengths[k];
38a7a3a9ebSHong Zhang     }
39a7a3a9ebSHong Zhang     k += bs;
40a7a3a9ebSHong Zhang     /* printf(" rowlengths[%d]: %d\n",i, rowlengths[i]); */
414e5e7fe4SHong Zhang   }
424e5e7fe4SHong Zhang 
43a7a3a9ebSHong Zhang   ierr = MatCreateSeqAIJ(PETSC_COMM_SELF,m,n,0,rowlengths,&B);CHKERRQ(ierr);
44a7a3a9ebSHong Zhang   ierr = MatSetOption(B,MAT_COLUMN_ORIENTED);CHKERRQ(ierr);
454e5e7fe4SHong Zhang   ierr = MatSetOption(B,MAT_ROWS_SORTED);CHKERRQ(ierr);
464e5e7fe4SHong Zhang   ierr = MatSetOption(B,MAT_COLUMNS_SORTED);CHKERRQ(ierr);
474e5e7fe4SHong Zhang 
484e5e7fe4SHong Zhang   b  = (Mat_SeqAIJ*)(B->data);
494e5e7fe4SHong Zhang   bi = b->i;
504e5e7fe4SHong Zhang   bj = b->j;
514e5e7fe4SHong Zhang   bv = b->a;
524e5e7fe4SHong Zhang 
534e5e7fe4SHong Zhang   /* set b->i */
54a7a3a9ebSHong Zhang   bi[0] = 0; rowstart[0] = 0;
55a7a3a9ebSHong Zhang   for (i=0; i<mbs; i++){
56a7a3a9ebSHong Zhang     for (j=0; j<bs; j++){
57a7a3a9ebSHong Zhang       b->ilen[i*bs+j]  = rowlengths[i*bs];
58a7a3a9ebSHong Zhang       rowstart[i*bs+j+1] = rowstart[i*bs+j] + rowlengths[i*bs];
594e5e7fe4SHong Zhang     }
60a7a3a9ebSHong Zhang     bi[i+1]     = bi[i] + rowlengths[i*bs]/bs;
61a7a3a9ebSHong Zhang   }
62a7a3a9ebSHong Zhang   if (bi[mbs] != 2*a->nz - mbs) SETERRQ2(1,"bi[mbs]: %d != 2*a->nz-mbs: %d\n",bi[mbs],2*a->nz - mbs);
634e5e7fe4SHong Zhang 
644e5e7fe4SHong Zhang   /* set b->j and b->a */
654e5e7fe4SHong Zhang   aj = a->j; av = a->a;
66a7a3a9ebSHong Zhang   for (i=0; i<mbs; i++) {
67a7a3a9ebSHong Zhang     /* diagonal block */
68a7a3a9ebSHong Zhang     for (j=0; j<bs; j++){   /* row i*bs+j */
69a7a3a9ebSHong Zhang       itmp = i*bs+j;
70a7a3a9ebSHong Zhang       for (k=0; k<bs; k++){ /* col i*bs+k */
71a7a3a9ebSHong Zhang         *(bj + rowstart[itmp]) = (*aj)*bs+k;
72a7a3a9ebSHong Zhang         *(bv + rowstart[itmp]) = *(av+k*bs+j);
73a7a3a9ebSHong Zhang         rowstart[itmp]++;
74a7a3a9ebSHong Zhang       }
75a7a3a9ebSHong Zhang     }
76a7a3a9ebSHong Zhang     aj++; av += bs2;
77a7a3a9ebSHong Zhang 
784e5e7fe4SHong Zhang     nz = ai[i+1] - ai[i] -1;
794e5e7fe4SHong Zhang     while (nz--){
80a7a3a9ebSHong Zhang       /* lower triangular blocks */
81a7a3a9ebSHong Zhang       for (j=0; j<bs; j++){   /* row (*aj)*bs+j */
82a7a3a9ebSHong Zhang         itmp = (*aj)*bs+j;
83a7a3a9ebSHong Zhang         for (k=0; k<bs; k++){ /* col i*bs+k */
84a7a3a9ebSHong Zhang           *(bj + rowstart[itmp]) = i*bs+k;
85a7a3a9ebSHong Zhang           *(bv + rowstart[itmp]) = *(av+k*bs+j);
86a7a3a9ebSHong Zhang           rowstart[itmp]++;
87a7a3a9ebSHong Zhang         }
88a7a3a9ebSHong Zhang       }
89a7a3a9ebSHong Zhang       /* upper triangular blocks */
90a7a3a9ebSHong Zhang       for (j=0; j<bs; j++){   /* row i*bs+j */
91a7a3a9ebSHong Zhang         itmp = i*bs+j;
92a7a3a9ebSHong Zhang         for (k=0; k<bs; k++){ /* col (*aj)*bs+k */
93a7a3a9ebSHong Zhang           *(bj + rowstart[itmp]) = (*aj)*bs+k;
94a7a3a9ebSHong Zhang           *(bv + rowstart[itmp]) = *(av+k*bs+j);
95a7a3a9ebSHong Zhang           rowstart[itmp]++;
96a7a3a9ebSHong Zhang         }
97a7a3a9ebSHong Zhang       }
98a7a3a9ebSHong Zhang       aj++; av += bs2;
994e5e7fe4SHong Zhang     }
1004e5e7fe4SHong Zhang   }
1014e5e7fe4SHong Zhang   ierr = PetscFree(rowlengths);CHKERRQ(ierr);
1024e5e7fe4SHong Zhang   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1034e5e7fe4SHong Zhang   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1044e5e7fe4SHong Zhang 
1054e5e7fe4SHong Zhang   /* Fake support for "inplace" convert. */
1064e5e7fe4SHong Zhang   if (*newmat == A) {
1074e5e7fe4SHong Zhang     ierr = MatDestroy(A);CHKERRQ(ierr);
1084e5e7fe4SHong Zhang   }
1094e5e7fe4SHong Zhang   *newmat = B;
1104e5e7fe4SHong Zhang   PetscFunctionReturn(0);
1114e5e7fe4SHong Zhang }
1124e5e7fe4SHong Zhang #undef __FUNCT__
11359557b74SHong Zhang #define __FUNCT__ "MatConvert_SeqAIJ_SeqSBAIJ"
1148e9aea5cSBarry Smith int MatConvert_SeqAIJ_SeqSBAIJ(Mat A,const MatType newtype,Mat *newmat) {
115676c34cdSKris Buschelman   Mat          B;
11659557b74SHong Zhang   Mat_SeqAIJ   *a = (Mat_SeqAIJ*)A->data;
117861ba921SHong Zhang   Mat_SeqSBAIJ *b;
118861ba921SHong Zhang   int          ierr,*ai=a->i,*aj,m=A->M,n=A->N,i,j,
1192d9a3abdSHong Zhang                *bi,*bj,*rowlengths;
120861ba921SHong Zhang   PetscScalar  *av,*bv;
12159557b74SHong Zhang 
12259557b74SHong Zhang   PetscFunctionBegin;
1232d9a3abdSHong Zhang   if (n != m) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square");
12459557b74SHong Zhang   if (!a->diag){
12559557b74SHong Zhang     ierr = MatMarkDiagonal_SeqAIJ(A);CHKERRQ(ierr);
12659557b74SHong Zhang   }
12759557b74SHong Zhang 
12859557b74SHong Zhang   ierr = PetscMalloc(m*sizeof(int),&rowlengths);CHKERRQ(ierr);
12959557b74SHong Zhang   for (i=0; i<m; i++) {
13059557b74SHong Zhang     rowlengths[i] = ai[i+1] - a->diag[i];
13159557b74SHong Zhang   }
132676c34cdSKris Buschelman   ierr = MatCreateSeqSBAIJ(PETSC_COMM_SELF,1,m,n,0,rowlengths,&B);CHKERRQ(ierr);
13359557b74SHong Zhang 
134676c34cdSKris Buschelman   ierr = MatSetOption(B,MAT_ROW_ORIENTED);CHKERRQ(ierr);
135676c34cdSKris Buschelman   ierr = MatSetOption(B,MAT_ROWS_SORTED);CHKERRQ(ierr);
136676c34cdSKris Buschelman   ierr = MatSetOption(B,MAT_COLUMNS_SORTED);CHKERRQ(ierr);
13759557b74SHong Zhang 
138676c34cdSKris Buschelman   b  = (Mat_SeqSBAIJ*)(B->data);
139861ba921SHong Zhang   bi = b->i;
140861ba921SHong Zhang   bj = b->j;
141861ba921SHong Zhang   bv = b->a;
142861ba921SHong Zhang 
143861ba921SHong Zhang   bi[0] = 0;
14459557b74SHong Zhang   for (i=0; i<m; i++) {
14559557b74SHong Zhang     aj = a->j + a->diag[i];
14659557b74SHong Zhang     av = a->a + a->diag[i];
147861ba921SHong Zhang     for (j=0; j<rowlengths[i]; j++){
148861ba921SHong Zhang       *bj = *aj; bj++; aj++;
149861ba921SHong Zhang       *bv = *av; bv++; av++;
150861ba921SHong Zhang     }
151861ba921SHong Zhang     bi[i+1]    = bi[i] + rowlengths[i];
152861ba921SHong Zhang     b->ilen[i] = rowlengths[i];
15359557b74SHong Zhang   }
15459557b74SHong Zhang 
15559557b74SHong Zhang   ierr = PetscFree(rowlengths);CHKERRQ(ierr);
156676c34cdSKris Buschelman   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
157676c34cdSKris Buschelman   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
158676c34cdSKris Buschelman 
159676c34cdSKris Buschelman   /* Fake support for "inplace" convert. */
160676c34cdSKris Buschelman   if (*newmat == A) {
161676c34cdSKris Buschelman     ierr = MatDestroy(A);CHKERRQ(ierr);
162676c34cdSKris Buschelman   }
163676c34cdSKris Buschelman   *newmat = B;
164676c34cdSKris Buschelman 
16559557b74SHong Zhang   PetscFunctionReturn(0);
16659557b74SHong Zhang }
16759557b74SHong Zhang EXTERN_C_END
16859557b74SHong Zhang 
169*a0e1a404SHong Zhang #include "src/mat/impls/baij/seq/baij.h"
170*a0e1a404SHong Zhang EXTERN_C_BEGIN
171*a0e1a404SHong Zhang #undef __FUNCT__
172*a0e1a404SHong Zhang #define __FUNCT__ "MatConvert_SeqSBAI_SeqBAIJ"
173*a0e1a404SHong Zhang int MatConvert_SeqSBAIJ_SeqBAIJ(Mat A,const MatType newtype,Mat *newmat)
174*a0e1a404SHong Zhang {
175*a0e1a404SHong Zhang   Mat          B;
176*a0e1a404SHong Zhang   Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data;
177*a0e1a404SHong Zhang   Mat_SeqBAIJ  *b;
178*a0e1a404SHong Zhang   int          ierr,*ai=a->i,*aj=a->j,m=A->m,n=A->n,i,k,*bi,*bj,
179*a0e1a404SHong Zhang                *browlengths,nz,*browstart,itmp;
180*a0e1a404SHong Zhang   int          bs=a->bs,bs2=bs*bs,mbs=m/bs;
181*a0e1a404SHong Zhang   PetscScalar  *av,*bv;
182*a0e1a404SHong Zhang 
183*a0e1a404SHong Zhang   PetscFunctionBegin;
184*a0e1a404SHong Zhang   /* compute browlengths of newmat */
185*a0e1a404SHong Zhang   ierr = PetscMalloc(2*mbs*sizeof(int),&browlengths);CHKERRQ(ierr);
186*a0e1a404SHong Zhang   browstart = browlengths + mbs;
187*a0e1a404SHong Zhang   for (i=0; i<mbs; i++) browlengths[i] = 0;
188*a0e1a404SHong Zhang   aj = a->j;
189*a0e1a404SHong Zhang   for (i=0; i<mbs; i++) {
190*a0e1a404SHong Zhang     nz = ai[i+1] - ai[i];
191*a0e1a404SHong Zhang     aj++; /* skip diagonal */
192*a0e1a404SHong Zhang     for (k=1; k<nz; k++) { /* no. of lower triangular blocks */
193*a0e1a404SHong Zhang       browlengths[*aj]++; aj++;
194*a0e1a404SHong Zhang     }
195*a0e1a404SHong Zhang     browlengths[i] += nz;   /* no. of upper triangular blocks */
196*a0e1a404SHong Zhang   }
197*a0e1a404SHong Zhang 
198*a0e1a404SHong Zhang   ierr = MatCreateSeqBAIJ(PETSC_COMM_SELF,bs,m,n,0,browlengths,&B);CHKERRQ(ierr);
199*a0e1a404SHong Zhang   ierr = MatSetOption(B,MAT_ROW_ORIENTED);CHKERRQ(ierr);
200*a0e1a404SHong Zhang   ierr = MatSetOption(B,MAT_ROWS_SORTED);CHKERRQ(ierr);
201*a0e1a404SHong Zhang   ierr = MatSetOption(B,MAT_COLUMNS_SORTED);CHKERRQ(ierr);
202*a0e1a404SHong Zhang 
203*a0e1a404SHong Zhang   b  = (Mat_SeqBAIJ*)(B->data);
204*a0e1a404SHong Zhang   bi = b->i;
205*a0e1a404SHong Zhang   bj = b->j;
206*a0e1a404SHong Zhang   bv = b->a;
207*a0e1a404SHong Zhang 
208*a0e1a404SHong Zhang   /* set b->i */
209*a0e1a404SHong Zhang   bi[0] = 0;
210*a0e1a404SHong Zhang   for (i=0; i<mbs; i++){
211*a0e1a404SHong Zhang     b->ilen[i]    = browlengths[i];
212*a0e1a404SHong Zhang     bi[i+1]       = bi[i] + browlengths[i];
213*a0e1a404SHong Zhang     browstart[i]  = bi[i];
214*a0e1a404SHong Zhang   }
215*a0e1a404SHong Zhang   if (bi[mbs] != 2*a->nz - mbs) SETERRQ2(1,"bi[mbs]: %d != 2*a->nz - mbs: %d\n",bi[mbs],2*a->nz - mbs);
216*a0e1a404SHong Zhang 
217*a0e1a404SHong Zhang   /* set b->j and b->a */
218*a0e1a404SHong Zhang   aj = a->j; av = a->a;
219*a0e1a404SHong Zhang   for (i=0; i<mbs; i++) {
220*a0e1a404SHong Zhang     /* diagonal block */
221*a0e1a404SHong Zhang     *(bj + browstart[i]) = *aj; aj++;
222*a0e1a404SHong Zhang     itmp = bs2*browstart[i];
223*a0e1a404SHong Zhang     for (k=0; k<bs2; k++){
224*a0e1a404SHong Zhang       *(bv + itmp + k) = *av; av++;
225*a0e1a404SHong Zhang     }
226*a0e1a404SHong Zhang     browstart[i]++;
227*a0e1a404SHong Zhang 
228*a0e1a404SHong Zhang     nz = ai[i+1] - ai[i] -1;
229*a0e1a404SHong Zhang     while (nz--){
230*a0e1a404SHong Zhang       /* lower triangular blocks */
231*a0e1a404SHong Zhang       *(bj + browstart[*aj]) = i;
232*a0e1a404SHong Zhang       itmp = bs2*browstart[*aj];
233*a0e1a404SHong Zhang       for (k=0; k<bs2; k++){
234*a0e1a404SHong Zhang         *(bv + itmp + k) = *(av + k);
235*a0e1a404SHong Zhang       }
236*a0e1a404SHong Zhang       browstart[*aj]++;
237*a0e1a404SHong Zhang 
238*a0e1a404SHong Zhang       /* upper triangular blocks */
239*a0e1a404SHong Zhang       *(bj + browstart[i]) = *aj; aj++;
240*a0e1a404SHong Zhang       itmp = bs2*browstart[i];
241*a0e1a404SHong Zhang       for (k=0; k<bs2; k++){
242*a0e1a404SHong Zhang         *(bv + itmp + k) = *av; av++;
243*a0e1a404SHong Zhang       }
244*a0e1a404SHong Zhang       browstart[i]++;
245*a0e1a404SHong Zhang     }
246*a0e1a404SHong Zhang   }
247*a0e1a404SHong Zhang   ierr = PetscFree(browlengths);CHKERRQ(ierr);
248*a0e1a404SHong Zhang   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
249*a0e1a404SHong Zhang   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
250*a0e1a404SHong Zhang 
251*a0e1a404SHong Zhang   /* Fake support for "inplace" convert. */
252*a0e1a404SHong Zhang   if (*newmat == A) {
253*a0e1a404SHong Zhang     ierr = MatDestroy(A);CHKERRQ(ierr);
254*a0e1a404SHong Zhang   }
255*a0e1a404SHong Zhang   *newmat = B;
256*a0e1a404SHong Zhang   PetscFunctionReturn(0);
257*a0e1a404SHong Zhang }
258*a0e1a404SHong Zhang #undef __FUNCT__
259*a0e1a404SHong Zhang #define __FUNCT__ "MatConvert_SeqBAIJ_SeqSBAIJ"
260*a0e1a404SHong Zhang int MatConvert_SeqBAIJ_SeqSBAIJ(Mat A,const MatType newtype,Mat *newmat)
261*a0e1a404SHong Zhang {
262*a0e1a404SHong Zhang   Mat          B;
263*a0e1a404SHong Zhang   Mat_SeqBAIJ  *a = (Mat_SeqBAIJ*)A->data;
264*a0e1a404SHong Zhang   Mat_SeqSBAIJ *b;
265*a0e1a404SHong Zhang   int          ierr,*ai=a->i,*aj,m=A->m,n=A->n,i,j,k,
266*a0e1a404SHong Zhang                *bi,*bj,*browlengths;
267*a0e1a404SHong Zhang   int          bs=a->bs,bs2=bs*bs,mbs=m/bs;
268*a0e1a404SHong Zhang   PetscScalar  *av,*bv;
269*a0e1a404SHong Zhang 
270*a0e1a404SHong Zhang   PetscFunctionBegin;
271*a0e1a404SHong Zhang   if (n != m) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square");
272*a0e1a404SHong Zhang   if (!a->diag){
273*a0e1a404SHong Zhang     ierr = MatMarkDiagonal_SeqBAIJ(A);CHKERRQ(ierr);
274*a0e1a404SHong Zhang   }
275*a0e1a404SHong Zhang 
276*a0e1a404SHong Zhang   ierr = PetscMalloc(mbs*sizeof(int),&browlengths);CHKERRQ(ierr);
277*a0e1a404SHong Zhang   for (i=0; i<mbs; i++) {
278*a0e1a404SHong Zhang     browlengths[i] = ai[i+1] - a->diag[i];
279*a0e1a404SHong Zhang   }
280*a0e1a404SHong Zhang 
281*a0e1a404SHong Zhang   ierr = MatCreateSeqSBAIJ(PETSC_COMM_SELF,bs,m,n,PETSC_NULL,browlengths,&B);CHKERRQ(ierr);
282*a0e1a404SHong Zhang   ierr = MatSetOption(B,MAT_ROW_ORIENTED);CHKERRQ(ierr);
283*a0e1a404SHong Zhang   ierr = MatSetOption(B,MAT_ROWS_SORTED);CHKERRQ(ierr);
284*a0e1a404SHong Zhang   ierr = MatSetOption(B,MAT_COLUMNS_SORTED);CHKERRQ(ierr);
285*a0e1a404SHong Zhang 
286*a0e1a404SHong Zhang   b  = (Mat_SeqSBAIJ*)(B->data);
287*a0e1a404SHong Zhang   bi = b->i;
288*a0e1a404SHong Zhang   bj = b->j;
289*a0e1a404SHong Zhang   bv = b->a;
290*a0e1a404SHong Zhang 
291*a0e1a404SHong Zhang   bi[0] = 0;
292*a0e1a404SHong Zhang   for (i=0; i<mbs; i++) {
293*a0e1a404SHong Zhang     aj = a->j + a->diag[i];
294*a0e1a404SHong Zhang     av = a->a + (a->diag[i])*bs2;
295*a0e1a404SHong Zhang     for (j=0; j<browlengths[i]; j++){
296*a0e1a404SHong Zhang       *bj = *aj; bj++; aj++;
297*a0e1a404SHong Zhang       for (k=0; k<bs2; k++){
298*a0e1a404SHong Zhang         *bv = *av; bv++; av++;
299*a0e1a404SHong Zhang       }
300*a0e1a404SHong Zhang     }
301*a0e1a404SHong Zhang     bi[i+1]    = bi[i] + browlengths[i];
302*a0e1a404SHong Zhang     b->ilen[i] = browlengths[i];
303*a0e1a404SHong Zhang   }
304*a0e1a404SHong Zhang   ierr = PetscFree(browlengths);CHKERRQ(ierr);
305*a0e1a404SHong Zhang   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
306*a0e1a404SHong Zhang   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
307*a0e1a404SHong Zhang 
308*a0e1a404SHong Zhang   /* Fake support for "inplace" convert. */
309*a0e1a404SHong Zhang   if (*newmat == A) {
310*a0e1a404SHong Zhang     ierr = MatDestroy(A);CHKERRQ(ierr);
311*a0e1a404SHong Zhang   }
312*a0e1a404SHong Zhang   *newmat = B;
313*a0e1a404SHong Zhang 
314*a0e1a404SHong Zhang   PetscFunctionReturn(0);
315*a0e1a404SHong Zhang }
316*a0e1a404SHong Zhang EXTERN_C_END
317