xref: /petsc/src/mat/impls/maij/maij.c (revision be91161870a2b3a924e0c3c9613ac47a432c0e8f)
173f4d377SMatthew Knepley /*$Id: maij.c,v 1.19 2001/08/07 03:03:00 balay Exp $*/
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*)
15f4a53059SBarry Smith 
16f4a53059SBarry Smith      This single directory handles both the sequential and parallel codes
1782b1193eSBarry Smith */
1882b1193eSBarry Smith 
19*be911618SKris Buschelman #include "src/mat/impls/maij/maij.h"
2082b1193eSBarry Smith 
214a2ae208SSatish Balay #undef __FUNCT__
224a2ae208SSatish Balay #define __FUNCT__ "MatMAIJGetAIJ"
23b9b97703SBarry Smith int MatMAIJGetAIJ(Mat A,Mat *B)
24b9b97703SBarry Smith {
25b9b97703SBarry Smith   int         ierr;
26b9b97703SBarry Smith   PetscTruth  ismpimaij,isseqmaij;
27b9b97703SBarry Smith 
28b9b97703SBarry Smith   PetscFunctionBegin;
29b9b97703SBarry Smith   ierr = PetscTypeCompare((PetscObject)A,MATMPIMAIJ,&ismpimaij);CHKERRQ(ierr);
30b9b97703SBarry Smith   ierr = PetscTypeCompare((PetscObject)A,MATSEQMAIJ,&isseqmaij);CHKERRQ(ierr);
31b9b97703SBarry Smith   if (ismpimaij) {
32b9b97703SBarry Smith     Mat_MPIMAIJ *b = (Mat_MPIMAIJ*)A->data;
33b9b97703SBarry Smith 
34b9b97703SBarry Smith     *B = b->A;
35b9b97703SBarry Smith   } else if (isseqmaij) {
36b9b97703SBarry Smith     Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
37b9b97703SBarry Smith 
38b9b97703SBarry Smith     *B = b->AIJ;
39b9b97703SBarry Smith   } else {
40b9b97703SBarry Smith     *B = A;
41b9b97703SBarry Smith   }
42b9b97703SBarry Smith   PetscFunctionReturn(0);
43b9b97703SBarry Smith }
44b9b97703SBarry Smith 
454a2ae208SSatish Balay #undef __FUNCT__
464a2ae208SSatish Balay #define __FUNCT__ "MatMAIJRedimension"
47b9b97703SBarry Smith int MatMAIJRedimension(Mat A,int dof,Mat *B)
48b9b97703SBarry Smith {
49b9b97703SBarry Smith   int ierr;
50b9b97703SBarry Smith   Mat Aij;
51b9b97703SBarry Smith 
52b9b97703SBarry Smith   PetscFunctionBegin;
53b9b97703SBarry Smith   ierr = MatMAIJGetAIJ(A,&Aij);CHKERRQ(ierr);
54b9b97703SBarry Smith   ierr = MatCreateMAIJ(Aij,dof,B);CHKERRQ(ierr);
55b9b97703SBarry Smith   PetscFunctionReturn(0);
56b9b97703SBarry Smith }
57b9b97703SBarry Smith 
584a2ae208SSatish Balay #undef __FUNCT__
594a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqMAIJ"
604cb9d9b8SBarry Smith int MatDestroy_SeqMAIJ(Mat A)
6182b1193eSBarry Smith {
6282b1193eSBarry Smith   int         ierr;
634cb9d9b8SBarry Smith   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
6482b1193eSBarry Smith 
6582b1193eSBarry Smith   PetscFunctionBegin;
66cd3bbe55SBarry Smith   if (b->AIJ) {
67cd3bbe55SBarry Smith     ierr = MatDestroy(b->AIJ);CHKERRQ(ierr);
6882b1193eSBarry Smith   }
694cb9d9b8SBarry Smith   ierr = PetscFree(b);CHKERRQ(ierr);
704cb9d9b8SBarry Smith   PetscFunctionReturn(0);
714cb9d9b8SBarry Smith }
724cb9d9b8SBarry Smith 
734a2ae208SSatish Balay #undef __FUNCT__
744a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_MPIMAIJ"
754cb9d9b8SBarry Smith int MatDestroy_MPIMAIJ(Mat A)
764cb9d9b8SBarry Smith {
774cb9d9b8SBarry Smith   int         ierr;
784cb9d9b8SBarry Smith   Mat_MPIMAIJ *b = (Mat_MPIMAIJ*)A->data;
794cb9d9b8SBarry Smith 
804cb9d9b8SBarry Smith   PetscFunctionBegin;
814cb9d9b8SBarry Smith   if (b->AIJ) {
824cb9d9b8SBarry Smith     ierr = MatDestroy(b->AIJ);CHKERRQ(ierr);
834cb9d9b8SBarry Smith   }
84f4a53059SBarry Smith   if (b->OAIJ) {
85f4a53059SBarry Smith     ierr = MatDestroy(b->OAIJ);CHKERRQ(ierr);
86f4a53059SBarry Smith   }
87b9b97703SBarry Smith   if (b->A) {
88b9b97703SBarry Smith     ierr = MatDestroy(b->A);CHKERRQ(ierr);
89b9b97703SBarry Smith   }
90f4a53059SBarry Smith   if (b->ctx) {
91f4a53059SBarry Smith     ierr = VecScatterDestroy(b->ctx);CHKERRQ(ierr);
92f4a53059SBarry Smith   }
93f4a53059SBarry Smith   if (b->w) {
94f4a53059SBarry Smith     ierr = VecDestroy(b->w);CHKERRQ(ierr);
95f4a53059SBarry Smith   }
96cd3bbe55SBarry Smith   ierr = PetscFree(b);CHKERRQ(ierr);
97b9b97703SBarry Smith   PetscFunctionReturn(0);
98b9b97703SBarry Smith }
99b9b97703SBarry Smith 
10082b1193eSBarry Smith EXTERN_C_BEGIN
1014a2ae208SSatish Balay #undef __FUNCT__
1024a2ae208SSatish Balay #define __FUNCT__ "MatCreate_MAIJ"
103f4a53059SBarry Smith int MatCreate_MAIJ(Mat A)
10482b1193eSBarry Smith {
105cd3bbe55SBarry Smith   int         ierr;
1064cb9d9b8SBarry Smith   Mat_MPIMAIJ *b;
10782b1193eSBarry Smith 
10882b1193eSBarry Smith   PetscFunctionBegin;
109b0a32e0cSBarry Smith   ierr     = PetscNew(Mat_MPIMAIJ,&b);CHKERRQ(ierr);
110b0a32e0cSBarry Smith   A->data  = (void*)b;
1114cb9d9b8SBarry Smith   ierr = PetscMemzero(b,sizeof(Mat_MPIMAIJ));CHKERRQ(ierr);
112cd3bbe55SBarry Smith   ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr);
113cd3bbe55SBarry Smith   A->factor           = 0;
114cd3bbe55SBarry Smith   A->mapping          = 0;
115f4a53059SBarry Smith 
116cd3bbe55SBarry Smith   b->AIJ  = 0;
117cd3bbe55SBarry Smith   b->dof  = 0;
118f4a53059SBarry Smith   b->OAIJ = 0;
119f4a53059SBarry Smith   b->ctx  = 0;
120f4a53059SBarry Smith   b->w    = 0;
12182b1193eSBarry Smith   PetscFunctionReturn(0);
12282b1193eSBarry Smith }
12382b1193eSBarry Smith EXTERN_C_END
12482b1193eSBarry Smith 
125cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/
1264a2ae208SSatish Balay #undef __FUNCT__
127b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_2"
128cd3bbe55SBarry Smith int MatMult_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
12982b1193eSBarry Smith {
1304cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
131bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
13287828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2;
133273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
134bcc973b7SBarry Smith   int           n,i,jrow,j;
13582b1193eSBarry Smith 
136bcc973b7SBarry Smith   PetscFunctionBegin;
137bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
138bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
139bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
140bcc973b7SBarry Smith   idx  = a->j;
141bcc973b7SBarry Smith   v    = a->a;
142bcc973b7SBarry Smith   ii   = a->i;
143bcc973b7SBarry Smith 
144bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
145bcc973b7SBarry Smith   idx  += shift;
146bcc973b7SBarry Smith   for (i=0; i<m; i++) {
147bcc973b7SBarry Smith     jrow = ii[i];
148bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
149bcc973b7SBarry Smith     sum1  = 0.0;
150bcc973b7SBarry Smith     sum2  = 0.0;
151bcc973b7SBarry Smith     for (j=0; j<n; j++) {
152bcc973b7SBarry Smith       sum1 += v[jrow]*x[2*idx[jrow]];
153bcc973b7SBarry Smith       sum2 += v[jrow]*x[2*idx[jrow]+1];
154bcc973b7SBarry Smith       jrow++;
155bcc973b7SBarry Smith      }
156bcc973b7SBarry Smith     y[2*i]   = sum1;
157bcc973b7SBarry Smith     y[2*i+1] = sum2;
158bcc973b7SBarry Smith   }
159bcc973b7SBarry Smith 
160b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*m);
161bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
162bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
16382b1193eSBarry Smith   PetscFunctionReturn(0);
16482b1193eSBarry Smith }
165bcc973b7SBarry Smith 
1664a2ae208SSatish Balay #undef __FUNCT__
167b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_2"
168cd3bbe55SBarry Smith int MatMultTranspose_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
16982b1193eSBarry Smith {
1704cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
171bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
17287828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,zero = 0.0;
173273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
17482b1193eSBarry Smith 
175bcc973b7SBarry Smith   PetscFunctionBegin;
176bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
177bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
178bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
179bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
180bcc973b7SBarry Smith   for (i=0; i<m; i++) {
181bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
182bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
183bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
184bcc973b7SBarry Smith     alpha1 = x[2*i];
185bcc973b7SBarry Smith     alpha2 = x[2*i+1];
186bcc973b7SBarry Smith     while (n-->0) {y[2*(*idx)] += alpha1*(*v); y[2*(*idx)+1] += alpha2*(*v); idx++; v++;}
187bcc973b7SBarry Smith   }
188b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*b->AIJ->n);
189bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
190bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
19182b1193eSBarry Smith   PetscFunctionReturn(0);
19282b1193eSBarry Smith }
193bcc973b7SBarry Smith 
1944a2ae208SSatish Balay #undef __FUNCT__
195b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_2"
196cd3bbe55SBarry Smith int MatMultAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
19782b1193eSBarry Smith {
1984cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
199bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
20087828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2;
201273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
202bcc973b7SBarry Smith   int           n,i,jrow,j;
20382b1193eSBarry Smith 
204bcc973b7SBarry Smith   PetscFunctionBegin;
205f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
206bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
207f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
208bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
209bcc973b7SBarry Smith   idx  = a->j;
210bcc973b7SBarry Smith   v    = a->a;
211bcc973b7SBarry Smith   ii   = a->i;
212bcc973b7SBarry Smith 
213bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
214bcc973b7SBarry Smith   idx  += shift;
215bcc973b7SBarry Smith   for (i=0; i<m; i++) {
216bcc973b7SBarry Smith     jrow = ii[i];
217bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
218bcc973b7SBarry Smith     sum1  = 0.0;
219bcc973b7SBarry Smith     sum2  = 0.0;
220bcc973b7SBarry Smith     for (j=0; j<n; j++) {
221bcc973b7SBarry Smith       sum1 += v[jrow]*x[2*idx[jrow]];
222bcc973b7SBarry Smith       sum2 += v[jrow]*x[2*idx[jrow]+1];
223bcc973b7SBarry Smith       jrow++;
224bcc973b7SBarry Smith      }
225bcc973b7SBarry Smith     y[2*i]   += sum1;
226bcc973b7SBarry Smith     y[2*i+1] += sum2;
227bcc973b7SBarry Smith   }
228bcc973b7SBarry Smith 
229b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*m);
230bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
231f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
232bcc973b7SBarry Smith   PetscFunctionReturn(0);
23382b1193eSBarry Smith }
2344a2ae208SSatish Balay #undef __FUNCT__
235b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_2"
236cd3bbe55SBarry Smith int MatMultTransposeAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
23782b1193eSBarry Smith {
2384cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
239bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
24087828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2;
241273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
24282b1193eSBarry Smith 
243bcc973b7SBarry Smith   PetscFunctionBegin;
244f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
245bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
246f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
247bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
248bcc973b7SBarry Smith   for (i=0; i<m; i++) {
249bcc973b7SBarry Smith     idx   = a->j + a->i[i] + shift;
250bcc973b7SBarry Smith     v     = a->a + a->i[i] + shift;
251bcc973b7SBarry Smith     n     = a->i[i+1] - a->i[i];
252bcc973b7SBarry Smith     alpha1 = x[2*i];
253bcc973b7SBarry Smith     alpha2 = x[2*i+1];
254bcc973b7SBarry Smith     while (n-->0) {y[2*(*idx)] += alpha1*(*v); y[2*(*idx)+1] += alpha2*(*v); idx++; v++;}
255bcc973b7SBarry Smith   }
256b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*b->AIJ->n);
257bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
258f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
259bcc973b7SBarry Smith   PetscFunctionReturn(0);
26082b1193eSBarry Smith }
261cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/
2624a2ae208SSatish Balay #undef __FUNCT__
263b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_3"
264bcc973b7SBarry Smith int MatMult_SeqMAIJ_3(Mat A,Vec xx,Vec yy)
265bcc973b7SBarry Smith {
2664cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
267bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
26887828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3;
269273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
270bcc973b7SBarry Smith   int           n,i,jrow,j;
27182b1193eSBarry Smith 
272bcc973b7SBarry Smith   PetscFunctionBegin;
273bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
274bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
275bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
276bcc973b7SBarry Smith   idx  = a->j;
277bcc973b7SBarry Smith   v    = a->a;
278bcc973b7SBarry Smith   ii   = a->i;
279bcc973b7SBarry Smith 
280bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
281bcc973b7SBarry Smith   idx  += shift;
282bcc973b7SBarry Smith   for (i=0; i<m; i++) {
283bcc973b7SBarry Smith     jrow = ii[i];
284bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
285bcc973b7SBarry Smith     sum1  = 0.0;
286bcc973b7SBarry Smith     sum2  = 0.0;
287bcc973b7SBarry Smith     sum3  = 0.0;
288bcc973b7SBarry Smith     for (j=0; j<n; j++) {
289bcc973b7SBarry Smith       sum1 += v[jrow]*x[3*idx[jrow]];
290bcc973b7SBarry Smith       sum2 += v[jrow]*x[3*idx[jrow]+1];
291bcc973b7SBarry Smith       sum3 += v[jrow]*x[3*idx[jrow]+2];
292bcc973b7SBarry Smith       jrow++;
293bcc973b7SBarry Smith      }
294bcc973b7SBarry Smith     y[3*i]   = sum1;
295bcc973b7SBarry Smith     y[3*i+1] = sum2;
296bcc973b7SBarry Smith     y[3*i+2] = sum3;
297bcc973b7SBarry Smith   }
298bcc973b7SBarry Smith 
299b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz - 3*m);
300bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
301bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
302bcc973b7SBarry Smith   PetscFunctionReturn(0);
303bcc973b7SBarry Smith }
304bcc973b7SBarry Smith 
3054a2ae208SSatish Balay #undef __FUNCT__
306b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_3"
307bcc973b7SBarry Smith int MatMultTranspose_SeqMAIJ_3(Mat A,Vec xx,Vec yy)
308bcc973b7SBarry Smith {
3094cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
310bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
31187828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,zero = 0.0;
312273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
313bcc973b7SBarry Smith 
314bcc973b7SBarry Smith   PetscFunctionBegin;
315bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
316bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
317bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
318bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
319bcc973b7SBarry Smith   for (i=0; i<m; i++) {
320bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
321bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
322bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
323bcc973b7SBarry Smith     alpha1 = x[3*i];
324bcc973b7SBarry Smith     alpha2 = x[3*i+1];
325bcc973b7SBarry Smith     alpha3 = x[3*i+2];
326bcc973b7SBarry Smith     while (n-->0) {
327bcc973b7SBarry Smith       y[3*(*idx)]   += alpha1*(*v);
328bcc973b7SBarry Smith       y[3*(*idx)+1] += alpha2*(*v);
329bcc973b7SBarry Smith       y[3*(*idx)+2] += alpha3*(*v);
330bcc973b7SBarry Smith       idx++; v++;
331bcc973b7SBarry Smith     }
332bcc973b7SBarry Smith   }
333b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz - 3*b->AIJ->n);
334bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
335bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
336bcc973b7SBarry Smith   PetscFunctionReturn(0);
337bcc973b7SBarry Smith }
338bcc973b7SBarry Smith 
3394a2ae208SSatish Balay #undef __FUNCT__
340b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_3"
341bcc973b7SBarry Smith int MatMultAdd_SeqMAIJ_3(Mat A,Vec xx,Vec yy,Vec zz)
342bcc973b7SBarry Smith {
3434cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
344bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
34587828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3;
346273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
347bcc973b7SBarry Smith   int           n,i,jrow,j;
348bcc973b7SBarry Smith 
349bcc973b7SBarry Smith   PetscFunctionBegin;
350f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
351bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
352f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
353bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
354bcc973b7SBarry Smith   idx  = a->j;
355bcc973b7SBarry Smith   v    = a->a;
356bcc973b7SBarry Smith   ii   = a->i;
357bcc973b7SBarry Smith 
358bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
359bcc973b7SBarry Smith   idx  += shift;
360bcc973b7SBarry Smith   for (i=0; i<m; i++) {
361bcc973b7SBarry Smith     jrow = ii[i];
362bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
363bcc973b7SBarry Smith     sum1  = 0.0;
364bcc973b7SBarry Smith     sum2  = 0.0;
365bcc973b7SBarry Smith     sum3  = 0.0;
366bcc973b7SBarry Smith     for (j=0; j<n; j++) {
367bcc973b7SBarry Smith       sum1 += v[jrow]*x[3*idx[jrow]];
368bcc973b7SBarry Smith       sum2 += v[jrow]*x[3*idx[jrow]+1];
369bcc973b7SBarry Smith       sum3 += v[jrow]*x[3*idx[jrow]+2];
370bcc973b7SBarry Smith       jrow++;
371bcc973b7SBarry Smith      }
372bcc973b7SBarry Smith     y[3*i]   += sum1;
373bcc973b7SBarry Smith     y[3*i+1] += sum2;
374bcc973b7SBarry Smith     y[3*i+2] += sum3;
375bcc973b7SBarry Smith   }
376bcc973b7SBarry Smith 
377b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz);
378bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
379f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
380bcc973b7SBarry Smith   PetscFunctionReturn(0);
381bcc973b7SBarry Smith }
3824a2ae208SSatish Balay #undef __FUNCT__
383b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_3"
384bcc973b7SBarry Smith int MatMultTransposeAdd_SeqMAIJ_3(Mat A,Vec xx,Vec yy,Vec zz)
385bcc973b7SBarry Smith {
3864cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
387bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
38887828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3;
389273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
390bcc973b7SBarry Smith 
391bcc973b7SBarry Smith   PetscFunctionBegin;
392f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
393bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
394f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
395bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
396bcc973b7SBarry Smith   for (i=0; i<m; i++) {
397bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
398bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
399bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
400bcc973b7SBarry Smith     alpha1 = x[3*i];
401bcc973b7SBarry Smith     alpha2 = x[3*i+1];
402bcc973b7SBarry Smith     alpha3 = x[3*i+2];
403bcc973b7SBarry Smith     while (n-->0) {
404bcc973b7SBarry Smith       y[3*(*idx)]   += alpha1*(*v);
405bcc973b7SBarry Smith       y[3*(*idx)+1] += alpha2*(*v);
406bcc973b7SBarry Smith       y[3*(*idx)+2] += alpha3*(*v);
407bcc973b7SBarry Smith       idx++; v++;
408bcc973b7SBarry Smith     }
409bcc973b7SBarry Smith   }
410b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz);
411bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
412f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
413bcc973b7SBarry Smith   PetscFunctionReturn(0);
414bcc973b7SBarry Smith }
415bcc973b7SBarry Smith 
416bcc973b7SBarry Smith /* ------------------------------------------------------------------------------*/
4174a2ae208SSatish Balay #undef __FUNCT__
418b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_4"
419bcc973b7SBarry Smith int MatMult_SeqMAIJ_4(Mat A,Vec xx,Vec yy)
420bcc973b7SBarry Smith {
4214cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
422bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
42387828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4;
424273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
425bcc973b7SBarry Smith   int           n,i,jrow,j;
426bcc973b7SBarry Smith 
427bcc973b7SBarry Smith   PetscFunctionBegin;
428bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
429bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
430bcc973b7SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
431bcc973b7SBarry Smith   idx  = a->j;
432bcc973b7SBarry Smith   v    = a->a;
433bcc973b7SBarry Smith   ii   = a->i;
434bcc973b7SBarry Smith 
435bcc973b7SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
436bcc973b7SBarry Smith   idx  += shift;
437bcc973b7SBarry Smith   for (i=0; i<m; i++) {
438bcc973b7SBarry Smith     jrow = ii[i];
439bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
440bcc973b7SBarry Smith     sum1  = 0.0;
441bcc973b7SBarry Smith     sum2  = 0.0;
442bcc973b7SBarry Smith     sum3  = 0.0;
443bcc973b7SBarry Smith     sum4  = 0.0;
444bcc973b7SBarry Smith     for (j=0; j<n; j++) {
445bcc973b7SBarry Smith       sum1 += v[jrow]*x[4*idx[jrow]];
446bcc973b7SBarry Smith       sum2 += v[jrow]*x[4*idx[jrow]+1];
447bcc973b7SBarry Smith       sum3 += v[jrow]*x[4*idx[jrow]+2];
448bcc973b7SBarry Smith       sum4 += v[jrow]*x[4*idx[jrow]+3];
449bcc973b7SBarry Smith       jrow++;
450bcc973b7SBarry Smith      }
451bcc973b7SBarry Smith     y[4*i]   = sum1;
452bcc973b7SBarry Smith     y[4*i+1] = sum2;
453bcc973b7SBarry Smith     y[4*i+2] = sum3;
454bcc973b7SBarry Smith     y[4*i+3] = sum4;
455bcc973b7SBarry Smith   }
456bcc973b7SBarry Smith 
457b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*m);
458bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
459bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
460bcc973b7SBarry Smith   PetscFunctionReturn(0);
461bcc973b7SBarry Smith }
462bcc973b7SBarry Smith 
4634a2ae208SSatish Balay #undef __FUNCT__
464b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_4"
465bcc973b7SBarry Smith int MatMultTranspose_SeqMAIJ_4(Mat A,Vec xx,Vec yy)
466bcc973b7SBarry Smith {
4674cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
468bcc973b7SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
46987828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,zero = 0.0;
470273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
471bcc973b7SBarry Smith 
472bcc973b7SBarry Smith   PetscFunctionBegin;
473bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
474bcc973b7SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
475bcc973b7SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
476bcc973b7SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
477bcc973b7SBarry Smith   for (i=0; i<m; i++) {
478bcc973b7SBarry Smith     idx    = a->j + a->i[i] + shift;
479bcc973b7SBarry Smith     v      = a->a + a->i[i] + shift;
480bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
481bcc973b7SBarry Smith     alpha1 = x[4*i];
482bcc973b7SBarry Smith     alpha2 = x[4*i+1];
483bcc973b7SBarry Smith     alpha3 = x[4*i+2];
484bcc973b7SBarry Smith     alpha4 = x[4*i+3];
485bcc973b7SBarry Smith     while (n-->0) {
486bcc973b7SBarry Smith       y[4*(*idx)]   += alpha1*(*v);
487bcc973b7SBarry Smith       y[4*(*idx)+1] += alpha2*(*v);
488bcc973b7SBarry Smith       y[4*(*idx)+2] += alpha3*(*v);
489bcc973b7SBarry Smith       y[4*(*idx)+3] += alpha4*(*v);
490bcc973b7SBarry Smith       idx++; v++;
491bcc973b7SBarry Smith     }
492bcc973b7SBarry Smith   }
493b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*b->AIJ->n);
494bcc973b7SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
495bcc973b7SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
496bcc973b7SBarry Smith   PetscFunctionReturn(0);
497bcc973b7SBarry Smith }
498bcc973b7SBarry Smith 
4994a2ae208SSatish Balay #undef __FUNCT__
500b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_4"
501bcc973b7SBarry Smith int MatMultAdd_SeqMAIJ_4(Mat A,Vec xx,Vec yy,Vec zz)
502bcc973b7SBarry Smith {
5034cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
504f9fae5adSBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
50587828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4;
506273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
507f9fae5adSBarry Smith   int           n,i,jrow,j;
508f9fae5adSBarry Smith 
509f9fae5adSBarry Smith   PetscFunctionBegin;
510f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
511f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
512f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
513f9fae5adSBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
514f9fae5adSBarry Smith   idx  = a->j;
515f9fae5adSBarry Smith   v    = a->a;
516f9fae5adSBarry Smith   ii   = a->i;
517f9fae5adSBarry Smith 
518f9fae5adSBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
519f9fae5adSBarry Smith   idx  += shift;
520f9fae5adSBarry Smith   for (i=0; i<m; i++) {
521f9fae5adSBarry Smith     jrow = ii[i];
522f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
523f9fae5adSBarry Smith     sum1  = 0.0;
524f9fae5adSBarry Smith     sum2  = 0.0;
525f9fae5adSBarry Smith     sum3  = 0.0;
526f9fae5adSBarry Smith     sum4  = 0.0;
527f9fae5adSBarry Smith     for (j=0; j<n; j++) {
528f9fae5adSBarry Smith       sum1 += v[jrow]*x[4*idx[jrow]];
529f9fae5adSBarry Smith       sum2 += v[jrow]*x[4*idx[jrow]+1];
530f9fae5adSBarry Smith       sum3 += v[jrow]*x[4*idx[jrow]+2];
531f9fae5adSBarry Smith       sum4 += v[jrow]*x[4*idx[jrow]+3];
532f9fae5adSBarry Smith       jrow++;
533f9fae5adSBarry Smith      }
534f9fae5adSBarry Smith     y[4*i]   += sum1;
535f9fae5adSBarry Smith     y[4*i+1] += sum2;
536f9fae5adSBarry Smith     y[4*i+2] += sum3;
537f9fae5adSBarry Smith     y[4*i+3] += sum4;
538f9fae5adSBarry Smith   }
539f9fae5adSBarry Smith 
540b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*m);
541f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
542f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
543f9fae5adSBarry Smith   PetscFunctionReturn(0);
544bcc973b7SBarry Smith }
5454a2ae208SSatish Balay #undef __FUNCT__
546b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_4"
547bcc973b7SBarry Smith int MatMultTransposeAdd_SeqMAIJ_4(Mat A,Vec xx,Vec yy,Vec zz)
548bcc973b7SBarry Smith {
5494cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
550f9fae5adSBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
55187828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4;
552273d9f13SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
553f9fae5adSBarry Smith 
554f9fae5adSBarry Smith   PetscFunctionBegin;
555f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
556f9fae5adSBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
557f9fae5adSBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
558f9fae5adSBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
559f9fae5adSBarry Smith   for (i=0; i<m; i++) {
560f9fae5adSBarry Smith     idx    = a->j + a->i[i] + shift;
561f9fae5adSBarry Smith     v      = a->a + a->i[i] + shift;
562f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
563f9fae5adSBarry Smith     alpha1 = x[4*i];
564f9fae5adSBarry Smith     alpha2 = x[4*i+1];
565f9fae5adSBarry Smith     alpha3 = x[4*i+2];
566f9fae5adSBarry Smith     alpha4 = x[4*i+3];
567f9fae5adSBarry Smith     while (n-->0) {
568f9fae5adSBarry Smith       y[4*(*idx)]   += alpha1*(*v);
569f9fae5adSBarry Smith       y[4*(*idx)+1] += alpha2*(*v);
570f9fae5adSBarry Smith       y[4*(*idx)+2] += alpha3*(*v);
571f9fae5adSBarry Smith       y[4*(*idx)+3] += alpha4*(*v);
572f9fae5adSBarry Smith       idx++; v++;
573f9fae5adSBarry Smith     }
574f9fae5adSBarry Smith   }
575b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*b->AIJ->n);
576f9fae5adSBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
577f9fae5adSBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
578f9fae5adSBarry Smith   PetscFunctionReturn(0);
579f9fae5adSBarry Smith }
580f9fae5adSBarry Smith /* ------------------------------------------------------------------------------*/
5816cd98798SBarry Smith 
5824a2ae208SSatish Balay #undef __FUNCT__
583b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_5"
584f9fae5adSBarry Smith int MatMult_SeqMAIJ_5(Mat A,Vec xx,Vec yy)
585f9fae5adSBarry Smith {
5864cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
587f9fae5adSBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
58887828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4, sum5;
589273d9f13SBarry Smith   int           ierr,m = b->AIJ->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 
625b0a32e0cSBarry Smith   PetscLogFlops(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 
6314a2ae208SSatish Balay #undef __FUNCT__
632b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_5"
633f9fae5adSBarry Smith int MatMultTranspose_SeqMAIJ_5(Mat A,Vec xx,Vec yy)
634f9fae5adSBarry Smith {
6354cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
636f9fae5adSBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
63787828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,zero = 0.0;
638273d9f13SBarry Smith   int           ierr,m = b->AIJ->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   }
663b0a32e0cSBarry Smith   PetscLogFlops(10*a->nz - 5*b->AIJ->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 
6694a2ae208SSatish Balay #undef __FUNCT__
670b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_5"
671f9fae5adSBarry Smith int MatMultAdd_SeqMAIJ_5(Mat A,Vec xx,Vec yy,Vec zz)
672f9fae5adSBarry Smith {
6734cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
674f9fae5adSBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
67587828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4, sum5;
676273d9f13SBarry Smith   int           ierr,m = b->AIJ->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 
713b0a32e0cSBarry Smith   PetscLogFlops(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 
7194a2ae208SSatish Balay #undef __FUNCT__
720b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_5"
721f9fae5adSBarry Smith int MatMultTransposeAdd_SeqMAIJ_5(Mat A,Vec xx,Vec yy,Vec zz)
722f9fae5adSBarry Smith {
7234cb9d9b8SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
724f9fae5adSBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
72587828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5;
726273d9f13SBarry Smith   int           ierr,m = b->AIJ->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   }
751b0a32e0cSBarry Smith   PetscLogFlops(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 
7576cd98798SBarry Smith /* ------------------------------------------------------------------------------*/
7584a2ae208SSatish Balay #undef __FUNCT__
759b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_6"
7606cd98798SBarry Smith int MatMult_SeqMAIJ_6(Mat A,Vec xx,Vec yy)
7616cd98798SBarry Smith {
7626cd98798SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
7636cd98798SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
76487828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6;
7656cd98798SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
7666cd98798SBarry Smith   int           n,i,jrow,j;
7676cd98798SBarry Smith 
7686cd98798SBarry Smith   PetscFunctionBegin;
7696cd98798SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
7706cd98798SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7716cd98798SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
7726cd98798SBarry Smith   idx  = a->j;
7736cd98798SBarry Smith   v    = a->a;
7746cd98798SBarry Smith   ii   = a->i;
7756cd98798SBarry Smith 
7766cd98798SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
7776cd98798SBarry Smith   idx  += shift;
7786cd98798SBarry Smith   for (i=0; i<m; i++) {
7796cd98798SBarry Smith     jrow = ii[i];
7806cd98798SBarry Smith     n    = ii[i+1] - jrow;
7816cd98798SBarry Smith     sum1  = 0.0;
7826cd98798SBarry Smith     sum2  = 0.0;
7836cd98798SBarry Smith     sum3  = 0.0;
7846cd98798SBarry Smith     sum4  = 0.0;
7856cd98798SBarry Smith     sum5  = 0.0;
7866cd98798SBarry Smith     sum6  = 0.0;
7876cd98798SBarry Smith     for (j=0; j<n; j++) {
7886cd98798SBarry Smith       sum1 += v[jrow]*x[6*idx[jrow]];
7896cd98798SBarry Smith       sum2 += v[jrow]*x[6*idx[jrow]+1];
7906cd98798SBarry Smith       sum3 += v[jrow]*x[6*idx[jrow]+2];
7916cd98798SBarry Smith       sum4 += v[jrow]*x[6*idx[jrow]+3];
7926cd98798SBarry Smith       sum5 += v[jrow]*x[6*idx[jrow]+4];
7936cd98798SBarry Smith       sum6 += v[jrow]*x[6*idx[jrow]+5];
7946cd98798SBarry Smith       jrow++;
7956cd98798SBarry Smith      }
7966cd98798SBarry Smith     y[6*i]   = sum1;
7976cd98798SBarry Smith     y[6*i+1] = sum2;
7986cd98798SBarry Smith     y[6*i+2] = sum3;
7996cd98798SBarry Smith     y[6*i+3] = sum4;
8006cd98798SBarry Smith     y[6*i+4] = sum5;
8016cd98798SBarry Smith     y[6*i+5] = sum6;
8026cd98798SBarry Smith   }
8036cd98798SBarry Smith 
804b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz - 6*m);
8056cd98798SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
8066cd98798SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
8076cd98798SBarry Smith   PetscFunctionReturn(0);
8086cd98798SBarry Smith }
8096cd98798SBarry Smith 
8104a2ae208SSatish Balay #undef __FUNCT__
811b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_6"
8126cd98798SBarry Smith int MatMultTranspose_SeqMAIJ_6(Mat A,Vec xx,Vec yy)
8136cd98798SBarry Smith {
8146cd98798SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
8156cd98798SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
81687828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,zero = 0.0;
8176cd98798SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
8186cd98798SBarry Smith 
8196cd98798SBarry Smith   PetscFunctionBegin;
8206cd98798SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
8216cd98798SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
8226cd98798SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8236cd98798SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
8246cd98798SBarry Smith   for (i=0; i<m; i++) {
8256cd98798SBarry Smith     idx    = a->j + a->i[i] + shift;
8266cd98798SBarry Smith     v      = a->a + a->i[i] + shift;
8276cd98798SBarry Smith     n      = a->i[i+1] - a->i[i];
8286cd98798SBarry Smith     alpha1 = x[6*i];
8296cd98798SBarry Smith     alpha2 = x[6*i+1];
8306cd98798SBarry Smith     alpha3 = x[6*i+2];
8316cd98798SBarry Smith     alpha4 = x[6*i+3];
8326cd98798SBarry Smith     alpha5 = x[6*i+4];
8336cd98798SBarry Smith     alpha6 = x[6*i+5];
8346cd98798SBarry Smith     while (n-->0) {
8356cd98798SBarry Smith       y[6*(*idx)]   += alpha1*(*v);
8366cd98798SBarry Smith       y[6*(*idx)+1] += alpha2*(*v);
8376cd98798SBarry Smith       y[6*(*idx)+2] += alpha3*(*v);
8386cd98798SBarry Smith       y[6*(*idx)+3] += alpha4*(*v);
8396cd98798SBarry Smith       y[6*(*idx)+4] += alpha5*(*v);
8406cd98798SBarry Smith       y[6*(*idx)+5] += alpha6*(*v);
8416cd98798SBarry Smith       idx++; v++;
8426cd98798SBarry Smith     }
8436cd98798SBarry Smith   }
844b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz - 6*b->AIJ->n);
8456cd98798SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
8466cd98798SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
8476cd98798SBarry Smith   PetscFunctionReturn(0);
8486cd98798SBarry Smith }
8496cd98798SBarry Smith 
8504a2ae208SSatish Balay #undef __FUNCT__
851b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_6"
8526cd98798SBarry Smith int MatMultAdd_SeqMAIJ_6(Mat A,Vec xx,Vec yy,Vec zz)
8536cd98798SBarry Smith {
8546cd98798SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
8556cd98798SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
85687828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6;
8576cd98798SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
8586cd98798SBarry Smith   int           n,i,jrow,j;
8596cd98798SBarry Smith 
8606cd98798SBarry Smith   PetscFunctionBegin;
8616cd98798SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
8626cd98798SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
8636cd98798SBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
8646cd98798SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
8656cd98798SBarry Smith   idx  = a->j;
8666cd98798SBarry Smith   v    = a->a;
8676cd98798SBarry Smith   ii   = a->i;
8686cd98798SBarry Smith 
8696cd98798SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
8706cd98798SBarry Smith   idx  += shift;
8716cd98798SBarry Smith   for (i=0; i<m; i++) {
8726cd98798SBarry Smith     jrow = ii[i];
8736cd98798SBarry Smith     n    = ii[i+1] - jrow;
8746cd98798SBarry Smith     sum1  = 0.0;
8756cd98798SBarry Smith     sum2  = 0.0;
8766cd98798SBarry Smith     sum3  = 0.0;
8776cd98798SBarry Smith     sum4  = 0.0;
8786cd98798SBarry Smith     sum5  = 0.0;
8796cd98798SBarry Smith     sum6  = 0.0;
8806cd98798SBarry Smith     for (j=0; j<n; j++) {
8816cd98798SBarry Smith       sum1 += v[jrow]*x[6*idx[jrow]];
8826cd98798SBarry Smith       sum2 += v[jrow]*x[6*idx[jrow]+1];
8836cd98798SBarry Smith       sum3 += v[jrow]*x[6*idx[jrow]+2];
8846cd98798SBarry Smith       sum4 += v[jrow]*x[6*idx[jrow]+3];
8856cd98798SBarry Smith       sum5 += v[jrow]*x[6*idx[jrow]+4];
8866cd98798SBarry Smith       sum6 += v[jrow]*x[6*idx[jrow]+5];
8876cd98798SBarry Smith       jrow++;
8886cd98798SBarry Smith      }
8896cd98798SBarry Smith     y[6*i]   += sum1;
8906cd98798SBarry Smith     y[6*i+1] += sum2;
8916cd98798SBarry Smith     y[6*i+2] += sum3;
8926cd98798SBarry Smith     y[6*i+3] += sum4;
8936cd98798SBarry Smith     y[6*i+4] += sum5;
8946cd98798SBarry Smith     y[6*i+5] += sum6;
8956cd98798SBarry Smith   }
8966cd98798SBarry Smith 
897b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz);
8986cd98798SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
8996cd98798SBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
9006cd98798SBarry Smith   PetscFunctionReturn(0);
9016cd98798SBarry Smith }
9026cd98798SBarry Smith 
9034a2ae208SSatish Balay #undef __FUNCT__
904b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_6"
9056cd98798SBarry Smith int MatMultTransposeAdd_SeqMAIJ_6(Mat A,Vec xx,Vec yy,Vec zz)
9066cd98798SBarry Smith {
9076cd98798SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
9086cd98798SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
90987828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6;
9106cd98798SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
9116cd98798SBarry Smith 
9126cd98798SBarry Smith   PetscFunctionBegin;
9136cd98798SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
9146cd98798SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
9156cd98798SBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
9166cd98798SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
9176cd98798SBarry Smith   for (i=0; i<m; i++) {
9186cd98798SBarry Smith     idx    = a->j + a->i[i] + shift;
9196cd98798SBarry Smith     v      = a->a + a->i[i] + shift;
9206cd98798SBarry Smith     n      = a->i[i+1] - a->i[i];
9216cd98798SBarry Smith     alpha1 = x[6*i];
9226cd98798SBarry Smith     alpha2 = x[6*i+1];
9236cd98798SBarry Smith     alpha3 = x[6*i+2];
9246cd98798SBarry Smith     alpha4 = x[6*i+3];
9256cd98798SBarry Smith     alpha5 = x[6*i+4];
9266cd98798SBarry Smith     alpha6 = x[6*i+5];
9276cd98798SBarry Smith     while (n-->0) {
9286cd98798SBarry Smith       y[6*(*idx)]   += alpha1*(*v);
9296cd98798SBarry Smith       y[6*(*idx)+1] += alpha2*(*v);
9306cd98798SBarry Smith       y[6*(*idx)+2] += alpha3*(*v);
9316cd98798SBarry Smith       y[6*(*idx)+3] += alpha4*(*v);
9326cd98798SBarry Smith       y[6*(*idx)+4] += alpha5*(*v);
9336cd98798SBarry Smith       y[6*(*idx)+5] += alpha6*(*v);
9346cd98798SBarry Smith       idx++; v++;
9356cd98798SBarry Smith     }
9366cd98798SBarry Smith   }
937b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz);
9386cd98798SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
9396cd98798SBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
9406cd98798SBarry Smith   PetscFunctionReturn(0);
9416cd98798SBarry Smith }
9426cd98798SBarry Smith 
94366ed3db0SBarry Smith /* ------------------------------------------------------------------------------*/
94466ed3db0SBarry Smith #undef __FUNCT__
94566ed3db0SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_8"
94666ed3db0SBarry Smith int MatMult_SeqMAIJ_8(Mat A,Vec xx,Vec yy)
94766ed3db0SBarry Smith {
94866ed3db0SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
94966ed3db0SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
95087828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
95166ed3db0SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
95266ed3db0SBarry Smith   int           n,i,jrow,j;
95366ed3db0SBarry Smith 
95466ed3db0SBarry Smith   PetscFunctionBegin;
95566ed3db0SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
95666ed3db0SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
95766ed3db0SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
95866ed3db0SBarry Smith   idx  = a->j;
95966ed3db0SBarry Smith   v    = a->a;
96066ed3db0SBarry Smith   ii   = a->i;
96166ed3db0SBarry Smith 
96266ed3db0SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
96366ed3db0SBarry Smith   idx  += shift;
96466ed3db0SBarry Smith   for (i=0; i<m; i++) {
96566ed3db0SBarry Smith     jrow = ii[i];
96666ed3db0SBarry Smith     n    = ii[i+1] - jrow;
96766ed3db0SBarry Smith     sum1  = 0.0;
96866ed3db0SBarry Smith     sum2  = 0.0;
96966ed3db0SBarry Smith     sum3  = 0.0;
97066ed3db0SBarry Smith     sum4  = 0.0;
97166ed3db0SBarry Smith     sum5  = 0.0;
97266ed3db0SBarry Smith     sum6  = 0.0;
97366ed3db0SBarry Smith     sum7  = 0.0;
97466ed3db0SBarry Smith     sum8  = 0.0;
97566ed3db0SBarry Smith     for (j=0; j<n; j++) {
97666ed3db0SBarry Smith       sum1 += v[jrow]*x[8*idx[jrow]];
97766ed3db0SBarry Smith       sum2 += v[jrow]*x[8*idx[jrow]+1];
97866ed3db0SBarry Smith       sum3 += v[jrow]*x[8*idx[jrow]+2];
97966ed3db0SBarry Smith       sum4 += v[jrow]*x[8*idx[jrow]+3];
98066ed3db0SBarry Smith       sum5 += v[jrow]*x[8*idx[jrow]+4];
98166ed3db0SBarry Smith       sum6 += v[jrow]*x[8*idx[jrow]+5];
98266ed3db0SBarry Smith       sum7 += v[jrow]*x[8*idx[jrow]+6];
98366ed3db0SBarry Smith       sum8 += v[jrow]*x[8*idx[jrow]+7];
98466ed3db0SBarry Smith       jrow++;
98566ed3db0SBarry Smith      }
98666ed3db0SBarry Smith     y[8*i]   = sum1;
98766ed3db0SBarry Smith     y[8*i+1] = sum2;
98866ed3db0SBarry Smith     y[8*i+2] = sum3;
98966ed3db0SBarry Smith     y[8*i+3] = sum4;
99066ed3db0SBarry Smith     y[8*i+4] = sum5;
99166ed3db0SBarry Smith     y[8*i+5] = sum6;
99266ed3db0SBarry Smith     y[8*i+6] = sum7;
99366ed3db0SBarry Smith     y[8*i+7] = sum8;
99466ed3db0SBarry Smith   }
99566ed3db0SBarry Smith 
99666ed3db0SBarry Smith   PetscLogFlops(16*a->nz - 8*m);
99766ed3db0SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
99866ed3db0SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
99966ed3db0SBarry Smith   PetscFunctionReturn(0);
100066ed3db0SBarry Smith }
100166ed3db0SBarry Smith 
100266ed3db0SBarry Smith #undef __FUNCT__
100366ed3db0SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_8"
100466ed3db0SBarry Smith int MatMultTranspose_SeqMAIJ_8(Mat A,Vec xx,Vec yy)
100566ed3db0SBarry Smith {
100666ed3db0SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
100766ed3db0SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
100887828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8,zero = 0.0;
100966ed3db0SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
101066ed3db0SBarry Smith 
101166ed3db0SBarry Smith   PetscFunctionBegin;
101266ed3db0SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
101366ed3db0SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
101466ed3db0SBarry Smith   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
101566ed3db0SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
101666ed3db0SBarry Smith   for (i=0; i<m; i++) {
101766ed3db0SBarry Smith     idx    = a->j + a->i[i] + shift;
101866ed3db0SBarry Smith     v      = a->a + a->i[i] + shift;
101966ed3db0SBarry Smith     n      = a->i[i+1] - a->i[i];
102066ed3db0SBarry Smith     alpha1 = x[8*i];
102166ed3db0SBarry Smith     alpha2 = x[8*i+1];
102266ed3db0SBarry Smith     alpha3 = x[8*i+2];
102366ed3db0SBarry Smith     alpha4 = x[8*i+3];
102466ed3db0SBarry Smith     alpha5 = x[8*i+4];
102566ed3db0SBarry Smith     alpha6 = x[8*i+5];
102666ed3db0SBarry Smith     alpha7 = x[8*i+6];
102766ed3db0SBarry Smith     alpha8 = x[8*i+7];
102866ed3db0SBarry Smith     while (n-->0) {
102966ed3db0SBarry Smith       y[8*(*idx)]   += alpha1*(*v);
103066ed3db0SBarry Smith       y[8*(*idx)+1] += alpha2*(*v);
103166ed3db0SBarry Smith       y[8*(*idx)+2] += alpha3*(*v);
103266ed3db0SBarry Smith       y[8*(*idx)+3] += alpha4*(*v);
103366ed3db0SBarry Smith       y[8*(*idx)+4] += alpha5*(*v);
103466ed3db0SBarry Smith       y[8*(*idx)+5] += alpha6*(*v);
103566ed3db0SBarry Smith       y[8*(*idx)+6] += alpha7*(*v);
103666ed3db0SBarry Smith       y[8*(*idx)+7] += alpha8*(*v);
103766ed3db0SBarry Smith       idx++; v++;
103866ed3db0SBarry Smith     }
103966ed3db0SBarry Smith   }
104066ed3db0SBarry Smith   PetscLogFlops(16*a->nz - 8*b->AIJ->n);
104166ed3db0SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
104266ed3db0SBarry Smith   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
104366ed3db0SBarry Smith   PetscFunctionReturn(0);
104466ed3db0SBarry Smith }
104566ed3db0SBarry Smith 
104666ed3db0SBarry Smith #undef __FUNCT__
104766ed3db0SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_8"
104866ed3db0SBarry Smith int MatMultAdd_SeqMAIJ_8(Mat A,Vec xx,Vec yy,Vec zz)
104966ed3db0SBarry Smith {
105066ed3db0SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
105166ed3db0SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
105287828ca2SBarry Smith   PetscScalar   *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
105366ed3db0SBarry Smith   int           ierr,m = b->AIJ->m,*idx,shift = a->indexshift,*ii;
105466ed3db0SBarry Smith   int           n,i,jrow,j;
105566ed3db0SBarry Smith 
105666ed3db0SBarry Smith   PetscFunctionBegin;
105766ed3db0SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
105866ed3db0SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
105966ed3db0SBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
106066ed3db0SBarry Smith   x    = x + shift;    /* shift for Fortran start by 1 indexing */
106166ed3db0SBarry Smith   idx  = a->j;
106266ed3db0SBarry Smith   v    = a->a;
106366ed3db0SBarry Smith   ii   = a->i;
106466ed3db0SBarry Smith 
106566ed3db0SBarry Smith   v    += shift; /* shift for Fortran start by 1 indexing */
106666ed3db0SBarry Smith   idx  += shift;
106766ed3db0SBarry Smith   for (i=0; i<m; i++) {
106866ed3db0SBarry Smith     jrow = ii[i];
106966ed3db0SBarry Smith     n    = ii[i+1] - jrow;
107066ed3db0SBarry Smith     sum1  = 0.0;
107166ed3db0SBarry Smith     sum2  = 0.0;
107266ed3db0SBarry Smith     sum3  = 0.0;
107366ed3db0SBarry Smith     sum4  = 0.0;
107466ed3db0SBarry Smith     sum5  = 0.0;
107566ed3db0SBarry Smith     sum6  = 0.0;
107666ed3db0SBarry Smith     sum7  = 0.0;
107766ed3db0SBarry Smith     sum8  = 0.0;
107866ed3db0SBarry Smith     for (j=0; j<n; j++) {
107966ed3db0SBarry Smith       sum1 += v[jrow]*x[8*idx[jrow]];
108066ed3db0SBarry Smith       sum2 += v[jrow]*x[8*idx[jrow]+1];
108166ed3db0SBarry Smith       sum3 += v[jrow]*x[8*idx[jrow]+2];
108266ed3db0SBarry Smith       sum4 += v[jrow]*x[8*idx[jrow]+3];
108366ed3db0SBarry Smith       sum5 += v[jrow]*x[8*idx[jrow]+4];
108466ed3db0SBarry Smith       sum6 += v[jrow]*x[8*idx[jrow]+5];
108566ed3db0SBarry Smith       sum7 += v[jrow]*x[8*idx[jrow]+6];
108666ed3db0SBarry Smith       sum8 += v[jrow]*x[8*idx[jrow]+7];
108766ed3db0SBarry Smith       jrow++;
108866ed3db0SBarry Smith      }
108966ed3db0SBarry Smith     y[8*i]   += sum1;
109066ed3db0SBarry Smith     y[8*i+1] += sum2;
109166ed3db0SBarry Smith     y[8*i+2] += sum3;
109266ed3db0SBarry Smith     y[8*i+3] += sum4;
109366ed3db0SBarry Smith     y[8*i+4] += sum5;
109466ed3db0SBarry Smith     y[8*i+5] += sum6;
109566ed3db0SBarry Smith     y[8*i+6] += sum7;
109666ed3db0SBarry Smith     y[8*i+7] += sum8;
109766ed3db0SBarry Smith   }
109866ed3db0SBarry Smith 
109966ed3db0SBarry Smith   PetscLogFlops(16*a->nz);
110066ed3db0SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
110166ed3db0SBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
110266ed3db0SBarry Smith   PetscFunctionReturn(0);
110366ed3db0SBarry Smith }
110466ed3db0SBarry Smith 
110566ed3db0SBarry Smith #undef __FUNCT__
110666ed3db0SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_8"
110766ed3db0SBarry Smith int MatMultTransposeAdd_SeqMAIJ_8(Mat A,Vec xx,Vec yy,Vec zz)
110866ed3db0SBarry Smith {
110966ed3db0SBarry Smith   Mat_SeqMAIJ   *b = (Mat_SeqMAIJ*)A->data;
111066ed3db0SBarry Smith   Mat_SeqAIJ    *a = (Mat_SeqAIJ*)b->AIJ->data;
111187828ca2SBarry Smith   PetscScalar   *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8;
111266ed3db0SBarry Smith   int           ierr,m = b->AIJ->m,n,i,*idx,shift = a->indexshift;
111366ed3db0SBarry Smith 
111466ed3db0SBarry Smith   PetscFunctionBegin;
111566ed3db0SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
111666ed3db0SBarry Smith   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
111766ed3db0SBarry Smith   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
111866ed3db0SBarry Smith   y = y + shift; /* shift for Fortran start by 1 indexing */
111966ed3db0SBarry Smith   for (i=0; i<m; i++) {
112066ed3db0SBarry Smith     idx    = a->j + a->i[i] + shift;
112166ed3db0SBarry Smith     v      = a->a + a->i[i] + shift;
112266ed3db0SBarry Smith     n      = a->i[i+1] - a->i[i];
112366ed3db0SBarry Smith     alpha1 = x[8*i];
112466ed3db0SBarry Smith     alpha2 = x[8*i+1];
112566ed3db0SBarry Smith     alpha3 = x[8*i+2];
112666ed3db0SBarry Smith     alpha4 = x[8*i+3];
112766ed3db0SBarry Smith     alpha5 = x[8*i+4];
112866ed3db0SBarry Smith     alpha6 = x[8*i+5];
112966ed3db0SBarry Smith     alpha7 = x[8*i+6];
113066ed3db0SBarry Smith     alpha8 = x[8*i+7];
113166ed3db0SBarry Smith     while (n-->0) {
113266ed3db0SBarry Smith       y[8*(*idx)]   += alpha1*(*v);
113366ed3db0SBarry Smith       y[8*(*idx)+1] += alpha2*(*v);
113466ed3db0SBarry Smith       y[8*(*idx)+2] += alpha3*(*v);
113566ed3db0SBarry Smith       y[8*(*idx)+3] += alpha4*(*v);
113666ed3db0SBarry Smith       y[8*(*idx)+4] += alpha5*(*v);
113766ed3db0SBarry Smith       y[8*(*idx)+5] += alpha6*(*v);
113866ed3db0SBarry Smith       y[8*(*idx)+6] += alpha7*(*v);
113966ed3db0SBarry Smith       y[8*(*idx)+7] += alpha8*(*v);
114066ed3db0SBarry Smith       idx++; v++;
114166ed3db0SBarry Smith     }
114266ed3db0SBarry Smith   }
114366ed3db0SBarry Smith   PetscLogFlops(16*a->nz);
114466ed3db0SBarry Smith   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
114566ed3db0SBarry Smith   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
114666ed3db0SBarry Smith   PetscFunctionReturn(0);
114766ed3db0SBarry Smith }
114866ed3db0SBarry Smith 
1149f4a53059SBarry Smith /*===================================================================================*/
11504a2ae208SSatish Balay #undef __FUNCT__
11514a2ae208SSatish Balay #define __FUNCT__ "MatMult_MPIMAIJ_dof"
1152f4a53059SBarry Smith int MatMult_MPIMAIJ_dof(Mat A,Vec xx,Vec yy)
1153f4a53059SBarry Smith {
11544cb9d9b8SBarry Smith   Mat_MPIMAIJ *b = (Mat_MPIMAIJ*)A->data;
1155f4a53059SBarry Smith   int         ierr;
1156f4a53059SBarry Smith   PetscFunctionBegin;
1157f4a53059SBarry Smith 
1158f4a53059SBarry Smith   /* start the scatter */
1159f4a53059SBarry Smith   ierr = VecScatterBegin(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
11604cb9d9b8SBarry Smith   ierr = (*b->AIJ->ops->mult)(b->AIJ,xx,yy);CHKERRQ(ierr);
1161f4a53059SBarry Smith   ierr = VecScatterEnd(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
11624cb9d9b8SBarry Smith   ierr = (*b->OAIJ->ops->multadd)(b->OAIJ,b->w,yy,yy);CHKERRQ(ierr);
1163f4a53059SBarry Smith   PetscFunctionReturn(0);
1164f4a53059SBarry Smith }
1165f4a53059SBarry Smith 
11664a2ae208SSatish Balay #undef __FUNCT__
11674a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_MPIMAIJ_dof"
11684cb9d9b8SBarry Smith int MatMultTranspose_MPIMAIJ_dof(Mat A,Vec xx,Vec yy)
11694cb9d9b8SBarry Smith {
11704cb9d9b8SBarry Smith   Mat_MPIMAIJ *b = (Mat_MPIMAIJ*)A->data;
11714cb9d9b8SBarry Smith   int         ierr;
11724cb9d9b8SBarry Smith   PetscFunctionBegin;
11734cb9d9b8SBarry Smith   ierr = (*b->OAIJ->ops->multtranspose)(b->OAIJ,xx,b->w);CHKERRQ(ierr);
11744cb9d9b8SBarry Smith   ierr = VecScatterBegin(b->w,yy,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
11754cb9d9b8SBarry Smith   ierr = (*b->AIJ->ops->multtranspose)(b->AIJ,xx,yy);CHKERRQ(ierr);
11764cb9d9b8SBarry Smith   ierr = VecScatterEnd(b->w,yy,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
11774cb9d9b8SBarry Smith   PetscFunctionReturn(0);
11784cb9d9b8SBarry Smith }
11794cb9d9b8SBarry Smith 
11804a2ae208SSatish Balay #undef __FUNCT__
11814a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_MPIMAIJ_dof"
1182d72c5c08SBarry Smith int MatMultAdd_MPIMAIJ_dof(Mat A,Vec xx,Vec yy,Vec zz)
11834cb9d9b8SBarry Smith {
11844cb9d9b8SBarry Smith   Mat_MPIMAIJ *b = (Mat_MPIMAIJ*)A->data;
11854cb9d9b8SBarry Smith   int         ierr;
11864cb9d9b8SBarry Smith   PetscFunctionBegin;
11874cb9d9b8SBarry Smith 
11884cb9d9b8SBarry Smith   /* start the scatter */
11894cb9d9b8SBarry Smith   ierr = VecScatterBegin(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
1190d72c5c08SBarry Smith   ierr = (*b->AIJ->ops->multadd)(b->AIJ,xx,yy,zz);CHKERRQ(ierr);
11914cb9d9b8SBarry Smith   ierr = VecScatterEnd(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
1192d72c5c08SBarry Smith   ierr = (*b->OAIJ->ops->multadd)(b->OAIJ,b->w,yy,zz);CHKERRQ(ierr);
11934cb9d9b8SBarry Smith   PetscFunctionReturn(0);
11944cb9d9b8SBarry Smith }
11954cb9d9b8SBarry Smith 
11964a2ae208SSatish Balay #undef __FUNCT__
11974a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_MPIMAIJ_dof"
1198d72c5c08SBarry Smith int MatMultTransposeAdd_MPIMAIJ_dof(Mat A,Vec xx,Vec yy,Vec zz)
11994cb9d9b8SBarry Smith {
12004cb9d9b8SBarry Smith   Mat_MPIMAIJ *b = (Mat_MPIMAIJ*)A->data;
12014cb9d9b8SBarry Smith   int         ierr;
12024cb9d9b8SBarry Smith   PetscFunctionBegin;
12034cb9d9b8SBarry Smith   ierr = (*b->OAIJ->ops->multtranspose)(b->OAIJ,xx,b->w);CHKERRQ(ierr);
1204d72c5c08SBarry Smith   ierr = VecScatterBegin(b->w,zz,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
1205d72c5c08SBarry Smith   ierr = (*b->AIJ->ops->multtransposeadd)(b->AIJ,xx,yy,zz);CHKERRQ(ierr);
1206d72c5c08SBarry Smith   ierr = VecScatterEnd(b->w,zz,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
12074cb9d9b8SBarry Smith   PetscFunctionReturn(0);
12084cb9d9b8SBarry Smith }
12094cb9d9b8SBarry Smith 
1210bcc973b7SBarry Smith /* ---------------------------------------------------------------------------------- */
12114a2ae208SSatish Balay #undef __FUNCT__
12124a2ae208SSatish Balay #define __FUNCT__ "MatCreateMAIJ"
1213cd3bbe55SBarry Smith int MatCreateMAIJ(Mat A,int dof,Mat *maij)
121482b1193eSBarry Smith {
1215f4a53059SBarry Smith   int         ierr,size,n;
12164cb9d9b8SBarry Smith   Mat_MPIMAIJ *b;
121782b1193eSBarry Smith   Mat         B;
121882b1193eSBarry Smith 
121982b1193eSBarry Smith   PetscFunctionBegin;
1220d72c5c08SBarry Smith   ierr   = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
1221d72c5c08SBarry Smith 
1222d72c5c08SBarry Smith   if (dof == 1) {
1223d72c5c08SBarry Smith     *maij = A;
1224d72c5c08SBarry Smith   } else {
122583903688SBarry Smith     ierr = MatCreate(A->comm,dof*A->m,dof*A->n,dof*A->M,dof*A->N,&B);CHKERRQ(ierr);
1226cd3bbe55SBarry Smith     B->assembled    = PETSC_TRUE;
1227d72c5c08SBarry Smith 
1228f4a53059SBarry Smith     ierr = MPI_Comm_size(A->comm,&size);CHKERRQ(ierr);
1229f4a53059SBarry Smith     if (size == 1) {
1230b9b97703SBarry Smith       ierr = MatSetType(B,MATSEQMAIJ);CHKERRQ(ierr);
12314cb9d9b8SBarry Smith       B->ops->destroy = MatDestroy_SeqMAIJ;
1232b9b97703SBarry Smith       b      = (Mat_MPIMAIJ*)B->data;
1233b9b97703SBarry Smith       b->dof = dof;
12344cb9d9b8SBarry Smith       b->AIJ = A;
1235d72c5c08SBarry Smith       if (dof == 2) {
1236cd3bbe55SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_2;
1237cd3bbe55SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_2;
1238cd3bbe55SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_2;
1239cd3bbe55SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_2;
1240bcc973b7SBarry Smith       } else if (dof == 3) {
1241bcc973b7SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_3;
1242bcc973b7SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_3;
1243bcc973b7SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_3;
1244bcc973b7SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_3;
1245bcc973b7SBarry Smith       } else if (dof == 4) {
1246bcc973b7SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_4;
1247bcc973b7SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_4;
1248bcc973b7SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_4;
1249bcc973b7SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_4;
1250f9fae5adSBarry Smith       } else if (dof == 5) {
1251f9fae5adSBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_5;
1252f9fae5adSBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_5;
1253f9fae5adSBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_5;
1254f9fae5adSBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_5;
12556cd98798SBarry Smith       } else if (dof == 6) {
12566cd98798SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_6;
12576cd98798SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_6;
12586cd98798SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_6;
12596cd98798SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_6;
126066ed3db0SBarry Smith       } else if (dof == 8) {
126166ed3db0SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_8;
126266ed3db0SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_8;
126366ed3db0SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_8;
126466ed3db0SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_8;
126582b1193eSBarry Smith       } else {
126666ed3db0SBarry Smith         SETERRQ1(1,"Cannot handle a dof of %d. Send request for code to petsc-maint@mcs.anl.gov\n",dof);
126782b1193eSBarry Smith       }
1268f4a53059SBarry Smith     } else {
1269f4a53059SBarry Smith       Mat_MPIAIJ *mpiaij = (Mat_MPIAIJ *)A->data;
1270f4a53059SBarry Smith       IS         from,to;
1271f4a53059SBarry Smith       Vec        gvec;
1272f4a53059SBarry Smith       int        *garray,i;
1273f4a53059SBarry Smith 
1274b9b97703SBarry Smith       ierr = MatSetType(B,MATMPIMAIJ);CHKERRQ(ierr);
1275d72c5c08SBarry Smith       B->ops->destroy = MatDestroy_MPIMAIJ;
1276b9b97703SBarry Smith       b      = (Mat_MPIMAIJ*)B->data;
1277b9b97703SBarry Smith       b->dof = dof;
1278b9b97703SBarry Smith       b->A   = A;
12794cb9d9b8SBarry Smith       ierr = MatCreateMAIJ(mpiaij->A,dof,&b->AIJ);CHKERRQ(ierr);
12804cb9d9b8SBarry Smith       ierr = MatCreateMAIJ(mpiaij->B,dof,&b->OAIJ);CHKERRQ(ierr);
12814cb9d9b8SBarry Smith 
1282f4a53059SBarry Smith       ierr = VecGetSize(mpiaij->lvec,&n);CHKERRQ(ierr);
1283f4a53059SBarry Smith       ierr = VecCreateSeq(PETSC_COMM_SELF,n*dof,&b->w);CHKERRQ(ierr);
1284f4a53059SBarry Smith 
1285f4a53059SBarry Smith       /* create two temporary Index sets for build scatter gather */
1286b0a32e0cSBarry Smith       ierr = PetscMalloc((n+1)*sizeof(int),&garray);CHKERRQ(ierr);
1287f4a53059SBarry Smith       for (i=0; i<n; i++) garray[i] = dof*mpiaij->garray[i];
1288f4a53059SBarry Smith       ierr = ISCreateBlock(A->comm,dof,n,garray,&from);CHKERRQ(ierr);
1289f4a53059SBarry Smith       ierr = PetscFree(garray);CHKERRQ(ierr);
1290f4a53059SBarry Smith       ierr = ISCreateStride(PETSC_COMM_SELF,n*dof,0,1,&to);CHKERRQ(ierr);
1291f4a53059SBarry Smith 
1292f4a53059SBarry Smith       /* create temporary global vector to generate scatter context */
1293f4a53059SBarry Smith       ierr = VecCreateMPI(A->comm,dof*A->n,dof*A->N,&gvec);CHKERRQ(ierr);
1294f4a53059SBarry Smith 
1295f4a53059SBarry Smith       /* generate the scatter context */
1296f4a53059SBarry Smith       ierr = VecScatterCreate(gvec,from,b->w,to,&b->ctx);CHKERRQ(ierr);
1297f4a53059SBarry Smith 
1298f4a53059SBarry Smith       ierr = ISDestroy(from);CHKERRQ(ierr);
1299f4a53059SBarry Smith       ierr = ISDestroy(to);CHKERRQ(ierr);
1300f4a53059SBarry Smith       ierr = VecDestroy(gvec);CHKERRQ(ierr);
1301f4a53059SBarry Smith 
1302f4a53059SBarry Smith       B->ops->mult             = MatMult_MPIMAIJ_dof;
13034cb9d9b8SBarry Smith       B->ops->multtranspose    = MatMultTranspose_MPIMAIJ_dof;
13044cb9d9b8SBarry Smith       B->ops->multadd          = MatMultAdd_MPIMAIJ_dof;
13054cb9d9b8SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_MPIMAIJ_dof;
1306f4a53059SBarry Smith     }
1307cd3bbe55SBarry Smith     *maij = B;
1308d72c5c08SBarry Smith   }
130982b1193eSBarry Smith   PetscFunctionReturn(0);
131082b1193eSBarry Smith }
131182b1193eSBarry Smith 
131282b1193eSBarry Smith 
131382b1193eSBarry Smith 
131482b1193eSBarry Smith 
131582b1193eSBarry Smith 
131682b1193eSBarry Smith 
131782b1193eSBarry Smith 
131882b1193eSBarry Smith 
131982b1193eSBarry Smith 
132082b1193eSBarry Smith 
132182b1193eSBarry Smith 
132282b1193eSBarry Smith 
1323