xref: /petsc/src/mat/impls/maij/maij.c (revision f4a530596e3989b0ece84d80924e46979244b6b4)
1*f4a53059SBarry Smith /*$Id: maij.c,v 1.4 2000/06/01 20:10:27 bsmith Exp bsmith $*/
282b1193eSBarry Smith /*
3cd3bbe55SBarry Smith     Defines the basic matrix operations for the MAIJ  matrix storage format.
4cd3bbe55SBarry Smith   This format is used for restriction and interpolation operations for
5cd3bbe55SBarry Smith   multicomponent problems. It interpolates each component the same way
6cd3bbe55SBarry Smith   independently.
7cd3bbe55SBarry Smith 
8cd3bbe55SBarry Smith      We provide:
9cd3bbe55SBarry Smith          MatMult()
10cd3bbe55SBarry Smith          MatMultTranspose()
11cd3bbe55SBarry Smith          MatMultTransposeAdd()
12cd3bbe55SBarry Smith          MatMultAdd()
13cd3bbe55SBarry Smith           and
14cd3bbe55SBarry Smith          MatCreateMAIJ(Mat,dof,Mat*)
15*f4a53059SBarry Smith 
16*f4a53059SBarry Smith      This single directory handles both the sequential and parallel codes
1782b1193eSBarry Smith */
1882b1193eSBarry Smith 
19*f4a53059SBarry Smith #include "src/mat/impls/aij/mpi/mpiaij.h"
2082b1193eSBarry Smith 
21cd3bbe55SBarry Smith typedef struct {
22cd3bbe55SBarry Smith   int        dof;         /* number of components */
23*f4a53059SBarry Smith   Mat        AIJ,OAIJ;    /* representation of interpolation for one component */
24*f4a53059SBarry Smith   VecScatter ctx;         /* update ghost points for parallel case */
25*f4a53059SBarry Smith   Vec        w;           /* work space for ghost values for parallel case */
26*f4a53059SBarry Smith } Mat_MAIJ;
2782b1193eSBarry Smith 
2882b1193eSBarry Smith #undef __FUNC__
29*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatDestroy_MAIJ"></a>*/"MatDestroy_MAIJ"
30*f4a53059SBarry Smith int MatDestroy_MAIJ(Mat A)
3182b1193eSBarry Smith {
3282b1193eSBarry Smith   int      ierr;
33*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
3482b1193eSBarry Smith 
3582b1193eSBarry Smith   PetscFunctionBegin;
36cd3bbe55SBarry Smith   if (b->AIJ) {
37cd3bbe55SBarry Smith     ierr = MatDestroy(b->AIJ);CHKERRQ(ierr);
3882b1193eSBarry Smith   }
39*f4a53059SBarry Smith   if (b->OAIJ) {
40*f4a53059SBarry Smith     ierr = MatDestroy(b->OAIJ);CHKERRQ(ierr);
41*f4a53059SBarry Smith   }
42*f4a53059SBarry Smith   if (b->ctx) {
43*f4a53059SBarry Smith     ierr = VecScatterDestroy(b->ctx);CHKERRQ(ierr);
44*f4a53059SBarry Smith   }
45*f4a53059SBarry Smith   if (b->w) {
46*f4a53059SBarry Smith     ierr = VecDestroy(b->w);CHKERRQ(ierr);
47*f4a53059SBarry Smith   }
48cd3bbe55SBarry Smith   ierr = PetscFree(b);CHKERRQ(ierr);
4982b1193eSBarry Smith   PetscHeaderDestroy(A);
5082b1193eSBarry Smith   PetscFunctionReturn(0);
5182b1193eSBarry Smith }
5282b1193eSBarry Smith 
5382b1193eSBarry Smith EXTERN_C_BEGIN
5482b1193eSBarry Smith #undef __FUNC__
55*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatCreate_MAIJ"></a>*/"MatCreate_MAIJ"
56*f4a53059SBarry Smith int MatCreate_MAIJ(Mat A)
5782b1193eSBarry Smith {
58cd3bbe55SBarry Smith   int      ierr;
59*f4a53059SBarry Smith   Mat_MAIJ *b;
6082b1193eSBarry Smith 
6182b1193eSBarry Smith   PetscFunctionBegin;
62*f4a53059SBarry Smith   A->data             = (void*)(b = PetscNew(Mat_MAIJ));CHKPTRQ(b);
63*f4a53059SBarry Smith   ierr = PetscMemzero(b,sizeof(Mat_MAIJ));CHKERRQ(ierr);
64cd3bbe55SBarry Smith   ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr);
65cd3bbe55SBarry Smith   A->factor           = 0;
66cd3bbe55SBarry Smith   A->mapping          = 0;
67*f4a53059SBarry Smith 
68cd3bbe55SBarry Smith   b->AIJ  = 0;
69cd3bbe55SBarry Smith   b->dof  = 0;
70*f4a53059SBarry Smith   b->OAIJ = 0;
71*f4a53059SBarry Smith   b->ctx  = 0;
72*f4a53059SBarry Smith   b->w    = 0;
7382b1193eSBarry Smith   PetscFunctionReturn(0);
7482b1193eSBarry Smith }
7582b1193eSBarry Smith EXTERN_C_END
7682b1193eSBarry Smith 
77bcc973b7SBarry Smith /* ----------------------------------------------------------------------------------*/
78cd3bbe55SBarry Smith EXTERN int MatMult_SeqAIJ(Mat,Vec,Vec);
79*f4a53059SBarry Smith EXTERN int MatMultAdd_SeqAIJ(Mat,Vec,Vec,Vec);
80cd3bbe55SBarry Smith EXTERN int MatMultTranspose_SeqAIJ(Mat,Vec,Vec);
81cd3bbe55SBarry Smith EXTERN int MatMultTransposeAdd_SeqAIJ(Mat,Vec,Vec,Vec);
82cd3bbe55SBarry Smith 
8382b1193eSBarry Smith #undef __FUNC__
84cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_1"></a>*/"MatMult_SeqMAIJ_1"
85cd3bbe55SBarry Smith int MatMult_SeqMAIJ_1(Mat A,Vec xx,Vec yy)
8682b1193eSBarry Smith {
87*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
88cd3bbe55SBarry Smith   int      ierr;
8982b1193eSBarry Smith   PetscFunctionBegin;
90cd3bbe55SBarry Smith   ierr = MatMult_SeqAIJ(b->AIJ,xx,yy);
91cd3bbe55SBarry Smith   PetscFunctionReturn(0);
9282b1193eSBarry Smith }
93cd3bbe55SBarry Smith #undef __FUNC__
94cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_1"></a>*/"MatMultTranspose_SeqMAIJ_1"
95cd3bbe55SBarry Smith int MatMultTranspose_SeqMAIJ_1(Mat A,Vec xx,Vec yy)
96cd3bbe55SBarry Smith {
97*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
98cd3bbe55SBarry Smith   int      ierr;
99cd3bbe55SBarry Smith   PetscFunctionBegin;
100cd3bbe55SBarry Smith   ierr = MatMultTranspose_SeqAIJ(b->AIJ,xx,yy);
101cd3bbe55SBarry Smith   PetscFunctionReturn(0);
102cd3bbe55SBarry Smith }
103cd3bbe55SBarry Smith #undef __FUNC__
104cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_1"></a>*/"MatMultAdd_SeqMAIJ_1"
105cd3bbe55SBarry Smith int MatMultAdd_SeqMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz)
106cd3bbe55SBarry Smith {
107*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
108cd3bbe55SBarry Smith   int      ierr;
109cd3bbe55SBarry Smith   PetscFunctionBegin;
110cd3bbe55SBarry Smith   ierr = MatMultAdd_SeqAIJ(b->AIJ,xx,yy,zz);
111cd3bbe55SBarry Smith   PetscFunctionReturn(0);
112cd3bbe55SBarry Smith }
113cd3bbe55SBarry Smith #undef __FUNC__
114cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_1"></a>*/"MatMultTransposeAdd_SeqMAIJ_1"
115cd3bbe55SBarry Smith int MatMultTransposeAdd_SeqMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz)
116cd3bbe55SBarry Smith {
117*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
118cd3bbe55SBarry Smith   int      ierr;
119cd3bbe55SBarry Smith   PetscFunctionBegin;
120cd3bbe55SBarry Smith   ierr = MatMultTransposeAdd_SeqAIJ(b->AIJ,xx,yy,zz);
12182b1193eSBarry Smith   PetscFunctionReturn(0);
12282b1193eSBarry Smith }
12382b1193eSBarry Smith 
124cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/
12582b1193eSBarry Smith #undef __FUNC__
126cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_2"></a>*/"MatMult_SeqMAIJ_2"
127cd3bbe55SBarry Smith int MatMult_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
12882b1193eSBarry Smith {
129*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
130bcc973b7SBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
131bcc973b7SBarry Smith   Scalar      *x,*y,*v,sum1, sum2;
132bcc973b7SBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
133bcc973b7SBarry Smith   int         n,i,jrow,j;
13482b1193eSBarry Smith 
135bcc973b7SBarry Smith   PetscFunctionBegin;
136bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
137bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
138bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
139bcc973b7SBarry Smith   idx  = a->j;
140bcc973b7SBarry Smith   v    = a->a;
141bcc973b7SBarry Smith   ii   = a->i;
142bcc973b7SBarry Smith 
143bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
144bcc973b7SBarry Smith   idx  += shift;
145bcc973b7SBarry Smith   for (i=0; i<m; i++) {
146bcc973b7SBarry Smith     jrow = ii[i];
147bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
148bcc973b7SBarry Smith     sum1  = 0.0;
149bcc973b7SBarry Smith     sum2  = 0.0;
150bcc973b7SBarry Smith     for (j=0; j<n; j++) {
151bcc973b7SBarry Smith       sum1 += v[jrow]*x[2*idx[jrow]];
152bcc973b7SBarry Smith       sum2 += v[jrow]*x[2*idx[jrow]+1];
153bcc973b7SBarry Smith       jrow++;
154bcc973b7SBarry Smith      }
155bcc973b7SBarry Smith     y[2*i]   = sum1;
156bcc973b7SBarry Smith     y[2*i+1] = sum2;
157bcc973b7SBarry Smith   }
158bcc973b7SBarry Smith 
159bcc973b7SBarry Smith   PLogFlops(4*a->nz - 2*m);
160bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
161bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
16282b1193eSBarry Smith   PetscFunctionReturn(0);
16382b1193eSBarry Smith }
164bcc973b7SBarry Smith 
16582b1193eSBarry Smith #undef __FUNC__
166cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_2"></a>*/"MatMultTranspose_SeqMAIJ_2"
167cd3bbe55SBarry Smith int MatMultTranspose_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
16882b1193eSBarry Smith {
169*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
170bcc973b7SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
171bcc973b7SBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,zero = 0.0;
172bcc973b7SBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
17382b1193eSBarry Smith 
174bcc973b7SBarry Smith   PetscFunctionBegin;
175bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
176bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
177bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
178bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
179bcc973b7SBarry Smith   for (i=0; i<m; i++) {
180bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
181bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
182bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
183bcc973b7SBarry Smith     alpha1 = x[2*i];
184bcc973b7SBarry Smith     alpha2 = x[2*i+1];
185bcc973b7SBarry Smith     while (n-->0) {y[2*(*idx)] += alpha1*(*v); y[2*(*idx)+1] += alpha2*(*v); idx++; v++;}
186bcc973b7SBarry Smith   }
187bcc973b7SBarry Smith   PLogFlops(4*a->nz - 2*a->n);
188bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
189bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
19082b1193eSBarry Smith   PetscFunctionReturn(0);
19182b1193eSBarry Smith }
192bcc973b7SBarry Smith 
19382b1193eSBarry Smith #undef __FUNC__
194cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_2"></a>*/"MatMultAdd_SeqMAIJ_2"
195cd3bbe55SBarry Smith int MatMultAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
19682b1193eSBarry Smith {
197*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
198bcc973b7SBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
199bcc973b7SBarry Smith   Scalar      *x,*y,*v,sum1, sum2;
200bcc973b7SBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
201bcc973b7SBarry Smith   int         n,i,jrow,j;
20282b1193eSBarry Smith 
203bcc973b7SBarry Smith   PetscFunctionBegin;
204f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
205bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
206f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
207bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
208bcc973b7SBarry Smith   idx  = a->j;
209bcc973b7SBarry Smith   v    = a->a;
210bcc973b7SBarry Smith   ii   = a->i;
211bcc973b7SBarry Smith 
212bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
213bcc973b7SBarry Smith   idx  += shift;
214bcc973b7SBarry Smith   for (i=0; i<m; i++) {
215bcc973b7SBarry Smith     jrow = ii[i];
216bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
217bcc973b7SBarry Smith     sum1  = 0.0;
218bcc973b7SBarry Smith     sum2  = 0.0;
219bcc973b7SBarry Smith     for (j=0; j<n; j++) {
220bcc973b7SBarry Smith       sum1 += v[jrow]*x[2*idx[jrow]];
221bcc973b7SBarry Smith       sum2 += v[jrow]*x[2*idx[jrow]+1];
222bcc973b7SBarry Smith       jrow++;
223bcc973b7SBarry Smith      }
224bcc973b7SBarry Smith     y[2*i]   += sum1;
225bcc973b7SBarry Smith     y[2*i+1] += sum2;
226bcc973b7SBarry Smith   }
227bcc973b7SBarry Smith 
228bcc973b7SBarry Smith   PLogFlops(4*a->nz - 2*m);
229bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
230f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
231bcc973b7SBarry Smith   PetscFunctionReturn(0);
23282b1193eSBarry Smith }
23382b1193eSBarry Smith #undef __FUNC__
234cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_2"></a>*/"MatMultTransposeAdd_SeqMAIJ_2"
235cd3bbe55SBarry Smith int MatMultTransposeAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
23682b1193eSBarry Smith {
237*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
238bcc973b7SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
239bcc973b7SBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2;
240bcc973b7SBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
24182b1193eSBarry Smith 
242bcc973b7SBarry Smith   PetscFunctionBegin;
243f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
244bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
245f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
246bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
247bcc973b7SBarry Smith   for (i=0; i<m; i++) {
248bcc973b7SBarry Smith     idx   = a->j + a->i[i] + shift;
249bcc973b7SBarry Smith     v     = a->a + a->i[i] + shift;
250bcc973b7SBarry Smith     n     = a->i[i+1] - a->i[i];
251bcc973b7SBarry Smith     alpha1 = x[2*i];
252bcc973b7SBarry Smith     alpha2 = x[2*i+1];
253bcc973b7SBarry Smith     while (n-->0) {y[2*(*idx)] += alpha1*(*v); y[2*(*idx)+1] += alpha2*(*v); idx++; v++;}
254bcc973b7SBarry Smith   }
255bcc973b7SBarry Smith   PLogFlops(4*a->nz - 2*a->n);
256bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
257f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
258bcc973b7SBarry Smith   PetscFunctionReturn(0);
25982b1193eSBarry Smith }
260cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/
261bcc973b7SBarry Smith #undef __FUNC__
262bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_3"></a>*/"MatMult_SeqMAIJ_3"
263bcc973b7SBarry Smith int MatMult_SeqMAIJ_3(Mat A,Vec xx,Vec yy)
264bcc973b7SBarry Smith {
265*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
266bcc973b7SBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
267bcc973b7SBarry Smith   Scalar      *x,*y,*v,sum1, sum2, sum3;
268bcc973b7SBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
269bcc973b7SBarry Smith   int         n,i,jrow,j;
27082b1193eSBarry Smith 
271bcc973b7SBarry Smith   PetscFunctionBegin;
272bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
273bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
274bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
275bcc973b7SBarry Smith   idx  = a->j;
276bcc973b7SBarry Smith   v    = a->a;
277bcc973b7SBarry Smith   ii   = a->i;
278bcc973b7SBarry Smith 
279bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
280bcc973b7SBarry Smith   idx  += shift;
281bcc973b7SBarry Smith   for (i=0; i<m; i++) {
282bcc973b7SBarry Smith     jrow = ii[i];
283bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
284bcc973b7SBarry Smith     sum1  = 0.0;
285bcc973b7SBarry Smith     sum2  = 0.0;
286bcc973b7SBarry Smith     sum3  = 0.0;
287bcc973b7SBarry Smith     for (j=0; j<n; j++) {
288bcc973b7SBarry Smith       sum1 += v[jrow]*x[3*idx[jrow]];
289bcc973b7SBarry Smith       sum2 += v[jrow]*x[3*idx[jrow]+1];
290bcc973b7SBarry Smith       sum3 += v[jrow]*x[3*idx[jrow]+2];
291bcc973b7SBarry Smith       jrow++;
292bcc973b7SBarry Smith      }
293bcc973b7SBarry Smith     y[3*i]   = sum1;
294bcc973b7SBarry Smith     y[3*i+1] = sum2;
295bcc973b7SBarry Smith     y[3*i+2] = sum3;
296bcc973b7SBarry Smith   }
297bcc973b7SBarry Smith 
298bcc973b7SBarry Smith   PLogFlops(6*a->nz - 3*m);
299bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
300bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
301bcc973b7SBarry Smith   PetscFunctionReturn(0);
302bcc973b7SBarry Smith }
303bcc973b7SBarry Smith 
304bcc973b7SBarry Smith #undef __FUNC__
305bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_3"></a>*/"MatMultTranspose_SeqMAIJ_3"
306bcc973b7SBarry Smith int MatMultTranspose_SeqMAIJ_3(Mat A,Vec xx,Vec yy)
307bcc973b7SBarry Smith {
308*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
309bcc973b7SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
310bcc973b7SBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,alpha3,zero = 0.0;
311bcc973b7SBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
312bcc973b7SBarry Smith 
313bcc973b7SBarry Smith   PetscFunctionBegin;
314bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
315bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
316bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
317bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
318bcc973b7SBarry Smith   for (i=0; i<m; i++) {
319bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
320bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
321bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
322bcc973b7SBarry Smith     alpha1 = x[3*i];
323bcc973b7SBarry Smith     alpha2 = x[3*i+1];
324bcc973b7SBarry Smith     alpha3 = x[3*i+2];
325bcc973b7SBarry Smith     while (n-->0) {
326bcc973b7SBarry Smith       y[3*(*idx)]   += alpha1*(*v);
327bcc973b7SBarry Smith       y[3*(*idx)+1] += alpha2*(*v);
328bcc973b7SBarry Smith       y[3*(*idx)+2] += alpha3*(*v);
329bcc973b7SBarry Smith       idx++; v++;
330bcc973b7SBarry Smith     }
331bcc973b7SBarry Smith   }
332bcc973b7SBarry Smith   PLogFlops(6*a->nz - 3*a->n);
333bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
334bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
335bcc973b7SBarry Smith   PetscFunctionReturn(0);
336bcc973b7SBarry Smith }
337bcc973b7SBarry Smith 
338bcc973b7SBarry Smith #undef __FUNC__
339bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_3"></a>*/"MatMultAdd_SeqMAIJ_3"
340bcc973b7SBarry Smith int MatMultAdd_SeqMAIJ_3(Mat A,Vec xx,Vec yy,Vec zz)
341bcc973b7SBarry Smith {
342*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
343bcc973b7SBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
344bcc973b7SBarry Smith   Scalar      *x,*y,*v,sum1, sum2, sum3;
345bcc973b7SBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
346bcc973b7SBarry Smith   int         n,i,jrow,j;
347bcc973b7SBarry Smith 
348bcc973b7SBarry Smith   PetscFunctionBegin;
349f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
350bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
351f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
352bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
353bcc973b7SBarry Smith   idx  = a->j;
354bcc973b7SBarry Smith   v    = a->a;
355bcc973b7SBarry Smith   ii   = a->i;
356bcc973b7SBarry Smith 
357bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
358bcc973b7SBarry Smith   idx  += shift;
359bcc973b7SBarry Smith   for (i=0; i<m; i++) {
360bcc973b7SBarry Smith     jrow = ii[i];
361bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
362bcc973b7SBarry Smith     sum1  = 0.0;
363bcc973b7SBarry Smith     sum2  = 0.0;
364bcc973b7SBarry Smith     sum3  = 0.0;
365bcc973b7SBarry Smith     for (j=0; j<n; j++) {
366bcc973b7SBarry Smith       sum1 += v[jrow]*x[3*idx[jrow]];
367bcc973b7SBarry Smith       sum2 += v[jrow]*x[3*idx[jrow]+1];
368bcc973b7SBarry Smith       sum3 += v[jrow]*x[3*idx[jrow]+2];
369bcc973b7SBarry Smith       jrow++;
370bcc973b7SBarry Smith      }
371bcc973b7SBarry Smith     y[3*i]   += sum1;
372bcc973b7SBarry Smith     y[3*i+1] += sum2;
373bcc973b7SBarry Smith     y[3*i+2] += sum3;
374bcc973b7SBarry Smith   }
375bcc973b7SBarry Smith 
376bcc973b7SBarry Smith   PLogFlops(6*a->nz);
377bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
378f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
379bcc973b7SBarry Smith   PetscFunctionReturn(0);
380bcc973b7SBarry Smith }
381bcc973b7SBarry Smith #undef __FUNC__
382bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_3"></a>*/"MatMultTransposeAdd_SeqMAIJ_3"
383bcc973b7SBarry Smith int MatMultTransposeAdd_SeqMAIJ_3(Mat A,Vec xx,Vec yy,Vec zz)
384bcc973b7SBarry Smith {
385*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
386bcc973b7SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
387bcc973b7SBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,alpha3;
388bcc973b7SBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
389bcc973b7SBarry Smith 
390bcc973b7SBarry Smith   PetscFunctionBegin;
391f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
392bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
393f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
394bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
395bcc973b7SBarry Smith   for (i=0; i<m; i++) {
396bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
397bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
398bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
399bcc973b7SBarry Smith     alpha1 = x[3*i];
400bcc973b7SBarry Smith     alpha2 = x[3*i+1];
401bcc973b7SBarry Smith     alpha3 = x[3*i+2];
402bcc973b7SBarry Smith     while (n-->0) {
403bcc973b7SBarry Smith       y[3*(*idx)]   += alpha1*(*v);
404bcc973b7SBarry Smith       y[3*(*idx)+1] += alpha2*(*v);
405bcc973b7SBarry Smith       y[3*(*idx)+2] += alpha3*(*v);
406bcc973b7SBarry Smith       idx++; v++;
407bcc973b7SBarry Smith     }
408bcc973b7SBarry Smith   }
409bcc973b7SBarry Smith   PLogFlops(6*a->nz);
410bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
411f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
412bcc973b7SBarry Smith   PetscFunctionReturn(0);
413bcc973b7SBarry Smith }
414bcc973b7SBarry Smith 
415bcc973b7SBarry Smith /* ------------------------------------------------------------------------------*/
416bcc973b7SBarry Smith #undef __FUNC__
417bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_4"></a>*/"MatMult_SeqMAIJ_4"
418bcc973b7SBarry Smith int MatMult_SeqMAIJ_4(Mat A,Vec xx,Vec yy)
419bcc973b7SBarry Smith {
420*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
421bcc973b7SBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
422bcc973b7SBarry Smith   Scalar      *x,*y,*v,sum1, sum2, sum3, sum4;
423bcc973b7SBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
424bcc973b7SBarry Smith   int         n,i,jrow,j;
425bcc973b7SBarry Smith 
426bcc973b7SBarry Smith   PetscFunctionBegin;
427bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
428bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
429bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
430bcc973b7SBarry Smith   idx  = a->j;
431bcc973b7SBarry Smith   v    = a->a;
432bcc973b7SBarry Smith   ii   = a->i;
433bcc973b7SBarry Smith 
434bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
435bcc973b7SBarry Smith   idx  += shift;
436bcc973b7SBarry Smith   for (i=0; i<m; i++) {
437bcc973b7SBarry Smith     jrow = ii[i];
438bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
439bcc973b7SBarry Smith     sum1  = 0.0;
440bcc973b7SBarry Smith     sum2  = 0.0;
441bcc973b7SBarry Smith     sum3  = 0.0;
442bcc973b7SBarry Smith     sum4  = 0.0;
443bcc973b7SBarry Smith     for (j=0; j<n; j++) {
444bcc973b7SBarry Smith       sum1 += v[jrow]*x[4*idx[jrow]];
445bcc973b7SBarry Smith       sum2 += v[jrow]*x[4*idx[jrow]+1];
446bcc973b7SBarry Smith       sum3 += v[jrow]*x[4*idx[jrow]+2];
447bcc973b7SBarry Smith       sum4 += v[jrow]*x[4*idx[jrow]+3];
448bcc973b7SBarry Smith       jrow++;
449bcc973b7SBarry Smith      }
450bcc973b7SBarry Smith     y[4*i]   = sum1;
451bcc973b7SBarry Smith     y[4*i+1] = sum2;
452bcc973b7SBarry Smith     y[4*i+2] = sum3;
453bcc973b7SBarry Smith     y[4*i+3] = sum4;
454bcc973b7SBarry Smith   }
455bcc973b7SBarry Smith 
456bcc973b7SBarry Smith   PLogFlops(8*a->nz - 4*m);
457bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
458bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
459bcc973b7SBarry Smith   PetscFunctionReturn(0);
460bcc973b7SBarry Smith }
461bcc973b7SBarry Smith 
462bcc973b7SBarry Smith #undef __FUNC__
463bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_4"></a>*/"MatMultTranspose_SeqMAIJ_4"
464bcc973b7SBarry Smith int MatMultTranspose_SeqMAIJ_4(Mat A,Vec xx,Vec yy)
465bcc973b7SBarry Smith {
466*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
467bcc973b7SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
468bcc973b7SBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,alpha3,alpha4,zero = 0.0;
469bcc973b7SBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
470bcc973b7SBarry Smith 
471bcc973b7SBarry Smith   PetscFunctionBegin;
472bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
473bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
474bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
475bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
476bcc973b7SBarry Smith   for (i=0; i<m; i++) {
477bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
478bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
479bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
480bcc973b7SBarry Smith     alpha1 = x[4*i];
481bcc973b7SBarry Smith     alpha2 = x[4*i+1];
482bcc973b7SBarry Smith     alpha3 = x[4*i+2];
483bcc973b7SBarry Smith     alpha4 = x[4*i+3];
484bcc973b7SBarry Smith     while (n-->0) {
485bcc973b7SBarry Smith       y[4*(*idx)]   += alpha1*(*v);
486bcc973b7SBarry Smith       y[4*(*idx)+1] += alpha2*(*v);
487bcc973b7SBarry Smith       y[4*(*idx)+2] += alpha3*(*v);
488bcc973b7SBarry Smith       y[4*(*idx)+3] += alpha4*(*v);
489bcc973b7SBarry Smith       idx++; v++;
490bcc973b7SBarry Smith     }
491bcc973b7SBarry Smith   }
492bcc973b7SBarry Smith   PLogFlops(8*a->nz - 4*a->n);
493bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
494bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
495bcc973b7SBarry Smith   PetscFunctionReturn(0);
496bcc973b7SBarry Smith }
497bcc973b7SBarry Smith 
498bcc973b7SBarry Smith #undef __FUNC__
499bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_4"></a>*/"MatMultAdd_SeqMAIJ_4"
500bcc973b7SBarry Smith int MatMultAdd_SeqMAIJ_4(Mat A,Vec xx,Vec yy,Vec zz)
501bcc973b7SBarry Smith {
502*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
503f9fae5adSBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
504f9fae5adSBarry Smith   Scalar      *x,*y,*v,sum1, sum2, sum3, sum4;
505f9fae5adSBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
506f9fae5adSBarry Smith   int         n,i,jrow,j;
507f9fae5adSBarry Smith 
508f9fae5adSBarry Smith   PetscFunctionBegin;
509f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
510f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
511f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
512f9fae5adSBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
513f9fae5adSBarry Smith   idx  = a->j;
514f9fae5adSBarry Smith   v    = a->a;
515f9fae5adSBarry Smith   ii   = a->i;
516f9fae5adSBarry Smith 
517f9fae5adSBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
518f9fae5adSBarry Smith   idx  += shift;
519f9fae5adSBarry Smith   for (i=0; i<m; i++) {
520f9fae5adSBarry Smith     jrow = ii[i];
521f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
522f9fae5adSBarry Smith     sum1  = 0.0;
523f9fae5adSBarry Smith     sum2  = 0.0;
524f9fae5adSBarry Smith     sum3  = 0.0;
525f9fae5adSBarry Smith     sum4  = 0.0;
526f9fae5adSBarry Smith     for (j=0; j<n; j++) {
527f9fae5adSBarry Smith       sum1 += v[jrow]*x[4*idx[jrow]];
528f9fae5adSBarry Smith       sum2 += v[jrow]*x[4*idx[jrow]+1];
529f9fae5adSBarry Smith       sum3 += v[jrow]*x[4*idx[jrow]+2];
530f9fae5adSBarry Smith       sum4 += v[jrow]*x[4*idx[jrow]+3];
531f9fae5adSBarry Smith       jrow++;
532f9fae5adSBarry Smith      }
533f9fae5adSBarry Smith     y[4*i]   += sum1;
534f9fae5adSBarry Smith     y[4*i+1] += sum2;
535f9fae5adSBarry Smith     y[4*i+2] += sum3;
536f9fae5adSBarry Smith     y[4*i+3] += sum4;
537f9fae5adSBarry Smith   }
538f9fae5adSBarry Smith 
539f9fae5adSBarry Smith   PLogFlops(8*a->nz - 4*m);
540f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
541f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
542f9fae5adSBarry Smith   PetscFunctionReturn(0);
543bcc973b7SBarry Smith }
544bcc973b7SBarry Smith #undef __FUNC__
545bcc973b7SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_4"></a>*/"MatMultTransposeAdd_SeqMAIJ_4"
546bcc973b7SBarry Smith int MatMultTransposeAdd_SeqMAIJ_4(Mat A,Vec xx,Vec yy,Vec zz)
547bcc973b7SBarry Smith {
548*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
549f9fae5adSBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
550f9fae5adSBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,alpha3,alpha4;
551f9fae5adSBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
552f9fae5adSBarry Smith 
553f9fae5adSBarry Smith   PetscFunctionBegin;
554f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
555f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
556f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
557f9fae5adSBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
558f9fae5adSBarry Smith   for (i=0; i<m; i++) {
559f9fae5adSBarry Smith     idx    = a->j + a->i[i] + shift;
560f9fae5adSBarry Smith     v      = a->a + a->i[i] + shift;
561f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
562f9fae5adSBarry Smith     alpha1 = x[4*i];
563f9fae5adSBarry Smith     alpha2 = x[4*i+1];
564f9fae5adSBarry Smith     alpha3 = x[4*i+2];
565f9fae5adSBarry Smith     alpha4 = x[4*i+3];
566f9fae5adSBarry Smith     while (n-->0) {
567f9fae5adSBarry Smith       y[4*(*idx)]   += alpha1*(*v);
568f9fae5adSBarry Smith       y[4*(*idx)+1] += alpha2*(*v);
569f9fae5adSBarry Smith       y[4*(*idx)+2] += alpha3*(*v);
570f9fae5adSBarry Smith       y[4*(*idx)+3] += alpha4*(*v);
571f9fae5adSBarry Smith       idx++; v++;
572f9fae5adSBarry Smith     }
573f9fae5adSBarry Smith   }
574f9fae5adSBarry Smith   PLogFlops(8*a->nz - 4*a->n);
575f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
576f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
577f9fae5adSBarry Smith   PetscFunctionReturn(0);
578f9fae5adSBarry Smith 
579f9fae5adSBarry Smith }
580f9fae5adSBarry Smith 
581f9fae5adSBarry Smith /* ------------------------------------------------------------------------------*/
582f9fae5adSBarry Smith #undef __FUNC__
583f9fae5adSBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_5"></a>*/"MatMult_SeqMAIJ_5"
584f9fae5adSBarry Smith int MatMult_SeqMAIJ_5(Mat A,Vec xx,Vec yy)
585f9fae5adSBarry Smith {
586*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
587f9fae5adSBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
588f9fae5adSBarry Smith   Scalar      *x,*y,*v,sum1, sum2, sum3, sum4, sum5;
589f9fae5adSBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
590f9fae5adSBarry Smith   int         n,i,jrow,j;
591f9fae5adSBarry Smith 
592f9fae5adSBarry Smith   PetscFunctionBegin;
593f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
594f9fae5adSBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
595f9fae5adSBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
596f9fae5adSBarry Smith   idx  = a->j;
597f9fae5adSBarry Smith   v    = a->a;
598f9fae5adSBarry Smith   ii   = a->i;
599f9fae5adSBarry Smith 
600f9fae5adSBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
601f9fae5adSBarry Smith   idx  += shift;
602f9fae5adSBarry Smith   for (i=0; i<m; i++) {
603f9fae5adSBarry Smith     jrow = ii[i];
604f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
605f9fae5adSBarry Smith     sum1  = 0.0;
606f9fae5adSBarry Smith     sum2  = 0.0;
607f9fae5adSBarry Smith     sum3  = 0.0;
608f9fae5adSBarry Smith     sum4  = 0.0;
609f9fae5adSBarry Smith     sum5  = 0.0;
610f9fae5adSBarry Smith     for (j=0; j<n; j++) {
611f9fae5adSBarry Smith       sum1 += v[jrow]*x[5*idx[jrow]];
612f9fae5adSBarry Smith       sum2 += v[jrow]*x[5*idx[jrow]+1];
613f9fae5adSBarry Smith       sum3 += v[jrow]*x[5*idx[jrow]+2];
614f9fae5adSBarry Smith       sum4 += v[jrow]*x[5*idx[jrow]+3];
615f9fae5adSBarry Smith       sum5 += v[jrow]*x[5*idx[jrow]+4];
616f9fae5adSBarry Smith       jrow++;
617f9fae5adSBarry Smith      }
618f9fae5adSBarry Smith     y[5*i]   = sum1;
619f9fae5adSBarry Smith     y[5*i+1] = sum2;
620f9fae5adSBarry Smith     y[5*i+2] = sum3;
621f9fae5adSBarry Smith     y[5*i+3] = sum4;
622f9fae5adSBarry Smith     y[5*i+4] = sum5;
623f9fae5adSBarry Smith   }
624f9fae5adSBarry Smith 
625f9fae5adSBarry Smith   PLogFlops(10*a->nz - 5*m);
626f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
627f9fae5adSBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
628f9fae5adSBarry Smith   PetscFunctionReturn(0);
629f9fae5adSBarry Smith }
630f9fae5adSBarry Smith 
631f9fae5adSBarry Smith #undef __FUNC__
632f9fae5adSBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_5"></a>*/"MatMultTranspose_SeqMAIJ_5"
633f9fae5adSBarry Smith int MatMultTranspose_SeqMAIJ_5(Mat A,Vec xx,Vec yy)
634f9fae5adSBarry Smith {
635*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
636f9fae5adSBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
637f9fae5adSBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,zero = 0.0;
638f9fae5adSBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
639f9fae5adSBarry Smith 
640f9fae5adSBarry Smith   PetscFunctionBegin;
641f9fae5adSBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
642f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
643f9fae5adSBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
644f9fae5adSBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
645f9fae5adSBarry Smith   for (i=0; i<m; i++) {
646f9fae5adSBarry Smith     idx    = a->j + a->i[i] + shift;
647f9fae5adSBarry Smith     v      = a->a + a->i[i] + shift;
648f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
649f9fae5adSBarry Smith     alpha1 = x[5*i];
650f9fae5adSBarry Smith     alpha2 = x[5*i+1];
651f9fae5adSBarry Smith     alpha3 = x[5*i+2];
652f9fae5adSBarry Smith     alpha4 = x[5*i+3];
653f9fae5adSBarry Smith     alpha5 = x[5*i+4];
654f9fae5adSBarry Smith     while (n-->0) {
655f9fae5adSBarry Smith       y[5*(*idx)]   += alpha1*(*v);
656f9fae5adSBarry Smith       y[5*(*idx)+1] += alpha2*(*v);
657f9fae5adSBarry Smith       y[5*(*idx)+2] += alpha3*(*v);
658f9fae5adSBarry Smith       y[5*(*idx)+3] += alpha4*(*v);
659f9fae5adSBarry Smith       y[5*(*idx)+4] += alpha5*(*v);
660f9fae5adSBarry Smith       idx++; v++;
661f9fae5adSBarry Smith     }
662f9fae5adSBarry Smith   }
663f9fae5adSBarry Smith   PLogFlops(10*a->nz - 5*a->n);
664f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
665f9fae5adSBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
666f9fae5adSBarry Smith   PetscFunctionReturn(0);
667f9fae5adSBarry Smith }
668f9fae5adSBarry Smith 
669f9fae5adSBarry Smith #undef __FUNC__
670f9fae5adSBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_5"></a>*/"MatMultAdd_SeqMAIJ_5"
671f9fae5adSBarry Smith int MatMultAdd_SeqMAIJ_5(Mat A,Vec xx,Vec yy,Vec zz)
672f9fae5adSBarry Smith {
673*f4a53059SBarry Smith   Mat_MAIJ    *b = (Mat_MAIJ*)A->data;
674f9fae5adSBarry Smith   Mat_SeqAIJ  *a = (Mat_SeqAIJ*)b->AIJ->data;
675f9fae5adSBarry Smith   Scalar      *x,*y,*v,sum1, sum2, sum3, sum4, sum5;
676f9fae5adSBarry Smith   int         ierr,m = a->m,*idx,shift = a->indexshift,*ii;
677f9fae5adSBarry Smith   int         n,i,jrow,j;
678f9fae5adSBarry Smith 
679f9fae5adSBarry Smith   PetscFunctionBegin;
680f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
681f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
682f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
683f9fae5adSBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
684f9fae5adSBarry Smith   idx  = a->j;
685f9fae5adSBarry Smith   v    = a->a;
686f9fae5adSBarry Smith   ii   = a->i;
687f9fae5adSBarry Smith 
688f9fae5adSBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
689f9fae5adSBarry Smith   idx  += shift;
690f9fae5adSBarry Smith   for (i=0; i<m; i++) {
691f9fae5adSBarry Smith     jrow = ii[i];
692f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
693f9fae5adSBarry Smith     sum1  = 0.0;
694f9fae5adSBarry Smith     sum2  = 0.0;
695f9fae5adSBarry Smith     sum3  = 0.0;
696f9fae5adSBarry Smith     sum4  = 0.0;
697f9fae5adSBarry Smith     sum5  = 0.0;
698f9fae5adSBarry Smith     for (j=0; j<n; j++) {
699f9fae5adSBarry Smith       sum1 += v[jrow]*x[5*idx[jrow]];
700f9fae5adSBarry Smith       sum2 += v[jrow]*x[5*idx[jrow]+1];
701f9fae5adSBarry Smith       sum3 += v[jrow]*x[5*idx[jrow]+2];
702f9fae5adSBarry Smith       sum4 += v[jrow]*x[5*idx[jrow]+3];
703f9fae5adSBarry Smith       sum5 += v[jrow]*x[5*idx[jrow]+4];
704f9fae5adSBarry Smith       jrow++;
705f9fae5adSBarry Smith      }
706f9fae5adSBarry Smith     y[5*i]   += sum1;
707f9fae5adSBarry Smith     y[5*i+1] += sum2;
708f9fae5adSBarry Smith     y[5*i+2] += sum3;
709f9fae5adSBarry Smith     y[5*i+3] += sum4;
710f9fae5adSBarry Smith     y[5*i+4] += sum5;
711f9fae5adSBarry Smith   }
712f9fae5adSBarry Smith 
713f9fae5adSBarry Smith   PLogFlops(10*a->nz);
714f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
715f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
716f9fae5adSBarry Smith   PetscFunctionReturn(0);
717f9fae5adSBarry Smith }
718f9fae5adSBarry Smith 
719f9fae5adSBarry Smith #undef __FUNC__
720f9fae5adSBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_5"></a>*/"MatMultTransposeAdd_SeqMAIJ_5"
721f9fae5adSBarry Smith int MatMultTransposeAdd_SeqMAIJ_5(Mat A,Vec xx,Vec yy,Vec zz)
722f9fae5adSBarry Smith {
723*f4a53059SBarry Smith   Mat_MAIJ   *b = (Mat_MAIJ*)A->data;
724f9fae5adSBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ*)b->AIJ->data;
725f9fae5adSBarry Smith   Scalar     *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5;
726f9fae5adSBarry Smith   int        ierr,m = a->m,n,i,*idx,shift = a->indexshift;
727f9fae5adSBarry Smith 
728f9fae5adSBarry Smith   PetscFunctionBegin;
729f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
730f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
731f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
732f9fae5adSBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
733f9fae5adSBarry Smith   for (i=0; i<m; i++) {
734f9fae5adSBarry Smith     idx    = a->j + a->i[i] + shift;
735f9fae5adSBarry Smith     v      = a->a + a->i[i] + shift;
736f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
737f9fae5adSBarry Smith     alpha1 = x[5*i];
738f9fae5adSBarry Smith     alpha2 = x[5*i+1];
739f9fae5adSBarry Smith     alpha3 = x[5*i+2];
740f9fae5adSBarry Smith     alpha4 = x[5*i+3];
741f9fae5adSBarry Smith     alpha5 = x[5*i+4];
742f9fae5adSBarry Smith     while (n-->0) {
743f9fae5adSBarry Smith       y[5*(*idx)]   += alpha1*(*v);
744f9fae5adSBarry Smith       y[5*(*idx)+1] += alpha2*(*v);
745f9fae5adSBarry Smith       y[5*(*idx)+2] += alpha3*(*v);
746f9fae5adSBarry Smith       y[5*(*idx)+3] += alpha4*(*v);
747f9fae5adSBarry Smith       y[5*(*idx)+4] += alpha5*(*v);
748f9fae5adSBarry Smith       idx++; v++;
749f9fae5adSBarry Smith     }
750f9fae5adSBarry Smith   }
751f9fae5adSBarry Smith   PLogFlops(10*a->nz);
752f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
753f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
754f9fae5adSBarry Smith   PetscFunctionReturn(0);
755bcc973b7SBarry Smith }
756bcc973b7SBarry Smith 
757*f4a53059SBarry Smith /*===================================================================================*/
758*f4a53059SBarry Smith EXTERN int MatMult_MPIAIJ(Mat,Vec,Vec);
759*f4a53059SBarry Smith EXTERN int MatMultAdd_MPIAIJ(Mat,Vec,Vec,Vec);
760*f4a53059SBarry Smith EXTERN int MatMultTranspose_MPIAIJ(Mat,Vec,Vec);
761*f4a53059SBarry Smith EXTERN int MatMultTransposeAdd_MPIAIJ(Mat,Vec,Vec,Vec);
762*f4a53059SBarry Smith 
763*f4a53059SBarry Smith #undef __FUNC__
764*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatMult_MPIMAIJ_1"></a>*/"MatMult_MPIMAIJ_1"
765*f4a53059SBarry Smith int MatMult_MPIMAIJ_1(Mat A,Vec xx,Vec yy)
766*f4a53059SBarry Smith {
767*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
768*f4a53059SBarry Smith   int      ierr;
769*f4a53059SBarry Smith   PetscFunctionBegin;
770*f4a53059SBarry Smith   ierr = MatMult_MPIAIJ(b->AIJ,xx,yy);
771*f4a53059SBarry Smith   PetscFunctionReturn(0);
772*f4a53059SBarry Smith }
773*f4a53059SBarry Smith #undef __FUNC__
774*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_MPIMAIJ_1"></a>*/"MatMultTranspose_MPIMAIJ_1"
775*f4a53059SBarry Smith int MatMultTranspose_MPIMAIJ_1(Mat A,Vec xx,Vec yy)
776*f4a53059SBarry Smith {
777*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
778*f4a53059SBarry Smith   int      ierr;
779*f4a53059SBarry Smith   PetscFunctionBegin;
780*f4a53059SBarry Smith   ierr = MatMultTranspose_MPIAIJ(b->AIJ,xx,yy);
781*f4a53059SBarry Smith   PetscFunctionReturn(0);
782*f4a53059SBarry Smith }
783*f4a53059SBarry Smith #undef __FUNC__
784*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_MPIMAIJ_1"></a>*/"MatMultAdd_MPIMAIJ_1"
785*f4a53059SBarry Smith int MatMultAdd_MPIMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz)
786*f4a53059SBarry Smith {
787*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
788*f4a53059SBarry Smith   int      ierr;
789*f4a53059SBarry Smith   PetscFunctionBegin;
790*f4a53059SBarry Smith   ierr = MatMultAdd_MPIAIJ(b->AIJ,xx,yy,zz);
791*f4a53059SBarry Smith   PetscFunctionReturn(0);
792*f4a53059SBarry Smith }
793*f4a53059SBarry Smith #undef __FUNC__
794*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_MPIMAIJ_1"></a>*/"MatMultTransposeAdd_MPIMAIJ_1"
795*f4a53059SBarry Smith int MatMultTransposeAdd_MPIMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz)
796*f4a53059SBarry Smith {
797*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
798*f4a53059SBarry Smith   int      ierr;
799*f4a53059SBarry Smith   PetscFunctionBegin;
800*f4a53059SBarry Smith   ierr = MatMultTransposeAdd_MPIAIJ(b->AIJ,xx,yy,zz);
801*f4a53059SBarry Smith   PetscFunctionReturn(0);
802*f4a53059SBarry Smith }
803*f4a53059SBarry Smith 
804*f4a53059SBarry Smith /* ---------------------------------------------------------------------------------- */
805*f4a53059SBarry Smith #undef __FUNC__
806*f4a53059SBarry Smith #define __FUNC__ /*<a name="MatMult_MPIMAIJ_dof"></a>*/"MatMult_MPIMAIJ_dof"
807*f4a53059SBarry Smith int MatMult_MPIMAIJ_dof(Mat A,Vec xx,Vec yy)
808*f4a53059SBarry Smith {
809*f4a53059SBarry Smith   Mat_MAIJ *b = (Mat_MAIJ*)A->data;
810*f4a53059SBarry Smith   int      ierr;
811*f4a53059SBarry Smith   PetscFunctionBegin;
812*f4a53059SBarry Smith 
813*f4a53059SBarry Smith   /* start the scatter */
814*f4a53059SBarry Smith   ierr = VecScatterBegin(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
815*f4a53059SBarry Smith   ierr = MatMult_SeqMAIJ_2(A,xx,yy);CHKERRQ(ierr);
816*f4a53059SBarry Smith   ierr = VecScatterEnd(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
817*f4a53059SBarry Smith   ierr = MatMultAdd_SeqMAIJ_1(A,b->w,yy,yy);CHKERRQ(ierr);
818*f4a53059SBarry Smith   PetscFunctionReturn(0);
819*f4a53059SBarry Smith }
820*f4a53059SBarry Smith 
821bcc973b7SBarry Smith /* ---------------------------------------------------------------------------------- */
82282b1193eSBarry Smith #undef __FUNC__
823cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatCreateMAIJ"></a>*/"MatCreateMAIJ"
824cd3bbe55SBarry Smith int MatCreateMAIJ(Mat A,int dof,Mat *maij)
82582b1193eSBarry Smith {
826*f4a53059SBarry Smith   int      ierr,size,n;
827*f4a53059SBarry Smith   Mat_MAIJ *b;
82882b1193eSBarry Smith   Mat      B;
82982b1193eSBarry Smith 
83082b1193eSBarry Smith   PetscFunctionBegin;
831cd3bbe55SBarry Smith   ierr = MATCreate(A->comm,dof*A->m,dof*A->n,dof*A->M,dof*A->N,&B);CHKERRQ(ierr);
832*f4a53059SBarry Smith   ierr = MatSetType(B,MATMAIJ);CHKERRQ(ierr);
83382b1193eSBarry Smith 
834cd3bbe55SBarry Smith   B->assembled    = PETSC_TRUE;
835*f4a53059SBarry Smith   B->ops->destroy = MatDestroy_MAIJ;
836*f4a53059SBarry Smith   b = (Mat_MAIJ*)B->data;
83782b1193eSBarry Smith 
838cd3bbe55SBarry Smith   b->AIJ = A;
839cd3bbe55SBarry Smith   b->dof = dof;
840cd3bbe55SBarry Smith   ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
841*f4a53059SBarry Smith   ierr = MPI_Comm_size(A->comm,&size);CHKERRQ(ierr);
842*f4a53059SBarry Smith   if (size == 1) {
843cd3bbe55SBarry Smith     if (dof == 1) {
844cd3bbe55SBarry Smith       B->ops->mult             = MatMult_SeqMAIJ_1;
845cd3bbe55SBarry Smith       B->ops->multadd          = MatMultAdd_SeqMAIJ_1;
846cd3bbe55SBarry Smith       B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_1;
847cd3bbe55SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_1;
848cd3bbe55SBarry Smith     } else if (dof == 2) {
849cd3bbe55SBarry Smith       B->ops->mult             = MatMult_SeqMAIJ_2;
850cd3bbe55SBarry Smith       B->ops->multadd          = MatMultAdd_SeqMAIJ_2;
851cd3bbe55SBarry Smith       B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_2;
852cd3bbe55SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_2;
853bcc973b7SBarry Smith     } else if (dof == 3) {
854bcc973b7SBarry Smith       B->ops->mult             = MatMult_SeqMAIJ_3;
855bcc973b7SBarry Smith       B->ops->multadd          = MatMultAdd_SeqMAIJ_3;
856bcc973b7SBarry Smith       B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_3;
857bcc973b7SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_3;
858bcc973b7SBarry Smith     } else if (dof == 4) {
859bcc973b7SBarry Smith       B->ops->mult             = MatMult_SeqMAIJ_4;
860bcc973b7SBarry Smith       B->ops->multadd          = MatMultAdd_SeqMAIJ_4;
861bcc973b7SBarry Smith       B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_4;
862bcc973b7SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_4;
863f9fae5adSBarry Smith     } else if (dof == 5) {
864f9fae5adSBarry Smith       B->ops->mult             = MatMult_SeqMAIJ_5;
865f9fae5adSBarry Smith       B->ops->multadd          = MatMultAdd_SeqMAIJ_5;
866f9fae5adSBarry Smith       B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_5;
867f9fae5adSBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_5;
86882b1193eSBarry Smith     } else {
869cd3bbe55SBarry Smith       SETERRQ1(1,1,"Cannot handle a dof of %d\n",dof);
87082b1193eSBarry Smith     }
871*f4a53059SBarry Smith   } else {
872*f4a53059SBarry Smith     if (dof == 1) {
873*f4a53059SBarry Smith       B->ops->mult             = MatMult_MPIMAIJ_1;
874*f4a53059SBarry Smith       B->ops->multadd          = MatMultAdd_MPIMAIJ_1;
875*f4a53059SBarry Smith       B->ops->multtranspose    = MatMultTranspose_MPIMAIJ_1;
876*f4a53059SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_MPIMAIJ_1;
877*f4a53059SBarry Smith     } else {
878*f4a53059SBarry Smith       Mat_MPIAIJ *mpiaij = (Mat_MPIAIJ *)A->data;
879*f4a53059SBarry Smith       IS         from,to;
880*f4a53059SBarry Smith       Vec        gvec;
881*f4a53059SBarry Smith       int        *garray,i;
882*f4a53059SBarry Smith 
883*f4a53059SBarry Smith       ierr = VecGetSize(mpiaij->lvec,&n);CHKERRQ(ierr);
884*f4a53059SBarry Smith       ierr = VecCreateSeq(PETSC_COMM_SELF,n*dof,&b->w);CHKERRQ(ierr);
885*f4a53059SBarry Smith 
886*f4a53059SBarry Smith       /* create two temporary Index sets for build scatter gather */
887*f4a53059SBarry Smith       garray = (int*)PetscMalloc((n+1)*sizeof(int));CHKPTRQ(garray);
888*f4a53059SBarry Smith       for (i=0; i<n; i++) garray[i] = dof*mpiaij->garray[i];
889*f4a53059SBarry Smith       ierr = ISCreateBlock(A->comm,dof,n,garray,&from);CHKERRQ(ierr);
890*f4a53059SBarry Smith       ierr = PetscFree(garray);CHKERRQ(ierr);
891*f4a53059SBarry Smith       ierr = ISCreateStride(PETSC_COMM_SELF,n*dof,0,1,&to);CHKERRQ(ierr);
892*f4a53059SBarry Smith 
893*f4a53059SBarry Smith       /* create temporary global vector to generate scatter context */
894*f4a53059SBarry Smith       ierr = VecCreateMPI(A->comm,dof*A->n,dof*A->N,&gvec);CHKERRQ(ierr);
895*f4a53059SBarry Smith 
896*f4a53059SBarry Smith       /* generate the scatter context */
897*f4a53059SBarry Smith       ierr = VecScatterCreate(gvec,from,b->w,to,&b->ctx);CHKERRQ(ierr);
898*f4a53059SBarry Smith 
899*f4a53059SBarry Smith       ierr = ISDestroy(from);CHKERRQ(ierr);
900*f4a53059SBarry Smith       ierr = ISDestroy(to);CHKERRQ(ierr);
901*f4a53059SBarry Smith       ierr = VecDestroy(gvec);CHKERRQ(ierr);
902*f4a53059SBarry Smith 
903*f4a53059SBarry Smith       B->ops->mult = MatMult_MPIMAIJ_dof;
904*f4a53059SBarry Smith     }
905*f4a53059SBarry Smith   }
906cd3bbe55SBarry Smith   *maij = B;
90782b1193eSBarry Smith   PetscFunctionReturn(0);
90882b1193eSBarry Smith }
90982b1193eSBarry Smith 
91082b1193eSBarry Smith 
91182b1193eSBarry Smith 
91282b1193eSBarry Smith 
91382b1193eSBarry Smith 
91482b1193eSBarry Smith 
91582b1193eSBarry Smith 
91682b1193eSBarry Smith 
91782b1193eSBarry Smith 
91882b1193eSBarry Smith 
91982b1193eSBarry Smith 
92082b1193eSBarry Smith 
921