xref: /petsc/src/mat/impls/maij/maij.c (revision 717f2ec815c60d7135d3347364aec8a6bee7edb7)
182b1193eSBarry Smith /*
2cd3bbe55SBarry Smith     Defines the basic matrix operations for the MAIJ  matrix storage format.
3cd3bbe55SBarry Smith   This format is used for restriction and interpolation operations for
4cd3bbe55SBarry Smith   multicomponent problems. It interpolates each component the same way
5cd3bbe55SBarry Smith   independently.
6cd3bbe55SBarry Smith 
7cd3bbe55SBarry Smith      We provide:
8cd3bbe55SBarry Smith          MatMult()
9cd3bbe55SBarry Smith          MatMultTranspose()
10cd3bbe55SBarry Smith          MatMultTransposeAdd()
11cd3bbe55SBarry Smith          MatMultAdd()
12cd3bbe55SBarry Smith           and
13cd3bbe55SBarry Smith          MatCreateMAIJ(Mat,dof,Mat*)
14f4a53059SBarry Smith 
15f4a53059SBarry Smith      This single directory handles both the sequential and parallel codes
1682b1193eSBarry Smith */
1782b1193eSBarry Smith 
18be911618SKris Buschelman #include "src/mat/impls/maij/maij.h"
193c94ec11SBarry Smith #include "vecimpl.h"
2082b1193eSBarry Smith 
214a2ae208SSatish Balay #undef __FUNCT__
224a2ae208SSatish Balay #define __FUNCT__ "MatMAIJGetAIJ"
23dfbe8321SBarry Smith PetscErrorCode MatMAIJGetAIJ(Mat A,Mat *B)
24b9b97703SBarry Smith {
25dfbe8321SBarry Smith   PetscErrorCode 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"
47b24ad042SBarry Smith PetscErrorCode MatMAIJRedimension(Mat A,PetscInt dof,Mat *B)
48b9b97703SBarry Smith {
49dfbe8321SBarry Smith   PetscErrorCode 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"
60dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqMAIJ(Mat A)
6182b1193eSBarry Smith {
62dfbe8321SBarry Smith   PetscErrorCode 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__
740fd73130SBarry Smith #define __FUNCT__ "MatView_SeqMAIJ"
750fd73130SBarry Smith PetscErrorCode MatView_SeqMAIJ(Mat A,PetscViewer viewer)
760fd73130SBarry Smith {
770fd73130SBarry Smith   PetscErrorCode ierr;
780fd73130SBarry Smith   Mat            B;
790fd73130SBarry Smith 
800fd73130SBarry Smith   PetscFunctionBegin;
810fd73130SBarry Smith   ierr = MatConvert(A,MATSEQAIJ,&B);
820fd73130SBarry Smith   ierr = MatView(B,viewer);CHKERRQ(ierr);
830fd73130SBarry Smith   ierr = MatDestroy(B);CHKERRQ(ierr);
840fd73130SBarry Smith   PetscFunctionReturn(0);
850fd73130SBarry Smith }
860fd73130SBarry Smith 
870fd73130SBarry Smith #undef __FUNCT__
880fd73130SBarry Smith #define __FUNCT__ "MatView_MPIMAIJ"
890fd73130SBarry Smith PetscErrorCode MatView_MPIMAIJ(Mat A,PetscViewer viewer)
900fd73130SBarry Smith {
910fd73130SBarry Smith   PetscErrorCode ierr;
920fd73130SBarry Smith   Mat            B;
930fd73130SBarry Smith 
940fd73130SBarry Smith   PetscFunctionBegin;
950fd73130SBarry Smith   ierr = MatConvert(A,MATMPIAIJ,&B);
960fd73130SBarry Smith   ierr = MatView(B,viewer);CHKERRQ(ierr);
970fd73130SBarry Smith   ierr = MatDestroy(B);CHKERRQ(ierr);
980fd73130SBarry Smith   PetscFunctionReturn(0);
990fd73130SBarry Smith }
1000fd73130SBarry Smith 
1010fd73130SBarry Smith #undef __FUNCT__
1024a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_MPIMAIJ"
103dfbe8321SBarry Smith PetscErrorCode MatDestroy_MPIMAIJ(Mat A)
1044cb9d9b8SBarry Smith {
105dfbe8321SBarry Smith   PetscErrorCode ierr;
1064cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b = (Mat_MPIMAIJ*)A->data;
1074cb9d9b8SBarry Smith 
1084cb9d9b8SBarry Smith   PetscFunctionBegin;
1094cb9d9b8SBarry Smith   if (b->AIJ) {
1104cb9d9b8SBarry Smith     ierr = MatDestroy(b->AIJ);CHKERRQ(ierr);
1114cb9d9b8SBarry Smith   }
112f4a53059SBarry Smith   if (b->OAIJ) {
113f4a53059SBarry Smith     ierr = MatDestroy(b->OAIJ);CHKERRQ(ierr);
114f4a53059SBarry Smith   }
115b9b97703SBarry Smith   if (b->A) {
116b9b97703SBarry Smith     ierr = MatDestroy(b->A);CHKERRQ(ierr);
117b9b97703SBarry Smith   }
118f4a53059SBarry Smith   if (b->ctx) {
119f4a53059SBarry Smith     ierr = VecScatterDestroy(b->ctx);CHKERRQ(ierr);
120f4a53059SBarry Smith   }
121f4a53059SBarry Smith   if (b->w) {
122f4a53059SBarry Smith     ierr = VecDestroy(b->w);CHKERRQ(ierr);
123f4a53059SBarry Smith   }
124cd3bbe55SBarry Smith   ierr = PetscFree(b);CHKERRQ(ierr);
125b9b97703SBarry Smith   PetscFunctionReturn(0);
126b9b97703SBarry Smith }
127b9b97703SBarry Smith 
1280bad9183SKris Buschelman /*MC
129fafad747SKris Buschelman   MATMAIJ - MATMAIJ = "maij" - A matrix type to be used for restriction and interpolation operations for
1300bad9183SKris Buschelman   multicomponent problems, interpolating or restricting each component the same way independently.
1310bad9183SKris Buschelman   The matrix type is based on MATSEQAIJ for sequential matrices, and MATMPIAIJ for distributed matrices.
1320bad9183SKris Buschelman 
1330bad9183SKris Buschelman   Operations provided:
1340bad9183SKris Buschelman . MatMult
1350bad9183SKris Buschelman . MatMultTranspose
1360bad9183SKris Buschelman . MatMultAdd
1370bad9183SKris Buschelman . MatMultTransposeAdd
1380bad9183SKris Buschelman 
1390bad9183SKris Buschelman   Level: advanced
1400bad9183SKris Buschelman 
1410bad9183SKris Buschelman .seealso: MatCreateSeqDense
1420bad9183SKris Buschelman M*/
1430bad9183SKris Buschelman 
14482b1193eSBarry Smith EXTERN_C_BEGIN
1454a2ae208SSatish Balay #undef __FUNCT__
1464a2ae208SSatish Balay #define __FUNCT__ "MatCreate_MAIJ"
147dfbe8321SBarry Smith PetscErrorCode MatCreate_MAIJ(Mat A)
14882b1193eSBarry Smith {
149dfbe8321SBarry Smith   PetscErrorCode ierr;
1504cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b;
15182b1193eSBarry Smith 
15282b1193eSBarry Smith   PetscFunctionBegin;
153b0a32e0cSBarry Smith   ierr     = PetscNew(Mat_MPIMAIJ,&b);CHKERRQ(ierr);
154b0a32e0cSBarry Smith   A->data  = (void*)b;
155cd3bbe55SBarry Smith   ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr);
156cd3bbe55SBarry Smith   A->factor           = 0;
157cd3bbe55SBarry Smith   A->mapping          = 0;
158f4a53059SBarry Smith 
159cd3bbe55SBarry Smith   b->AIJ  = 0;
160cd3bbe55SBarry Smith   b->dof  = 0;
161f4a53059SBarry Smith   b->OAIJ = 0;
162f4a53059SBarry Smith   b->ctx  = 0;
163f4a53059SBarry Smith   b->w    = 0;
16482b1193eSBarry Smith   PetscFunctionReturn(0);
16582b1193eSBarry Smith }
16682b1193eSBarry Smith EXTERN_C_END
16782b1193eSBarry Smith 
168cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/
1694a2ae208SSatish Balay #undef __FUNCT__
170b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_2"
171dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
17282b1193eSBarry Smith {
1734cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
174bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
17587828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2;
176dfbe8321SBarry Smith   PetscErrorCode ierr;
177b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
178b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
17982b1193eSBarry Smith 
180bcc973b7SBarry Smith   PetscFunctionBegin;
1811ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
1821ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
183bcc973b7SBarry Smith   idx  = a->j;
184bcc973b7SBarry Smith   v    = a->a;
185bcc973b7SBarry Smith   ii   = a->i;
186bcc973b7SBarry Smith 
187bcc973b7SBarry Smith   for (i=0; i<m; i++) {
188bcc973b7SBarry Smith     jrow = ii[i];
189bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
190bcc973b7SBarry Smith     sum1  = 0.0;
191bcc973b7SBarry Smith     sum2  = 0.0;
192bcc973b7SBarry Smith     for (j=0; j<n; j++) {
193bcc973b7SBarry Smith       sum1 += v[jrow]*x[2*idx[jrow]];
194bcc973b7SBarry Smith       sum2 += v[jrow]*x[2*idx[jrow]+1];
195bcc973b7SBarry Smith       jrow++;
196bcc973b7SBarry Smith      }
197bcc973b7SBarry Smith     y[2*i]   = sum1;
198bcc973b7SBarry Smith     y[2*i+1] = sum2;
199bcc973b7SBarry Smith   }
200bcc973b7SBarry Smith 
201b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*m);
2021ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2031ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
20482b1193eSBarry Smith   PetscFunctionReturn(0);
20582b1193eSBarry Smith }
206bcc973b7SBarry Smith 
2074a2ae208SSatish Balay #undef __FUNCT__
208b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_2"
209dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
21082b1193eSBarry Smith {
2114cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
212bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
21387828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,zero = 0.0;
214dfbe8321SBarry Smith   PetscErrorCode ierr;
215b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
21682b1193eSBarry Smith 
217bcc973b7SBarry Smith   PetscFunctionBegin;
218bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
2191ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2201ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
221bfec09a0SHong Zhang 
222bcc973b7SBarry Smith   for (i=0; i<m; i++) {
223bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
224bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
225bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
226bcc973b7SBarry Smith     alpha1 = x[2*i];
227bcc973b7SBarry Smith     alpha2 = x[2*i+1];
228bcc973b7SBarry Smith     while (n-->0) {y[2*(*idx)] += alpha1*(*v); y[2*(*idx)+1] += alpha2*(*v); idx++; v++;}
229bcc973b7SBarry Smith   }
230b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*b->AIJ->n);
2311ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2321ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
23382b1193eSBarry Smith   PetscFunctionReturn(0);
23482b1193eSBarry Smith }
235bcc973b7SBarry Smith 
2364a2ae208SSatish Balay #undef __FUNCT__
237b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_2"
238dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
23982b1193eSBarry Smith {
2404cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
241bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
24287828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2;
243dfbe8321SBarry Smith   PetscErrorCode ierr;
244b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
245b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
24682b1193eSBarry Smith 
247bcc973b7SBarry Smith   PetscFunctionBegin;
248f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
2491ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2501ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
251bcc973b7SBarry Smith   idx  = a->j;
252bcc973b7SBarry Smith   v    = a->a;
253bcc973b7SBarry Smith   ii   = a->i;
254bcc973b7SBarry Smith 
255bcc973b7SBarry Smith   for (i=0; i<m; i++) {
256bcc973b7SBarry Smith     jrow = ii[i];
257bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
258bcc973b7SBarry Smith     sum1  = 0.0;
259bcc973b7SBarry Smith     sum2  = 0.0;
260bcc973b7SBarry Smith     for (j=0; j<n; j++) {
261bcc973b7SBarry Smith       sum1 += v[jrow]*x[2*idx[jrow]];
262bcc973b7SBarry Smith       sum2 += v[jrow]*x[2*idx[jrow]+1];
263bcc973b7SBarry Smith       jrow++;
264bcc973b7SBarry Smith      }
265bcc973b7SBarry Smith     y[2*i]   += sum1;
266bcc973b7SBarry Smith     y[2*i+1] += sum2;
267bcc973b7SBarry Smith   }
268bcc973b7SBarry Smith 
269b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*m);
2701ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2711ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
272bcc973b7SBarry Smith   PetscFunctionReturn(0);
27382b1193eSBarry Smith }
2744a2ae208SSatish Balay #undef __FUNCT__
275b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_2"
276dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
27782b1193eSBarry Smith {
2784cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
279bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
28087828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2;
281dfbe8321SBarry Smith   PetscErrorCode ierr;
282b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
28382b1193eSBarry Smith 
284bcc973b7SBarry Smith   PetscFunctionBegin;
285f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
2861ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
2871ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
288bfec09a0SHong Zhang 
289bcc973b7SBarry Smith   for (i=0; i<m; i++) {
290bfec09a0SHong Zhang     idx   = a->j + a->i[i] ;
291bfec09a0SHong Zhang     v     = a->a + a->i[i] ;
292bcc973b7SBarry Smith     n     = a->i[i+1] - a->i[i];
293bcc973b7SBarry Smith     alpha1 = x[2*i];
294bcc973b7SBarry Smith     alpha2 = x[2*i+1];
295bcc973b7SBarry Smith     while (n-->0) {y[2*(*idx)] += alpha1*(*v); y[2*(*idx)+1] += alpha2*(*v); idx++; v++;}
296bcc973b7SBarry Smith   }
297b0a32e0cSBarry Smith   PetscLogFlops(4*a->nz - 2*b->AIJ->n);
2981ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
2991ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
300bcc973b7SBarry Smith   PetscFunctionReturn(0);
30182b1193eSBarry Smith }
302cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/
3034a2ae208SSatish Balay #undef __FUNCT__
304b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_3"
305dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_3(Mat A,Vec xx,Vec yy)
306bcc973b7SBarry Smith {
3074cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
308bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
30987828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3;
310dfbe8321SBarry Smith   PetscErrorCode ierr;
311b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
312b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
31382b1193eSBarry Smith 
314bcc973b7SBarry Smith   PetscFunctionBegin;
3151ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3161ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
317bcc973b7SBarry Smith   idx  = a->j;
318bcc973b7SBarry Smith   v    = a->a;
319bcc973b7SBarry Smith   ii   = a->i;
320bcc973b7SBarry Smith 
321bcc973b7SBarry Smith   for (i=0; i<m; i++) {
322bcc973b7SBarry Smith     jrow = ii[i];
323bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
324bcc973b7SBarry Smith     sum1  = 0.0;
325bcc973b7SBarry Smith     sum2  = 0.0;
326bcc973b7SBarry Smith     sum3  = 0.0;
327bcc973b7SBarry Smith     for (j=0; j<n; j++) {
328bcc973b7SBarry Smith       sum1 += v[jrow]*x[3*idx[jrow]];
329bcc973b7SBarry Smith       sum2 += v[jrow]*x[3*idx[jrow]+1];
330bcc973b7SBarry Smith       sum3 += v[jrow]*x[3*idx[jrow]+2];
331bcc973b7SBarry Smith       jrow++;
332bcc973b7SBarry Smith      }
333bcc973b7SBarry Smith     y[3*i]   = sum1;
334bcc973b7SBarry Smith     y[3*i+1] = sum2;
335bcc973b7SBarry Smith     y[3*i+2] = sum3;
336bcc973b7SBarry Smith   }
337bcc973b7SBarry Smith 
338b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz - 3*m);
3391ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3401ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
341bcc973b7SBarry Smith   PetscFunctionReturn(0);
342bcc973b7SBarry Smith }
343bcc973b7SBarry Smith 
3444a2ae208SSatish Balay #undef __FUNCT__
345b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_3"
346dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_3(Mat A,Vec xx,Vec yy)
347bcc973b7SBarry Smith {
3484cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
349bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
35087828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,zero = 0.0;
351dfbe8321SBarry Smith   PetscErrorCode ierr;
352b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
353bcc973b7SBarry Smith 
354bcc973b7SBarry Smith   PetscFunctionBegin;
355bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
3561ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3571ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
358bfec09a0SHong Zhang 
359bcc973b7SBarry Smith   for (i=0; i<m; i++) {
360bfec09a0SHong Zhang     idx    = a->j + a->i[i];
361bfec09a0SHong Zhang     v      = a->a + a->i[i];
362bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
363bcc973b7SBarry Smith     alpha1 = x[3*i];
364bcc973b7SBarry Smith     alpha2 = x[3*i+1];
365bcc973b7SBarry Smith     alpha3 = x[3*i+2];
366bcc973b7SBarry Smith     while (n-->0) {
367bcc973b7SBarry Smith       y[3*(*idx)]   += alpha1*(*v);
368bcc973b7SBarry Smith       y[3*(*idx)+1] += alpha2*(*v);
369bcc973b7SBarry Smith       y[3*(*idx)+2] += alpha3*(*v);
370bcc973b7SBarry Smith       idx++; v++;
371bcc973b7SBarry Smith     }
372bcc973b7SBarry Smith   }
373b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz - 3*b->AIJ->n);
3741ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
3751ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
376bcc973b7SBarry Smith   PetscFunctionReturn(0);
377bcc973b7SBarry Smith }
378bcc973b7SBarry Smith 
3794a2ae208SSatish Balay #undef __FUNCT__
380b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_3"
381dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_3(Mat A,Vec xx,Vec yy,Vec zz)
382bcc973b7SBarry Smith {
3834cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
384bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
38587828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3;
386dfbe8321SBarry Smith   PetscErrorCode ierr;
387b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
388b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
389bcc973b7SBarry Smith 
390bcc973b7SBarry Smith   PetscFunctionBegin;
391f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
3921ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
3931ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
394bcc973b7SBarry Smith   idx  = a->j;
395bcc973b7SBarry Smith   v    = a->a;
396bcc973b7SBarry Smith   ii   = a->i;
397bcc973b7SBarry Smith 
398bcc973b7SBarry Smith   for (i=0; i<m; i++) {
399bcc973b7SBarry Smith     jrow = ii[i];
400bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
401bcc973b7SBarry Smith     sum1  = 0.0;
402bcc973b7SBarry Smith     sum2  = 0.0;
403bcc973b7SBarry Smith     sum3  = 0.0;
404bcc973b7SBarry Smith     for (j=0; j<n; j++) {
405bcc973b7SBarry Smith       sum1 += v[jrow]*x[3*idx[jrow]];
406bcc973b7SBarry Smith       sum2 += v[jrow]*x[3*idx[jrow]+1];
407bcc973b7SBarry Smith       sum3 += v[jrow]*x[3*idx[jrow]+2];
408bcc973b7SBarry Smith       jrow++;
409bcc973b7SBarry Smith      }
410bcc973b7SBarry Smith     y[3*i]   += sum1;
411bcc973b7SBarry Smith     y[3*i+1] += sum2;
412bcc973b7SBarry Smith     y[3*i+2] += sum3;
413bcc973b7SBarry Smith   }
414bcc973b7SBarry Smith 
415b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz);
4161ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4171ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
418bcc973b7SBarry Smith   PetscFunctionReturn(0);
419bcc973b7SBarry Smith }
4204a2ae208SSatish Balay #undef __FUNCT__
421b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_3"
422dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_3(Mat A,Vec xx,Vec yy,Vec zz)
423bcc973b7SBarry Smith {
4244cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
425bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
42687828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3;
427dfbe8321SBarry Smith   PetscErrorCode ierr;
428b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
429bcc973b7SBarry Smith 
430bcc973b7SBarry Smith   PetscFunctionBegin;
431f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
4321ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
4331ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
434bcc973b7SBarry Smith   for (i=0; i<m; i++) {
435bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
436bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
437bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
438bcc973b7SBarry Smith     alpha1 = x[3*i];
439bcc973b7SBarry Smith     alpha2 = x[3*i+1];
440bcc973b7SBarry Smith     alpha3 = x[3*i+2];
441bcc973b7SBarry Smith     while (n-->0) {
442bcc973b7SBarry Smith       y[3*(*idx)]   += alpha1*(*v);
443bcc973b7SBarry Smith       y[3*(*idx)+1] += alpha2*(*v);
444bcc973b7SBarry Smith       y[3*(*idx)+2] += alpha3*(*v);
445bcc973b7SBarry Smith       idx++; v++;
446bcc973b7SBarry Smith     }
447bcc973b7SBarry Smith   }
448b0a32e0cSBarry Smith   PetscLogFlops(6*a->nz);
4491ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4501ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
451bcc973b7SBarry Smith   PetscFunctionReturn(0);
452bcc973b7SBarry Smith }
453bcc973b7SBarry Smith 
454bcc973b7SBarry Smith /* ------------------------------------------------------------------------------*/
4554a2ae208SSatish Balay #undef __FUNCT__
456b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_4"
457dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_4(Mat A,Vec xx,Vec yy)
458bcc973b7SBarry Smith {
4594cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
460bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
46187828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4;
462dfbe8321SBarry Smith   PetscErrorCode ierr;
463b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
464b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
465bcc973b7SBarry Smith 
466bcc973b7SBarry Smith   PetscFunctionBegin;
4671ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
4681ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
469bcc973b7SBarry Smith   idx  = a->j;
470bcc973b7SBarry Smith   v    = a->a;
471bcc973b7SBarry Smith   ii   = a->i;
472bcc973b7SBarry Smith 
473bcc973b7SBarry Smith   for (i=0; i<m; i++) {
474bcc973b7SBarry Smith     jrow = ii[i];
475bcc973b7SBarry Smith     n    = ii[i+1] - jrow;
476bcc973b7SBarry Smith     sum1  = 0.0;
477bcc973b7SBarry Smith     sum2  = 0.0;
478bcc973b7SBarry Smith     sum3  = 0.0;
479bcc973b7SBarry Smith     sum4  = 0.0;
480bcc973b7SBarry Smith     for (j=0; j<n; j++) {
481bcc973b7SBarry Smith       sum1 += v[jrow]*x[4*idx[jrow]];
482bcc973b7SBarry Smith       sum2 += v[jrow]*x[4*idx[jrow]+1];
483bcc973b7SBarry Smith       sum3 += v[jrow]*x[4*idx[jrow]+2];
484bcc973b7SBarry Smith       sum4 += v[jrow]*x[4*idx[jrow]+3];
485bcc973b7SBarry Smith       jrow++;
486bcc973b7SBarry Smith      }
487bcc973b7SBarry Smith     y[4*i]   = sum1;
488bcc973b7SBarry Smith     y[4*i+1] = sum2;
489bcc973b7SBarry Smith     y[4*i+2] = sum3;
490bcc973b7SBarry Smith     y[4*i+3] = sum4;
491bcc973b7SBarry Smith   }
492bcc973b7SBarry Smith 
493b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*m);
4941ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
4951ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
496bcc973b7SBarry Smith   PetscFunctionReturn(0);
497bcc973b7SBarry Smith }
498bcc973b7SBarry Smith 
4994a2ae208SSatish Balay #undef __FUNCT__
500b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_4"
501dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_4(Mat A,Vec xx,Vec yy)
502bcc973b7SBarry Smith {
5034cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
504bcc973b7SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
50587828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,zero = 0.0;
506dfbe8321SBarry Smith   PetscErrorCode ierr;
507b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
508bcc973b7SBarry Smith 
509bcc973b7SBarry Smith   PetscFunctionBegin;
510bcc973b7SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
5111ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5121ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
513bcc973b7SBarry Smith   for (i=0; i<m; i++) {
514bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
515bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
516bcc973b7SBarry Smith     n      = a->i[i+1] - a->i[i];
517bcc973b7SBarry Smith     alpha1 = x[4*i];
518bcc973b7SBarry Smith     alpha2 = x[4*i+1];
519bcc973b7SBarry Smith     alpha3 = x[4*i+2];
520bcc973b7SBarry Smith     alpha4 = x[4*i+3];
521bcc973b7SBarry Smith     while (n-->0) {
522bcc973b7SBarry Smith       y[4*(*idx)]   += alpha1*(*v);
523bcc973b7SBarry Smith       y[4*(*idx)+1] += alpha2*(*v);
524bcc973b7SBarry Smith       y[4*(*idx)+2] += alpha3*(*v);
525bcc973b7SBarry Smith       y[4*(*idx)+3] += alpha4*(*v);
526bcc973b7SBarry Smith       idx++; v++;
527bcc973b7SBarry Smith     }
528bcc973b7SBarry Smith   }
529b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*b->AIJ->n);
5301ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5311ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
532bcc973b7SBarry Smith   PetscFunctionReturn(0);
533bcc973b7SBarry Smith }
534bcc973b7SBarry Smith 
5354a2ae208SSatish Balay #undef __FUNCT__
536b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_4"
537dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_4(Mat A,Vec xx,Vec yy,Vec zz)
538bcc973b7SBarry Smith {
5394cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
540f9fae5adSBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
54187828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4;
542dfbe8321SBarry Smith   PetscErrorCode ierr;
543b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
544b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
545f9fae5adSBarry Smith 
546f9fae5adSBarry Smith   PetscFunctionBegin;
547f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
5481ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5491ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
550f9fae5adSBarry Smith   idx  = a->j;
551f9fae5adSBarry Smith   v    = a->a;
552f9fae5adSBarry Smith   ii   = a->i;
553f9fae5adSBarry Smith 
554f9fae5adSBarry Smith   for (i=0; i<m; i++) {
555f9fae5adSBarry Smith     jrow = ii[i];
556f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
557f9fae5adSBarry Smith     sum1  = 0.0;
558f9fae5adSBarry Smith     sum2  = 0.0;
559f9fae5adSBarry Smith     sum3  = 0.0;
560f9fae5adSBarry Smith     sum4  = 0.0;
561f9fae5adSBarry Smith     for (j=0; j<n; j++) {
562f9fae5adSBarry Smith       sum1 += v[jrow]*x[4*idx[jrow]];
563f9fae5adSBarry Smith       sum2 += v[jrow]*x[4*idx[jrow]+1];
564f9fae5adSBarry Smith       sum3 += v[jrow]*x[4*idx[jrow]+2];
565f9fae5adSBarry Smith       sum4 += v[jrow]*x[4*idx[jrow]+3];
566f9fae5adSBarry Smith       jrow++;
567f9fae5adSBarry Smith      }
568f9fae5adSBarry Smith     y[4*i]   += sum1;
569f9fae5adSBarry Smith     y[4*i+1] += sum2;
570f9fae5adSBarry Smith     y[4*i+2] += sum3;
571f9fae5adSBarry Smith     y[4*i+3] += sum4;
572f9fae5adSBarry Smith   }
573f9fae5adSBarry Smith 
574b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*m);
5751ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
5761ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
577f9fae5adSBarry Smith   PetscFunctionReturn(0);
578bcc973b7SBarry Smith }
5794a2ae208SSatish Balay #undef __FUNCT__
580b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_4"
581dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_4(Mat A,Vec xx,Vec yy,Vec zz)
582bcc973b7SBarry Smith {
5834cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
584f9fae5adSBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
58587828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4;
586dfbe8321SBarry Smith   PetscErrorCode ierr;
587b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
588f9fae5adSBarry Smith 
589f9fae5adSBarry Smith   PetscFunctionBegin;
590f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
5911ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
5921ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
593bfec09a0SHong Zhang 
594f9fae5adSBarry Smith   for (i=0; i<m; i++) {
595bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
596bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
597f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
598f9fae5adSBarry Smith     alpha1 = x[4*i];
599f9fae5adSBarry Smith     alpha2 = x[4*i+1];
600f9fae5adSBarry Smith     alpha3 = x[4*i+2];
601f9fae5adSBarry Smith     alpha4 = x[4*i+3];
602f9fae5adSBarry Smith     while (n-->0) {
603f9fae5adSBarry Smith       y[4*(*idx)]   += alpha1*(*v);
604f9fae5adSBarry Smith       y[4*(*idx)+1] += alpha2*(*v);
605f9fae5adSBarry Smith       y[4*(*idx)+2] += alpha3*(*v);
606f9fae5adSBarry Smith       y[4*(*idx)+3] += alpha4*(*v);
607f9fae5adSBarry Smith       idx++; v++;
608f9fae5adSBarry Smith     }
609f9fae5adSBarry Smith   }
610b0a32e0cSBarry Smith   PetscLogFlops(8*a->nz - 4*b->AIJ->n);
6111ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6121ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
613f9fae5adSBarry Smith   PetscFunctionReturn(0);
614f9fae5adSBarry Smith }
615f9fae5adSBarry Smith /* ------------------------------------------------------------------------------*/
6166cd98798SBarry Smith 
6174a2ae208SSatish Balay #undef __FUNCT__
618b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_5"
619dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_5(Mat A,Vec xx,Vec yy)
620f9fae5adSBarry Smith {
6214cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
622f9fae5adSBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
62387828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5;
624dfbe8321SBarry Smith   PetscErrorCode ierr;
625b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
626b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
627f9fae5adSBarry Smith 
628f9fae5adSBarry Smith   PetscFunctionBegin;
6291ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6301ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
631f9fae5adSBarry Smith   idx  = a->j;
632f9fae5adSBarry Smith   v    = a->a;
633f9fae5adSBarry Smith   ii   = a->i;
634f9fae5adSBarry Smith 
635f9fae5adSBarry Smith   for (i=0; i<m; i++) {
636f9fae5adSBarry Smith     jrow = ii[i];
637f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
638f9fae5adSBarry Smith     sum1  = 0.0;
639f9fae5adSBarry Smith     sum2  = 0.0;
640f9fae5adSBarry Smith     sum3  = 0.0;
641f9fae5adSBarry Smith     sum4  = 0.0;
642f9fae5adSBarry Smith     sum5  = 0.0;
643f9fae5adSBarry Smith     for (j=0; j<n; j++) {
644f9fae5adSBarry Smith       sum1 += v[jrow]*x[5*idx[jrow]];
645f9fae5adSBarry Smith       sum2 += v[jrow]*x[5*idx[jrow]+1];
646f9fae5adSBarry Smith       sum3 += v[jrow]*x[5*idx[jrow]+2];
647f9fae5adSBarry Smith       sum4 += v[jrow]*x[5*idx[jrow]+3];
648f9fae5adSBarry Smith       sum5 += v[jrow]*x[5*idx[jrow]+4];
649f9fae5adSBarry Smith       jrow++;
650f9fae5adSBarry Smith      }
651f9fae5adSBarry Smith     y[5*i]   = sum1;
652f9fae5adSBarry Smith     y[5*i+1] = sum2;
653f9fae5adSBarry Smith     y[5*i+2] = sum3;
654f9fae5adSBarry Smith     y[5*i+3] = sum4;
655f9fae5adSBarry Smith     y[5*i+4] = sum5;
656f9fae5adSBarry Smith   }
657f9fae5adSBarry Smith 
658b0a32e0cSBarry Smith   PetscLogFlops(10*a->nz - 5*m);
6591ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6601ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
661f9fae5adSBarry Smith   PetscFunctionReturn(0);
662f9fae5adSBarry Smith }
663f9fae5adSBarry Smith 
6644a2ae208SSatish Balay #undef __FUNCT__
665b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_5"
666dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_5(Mat A,Vec xx,Vec yy)
667f9fae5adSBarry Smith {
6684cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
669f9fae5adSBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
67087828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,zero = 0.0;
671dfbe8321SBarry Smith   PetscErrorCode ierr;
672b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
673f9fae5adSBarry Smith 
674f9fae5adSBarry Smith   PetscFunctionBegin;
675f9fae5adSBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
6761ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
6771ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
678bfec09a0SHong Zhang 
679f9fae5adSBarry Smith   for (i=0; i<m; i++) {
680bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
681bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
682f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
683f9fae5adSBarry Smith     alpha1 = x[5*i];
684f9fae5adSBarry Smith     alpha2 = x[5*i+1];
685f9fae5adSBarry Smith     alpha3 = x[5*i+2];
686f9fae5adSBarry Smith     alpha4 = x[5*i+3];
687f9fae5adSBarry Smith     alpha5 = x[5*i+4];
688f9fae5adSBarry Smith     while (n-->0) {
689f9fae5adSBarry Smith       y[5*(*idx)]   += alpha1*(*v);
690f9fae5adSBarry Smith       y[5*(*idx)+1] += alpha2*(*v);
691f9fae5adSBarry Smith       y[5*(*idx)+2] += alpha3*(*v);
692f9fae5adSBarry Smith       y[5*(*idx)+3] += alpha4*(*v);
693f9fae5adSBarry Smith       y[5*(*idx)+4] += alpha5*(*v);
694f9fae5adSBarry Smith       idx++; v++;
695f9fae5adSBarry Smith     }
696f9fae5adSBarry Smith   }
697b0a32e0cSBarry Smith   PetscLogFlops(10*a->nz - 5*b->AIJ->n);
6981ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6991ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
700f9fae5adSBarry Smith   PetscFunctionReturn(0);
701f9fae5adSBarry Smith }
702f9fae5adSBarry Smith 
7034a2ae208SSatish Balay #undef __FUNCT__
704b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_5"
705dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_5(Mat A,Vec xx,Vec yy,Vec zz)
706f9fae5adSBarry Smith {
7074cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
708f9fae5adSBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
70987828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5;
710dfbe8321SBarry Smith   PetscErrorCode ierr;
711b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
712b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
713f9fae5adSBarry Smith 
714f9fae5adSBarry Smith   PetscFunctionBegin;
715f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
7161ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
7171ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
718f9fae5adSBarry Smith   idx  = a->j;
719f9fae5adSBarry Smith   v    = a->a;
720f9fae5adSBarry Smith   ii   = a->i;
721f9fae5adSBarry Smith 
722f9fae5adSBarry Smith   for (i=0; i<m; i++) {
723f9fae5adSBarry Smith     jrow = ii[i];
724f9fae5adSBarry Smith     n    = ii[i+1] - jrow;
725f9fae5adSBarry Smith     sum1  = 0.0;
726f9fae5adSBarry Smith     sum2  = 0.0;
727f9fae5adSBarry Smith     sum3  = 0.0;
728f9fae5adSBarry Smith     sum4  = 0.0;
729f9fae5adSBarry Smith     sum5  = 0.0;
730f9fae5adSBarry Smith     for (j=0; j<n; j++) {
731f9fae5adSBarry Smith       sum1 += v[jrow]*x[5*idx[jrow]];
732f9fae5adSBarry Smith       sum2 += v[jrow]*x[5*idx[jrow]+1];
733f9fae5adSBarry Smith       sum3 += v[jrow]*x[5*idx[jrow]+2];
734f9fae5adSBarry Smith       sum4 += v[jrow]*x[5*idx[jrow]+3];
735f9fae5adSBarry Smith       sum5 += v[jrow]*x[5*idx[jrow]+4];
736f9fae5adSBarry Smith       jrow++;
737f9fae5adSBarry Smith      }
738f9fae5adSBarry Smith     y[5*i]   += sum1;
739f9fae5adSBarry Smith     y[5*i+1] += sum2;
740f9fae5adSBarry Smith     y[5*i+2] += sum3;
741f9fae5adSBarry Smith     y[5*i+3] += sum4;
742f9fae5adSBarry Smith     y[5*i+4] += sum5;
743f9fae5adSBarry Smith   }
744f9fae5adSBarry Smith 
745b0a32e0cSBarry Smith   PetscLogFlops(10*a->nz);
7461ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7471ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
748f9fae5adSBarry Smith   PetscFunctionReturn(0);
749f9fae5adSBarry Smith }
750f9fae5adSBarry Smith 
7514a2ae208SSatish Balay #undef __FUNCT__
752b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_5"
753dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_5(Mat A,Vec xx,Vec yy,Vec zz)
754f9fae5adSBarry Smith {
7554cb9d9b8SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
756f9fae5adSBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
75787828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5;
758dfbe8321SBarry Smith   PetscErrorCode ierr;
759b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
760f9fae5adSBarry Smith 
761f9fae5adSBarry Smith   PetscFunctionBegin;
762f9fae5adSBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
7631ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
7641ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
765bfec09a0SHong Zhang 
766f9fae5adSBarry Smith   for (i=0; i<m; i++) {
767bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
768bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
769f9fae5adSBarry Smith     n      = a->i[i+1] - a->i[i];
770f9fae5adSBarry Smith     alpha1 = x[5*i];
771f9fae5adSBarry Smith     alpha2 = x[5*i+1];
772f9fae5adSBarry Smith     alpha3 = x[5*i+2];
773f9fae5adSBarry Smith     alpha4 = x[5*i+3];
774f9fae5adSBarry Smith     alpha5 = x[5*i+4];
775f9fae5adSBarry Smith     while (n-->0) {
776f9fae5adSBarry Smith       y[5*(*idx)]   += alpha1*(*v);
777f9fae5adSBarry Smith       y[5*(*idx)+1] += alpha2*(*v);
778f9fae5adSBarry Smith       y[5*(*idx)+2] += alpha3*(*v);
779f9fae5adSBarry Smith       y[5*(*idx)+3] += alpha4*(*v);
780f9fae5adSBarry Smith       y[5*(*idx)+4] += alpha5*(*v);
781f9fae5adSBarry Smith       idx++; v++;
782f9fae5adSBarry Smith     }
783f9fae5adSBarry Smith   }
784b0a32e0cSBarry Smith   PetscLogFlops(10*a->nz);
7851ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7861ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
787f9fae5adSBarry Smith   PetscFunctionReturn(0);
788bcc973b7SBarry Smith }
789bcc973b7SBarry Smith 
7906cd98798SBarry Smith /* ------------------------------------------------------------------------------*/
7914a2ae208SSatish Balay #undef __FUNCT__
792b9617806SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_6"
793dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_6(Mat A,Vec xx,Vec yy)
7946cd98798SBarry Smith {
7956cd98798SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
7966cd98798SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
79787828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6;
798dfbe8321SBarry Smith   PetscErrorCode ierr;
799b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
800b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
8016cd98798SBarry Smith 
8026cd98798SBarry Smith   PetscFunctionBegin;
8031ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
8041ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8056cd98798SBarry Smith   idx  = a->j;
8066cd98798SBarry Smith   v    = a->a;
8076cd98798SBarry Smith   ii   = a->i;
8086cd98798SBarry Smith 
8096cd98798SBarry Smith   for (i=0; i<m; i++) {
8106cd98798SBarry Smith     jrow = ii[i];
8116cd98798SBarry Smith     n    = ii[i+1] - jrow;
8126cd98798SBarry Smith     sum1  = 0.0;
8136cd98798SBarry Smith     sum2  = 0.0;
8146cd98798SBarry Smith     sum3  = 0.0;
8156cd98798SBarry Smith     sum4  = 0.0;
8166cd98798SBarry Smith     sum5  = 0.0;
8176cd98798SBarry Smith     sum6  = 0.0;
8186cd98798SBarry Smith     for (j=0; j<n; j++) {
8196cd98798SBarry Smith       sum1 += v[jrow]*x[6*idx[jrow]];
8206cd98798SBarry Smith       sum2 += v[jrow]*x[6*idx[jrow]+1];
8216cd98798SBarry Smith       sum3 += v[jrow]*x[6*idx[jrow]+2];
8226cd98798SBarry Smith       sum4 += v[jrow]*x[6*idx[jrow]+3];
8236cd98798SBarry Smith       sum5 += v[jrow]*x[6*idx[jrow]+4];
8246cd98798SBarry Smith       sum6 += v[jrow]*x[6*idx[jrow]+5];
8256cd98798SBarry Smith       jrow++;
8266cd98798SBarry Smith      }
8276cd98798SBarry Smith     y[6*i]   = sum1;
8286cd98798SBarry Smith     y[6*i+1] = sum2;
8296cd98798SBarry Smith     y[6*i+2] = sum3;
8306cd98798SBarry Smith     y[6*i+3] = sum4;
8316cd98798SBarry Smith     y[6*i+4] = sum5;
8326cd98798SBarry Smith     y[6*i+5] = sum6;
8336cd98798SBarry Smith   }
8346cd98798SBarry Smith 
835b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz - 6*m);
8361ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
8371ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
8386cd98798SBarry Smith   PetscFunctionReturn(0);
8396cd98798SBarry Smith }
8406cd98798SBarry Smith 
8414a2ae208SSatish Balay #undef __FUNCT__
842b9617806SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_6"
843dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_6(Mat A,Vec xx,Vec yy)
8446cd98798SBarry Smith {
8456cd98798SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
8466cd98798SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
84787828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,zero = 0.0;
848dfbe8321SBarry Smith   PetscErrorCode ierr;
849b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
8506cd98798SBarry Smith 
8516cd98798SBarry Smith   PetscFunctionBegin;
8526cd98798SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
8531ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
8541ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
855bfec09a0SHong Zhang 
8566cd98798SBarry Smith   for (i=0; i<m; i++) {
857bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
858bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
8596cd98798SBarry Smith     n      = a->i[i+1] - a->i[i];
8606cd98798SBarry Smith     alpha1 = x[6*i];
8616cd98798SBarry Smith     alpha2 = x[6*i+1];
8626cd98798SBarry Smith     alpha3 = x[6*i+2];
8636cd98798SBarry Smith     alpha4 = x[6*i+3];
8646cd98798SBarry Smith     alpha5 = x[6*i+4];
8656cd98798SBarry Smith     alpha6 = x[6*i+5];
8666cd98798SBarry Smith     while (n-->0) {
8676cd98798SBarry Smith       y[6*(*idx)]   += alpha1*(*v);
8686cd98798SBarry Smith       y[6*(*idx)+1] += alpha2*(*v);
8696cd98798SBarry Smith       y[6*(*idx)+2] += alpha3*(*v);
8706cd98798SBarry Smith       y[6*(*idx)+3] += alpha4*(*v);
8716cd98798SBarry Smith       y[6*(*idx)+4] += alpha5*(*v);
8726cd98798SBarry Smith       y[6*(*idx)+5] += alpha6*(*v);
8736cd98798SBarry Smith       idx++; v++;
8746cd98798SBarry Smith     }
8756cd98798SBarry Smith   }
876b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz - 6*b->AIJ->n);
8771ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
8781ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
8796cd98798SBarry Smith   PetscFunctionReturn(0);
8806cd98798SBarry Smith }
8816cd98798SBarry Smith 
8824a2ae208SSatish Balay #undef __FUNCT__
883b9617806SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_6"
884dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_6(Mat A,Vec xx,Vec yy,Vec zz)
8856cd98798SBarry Smith {
8866cd98798SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
8876cd98798SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
88887828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6;
889dfbe8321SBarry Smith   PetscErrorCode ierr;
890b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
891b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
8926cd98798SBarry Smith 
8936cd98798SBarry Smith   PetscFunctionBegin;
8946cd98798SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
8951ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
8961ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
8976cd98798SBarry Smith   idx  = a->j;
8986cd98798SBarry Smith   v    = a->a;
8996cd98798SBarry Smith   ii   = a->i;
9006cd98798SBarry Smith 
9016cd98798SBarry Smith   for (i=0; i<m; i++) {
9026cd98798SBarry Smith     jrow = ii[i];
9036cd98798SBarry Smith     n    = ii[i+1] - jrow;
9046cd98798SBarry Smith     sum1  = 0.0;
9056cd98798SBarry Smith     sum2  = 0.0;
9066cd98798SBarry Smith     sum3  = 0.0;
9076cd98798SBarry Smith     sum4  = 0.0;
9086cd98798SBarry Smith     sum5  = 0.0;
9096cd98798SBarry Smith     sum6  = 0.0;
9106cd98798SBarry Smith     for (j=0; j<n; j++) {
9116cd98798SBarry Smith       sum1 += v[jrow]*x[6*idx[jrow]];
9126cd98798SBarry Smith       sum2 += v[jrow]*x[6*idx[jrow]+1];
9136cd98798SBarry Smith       sum3 += v[jrow]*x[6*idx[jrow]+2];
9146cd98798SBarry Smith       sum4 += v[jrow]*x[6*idx[jrow]+3];
9156cd98798SBarry Smith       sum5 += v[jrow]*x[6*idx[jrow]+4];
9166cd98798SBarry Smith       sum6 += v[jrow]*x[6*idx[jrow]+5];
9176cd98798SBarry Smith       jrow++;
9186cd98798SBarry Smith      }
9196cd98798SBarry Smith     y[6*i]   += sum1;
9206cd98798SBarry Smith     y[6*i+1] += sum2;
9216cd98798SBarry Smith     y[6*i+2] += sum3;
9226cd98798SBarry Smith     y[6*i+3] += sum4;
9236cd98798SBarry Smith     y[6*i+4] += sum5;
9246cd98798SBarry Smith     y[6*i+5] += sum6;
9256cd98798SBarry Smith   }
9266cd98798SBarry Smith 
927b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz);
9281ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
9291ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
9306cd98798SBarry Smith   PetscFunctionReturn(0);
9316cd98798SBarry Smith }
9326cd98798SBarry Smith 
9334a2ae208SSatish Balay #undef __FUNCT__
934b9617806SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_6"
935dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_6(Mat A,Vec xx,Vec yy,Vec zz)
9366cd98798SBarry Smith {
9376cd98798SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
9386cd98798SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
93987828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6;
940dfbe8321SBarry Smith   PetscErrorCode ierr;
941b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
9426cd98798SBarry Smith 
9436cd98798SBarry Smith   PetscFunctionBegin;
9446cd98798SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
9451ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
9461ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
947bfec09a0SHong Zhang 
9486cd98798SBarry Smith   for (i=0; i<m; i++) {
949bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
950bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
9516cd98798SBarry Smith     n      = a->i[i+1] - a->i[i];
9526cd98798SBarry Smith     alpha1 = x[6*i];
9536cd98798SBarry Smith     alpha2 = x[6*i+1];
9546cd98798SBarry Smith     alpha3 = x[6*i+2];
9556cd98798SBarry Smith     alpha4 = x[6*i+3];
9566cd98798SBarry Smith     alpha5 = x[6*i+4];
9576cd98798SBarry Smith     alpha6 = x[6*i+5];
9586cd98798SBarry Smith     while (n-->0) {
9596cd98798SBarry Smith       y[6*(*idx)]   += alpha1*(*v);
9606cd98798SBarry Smith       y[6*(*idx)+1] += alpha2*(*v);
9616cd98798SBarry Smith       y[6*(*idx)+2] += alpha3*(*v);
9626cd98798SBarry Smith       y[6*(*idx)+3] += alpha4*(*v);
9636cd98798SBarry Smith       y[6*(*idx)+4] += alpha5*(*v);
9646cd98798SBarry Smith       y[6*(*idx)+5] += alpha6*(*v);
9656cd98798SBarry Smith       idx++; v++;
9666cd98798SBarry Smith     }
9676cd98798SBarry Smith   }
968b0a32e0cSBarry Smith   PetscLogFlops(12*a->nz);
9691ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
9701ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
9716cd98798SBarry Smith   PetscFunctionReturn(0);
9726cd98798SBarry Smith }
9736cd98798SBarry Smith 
97466ed3db0SBarry Smith /* ------------------------------------------------------------------------------*/
97566ed3db0SBarry Smith #undef __FUNCT__
97666ed3db0SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_8"
977dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_8(Mat A,Vec xx,Vec yy)
97866ed3db0SBarry Smith {
97966ed3db0SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
98066ed3db0SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
98187828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
982dfbe8321SBarry Smith   PetscErrorCode ierr;
983b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
984b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
98566ed3db0SBarry Smith 
98666ed3db0SBarry Smith   PetscFunctionBegin;
9871ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
9881ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
98966ed3db0SBarry Smith   idx  = a->j;
99066ed3db0SBarry Smith   v    = a->a;
99166ed3db0SBarry Smith   ii   = a->i;
99266ed3db0SBarry Smith 
99366ed3db0SBarry Smith   for (i=0; i<m; i++) {
99466ed3db0SBarry Smith     jrow = ii[i];
99566ed3db0SBarry Smith     n    = ii[i+1] - jrow;
99666ed3db0SBarry Smith     sum1  = 0.0;
99766ed3db0SBarry Smith     sum2  = 0.0;
99866ed3db0SBarry Smith     sum3  = 0.0;
99966ed3db0SBarry Smith     sum4  = 0.0;
100066ed3db0SBarry Smith     sum5  = 0.0;
100166ed3db0SBarry Smith     sum6  = 0.0;
100266ed3db0SBarry Smith     sum7  = 0.0;
100366ed3db0SBarry Smith     sum8  = 0.0;
100466ed3db0SBarry Smith     for (j=0; j<n; j++) {
100566ed3db0SBarry Smith       sum1 += v[jrow]*x[8*idx[jrow]];
100666ed3db0SBarry Smith       sum2 += v[jrow]*x[8*idx[jrow]+1];
100766ed3db0SBarry Smith       sum3 += v[jrow]*x[8*idx[jrow]+2];
100866ed3db0SBarry Smith       sum4 += v[jrow]*x[8*idx[jrow]+3];
100966ed3db0SBarry Smith       sum5 += v[jrow]*x[8*idx[jrow]+4];
101066ed3db0SBarry Smith       sum6 += v[jrow]*x[8*idx[jrow]+5];
101166ed3db0SBarry Smith       sum7 += v[jrow]*x[8*idx[jrow]+6];
101266ed3db0SBarry Smith       sum8 += v[jrow]*x[8*idx[jrow]+7];
101366ed3db0SBarry Smith       jrow++;
101466ed3db0SBarry Smith      }
101566ed3db0SBarry Smith     y[8*i]   = sum1;
101666ed3db0SBarry Smith     y[8*i+1] = sum2;
101766ed3db0SBarry Smith     y[8*i+2] = sum3;
101866ed3db0SBarry Smith     y[8*i+3] = sum4;
101966ed3db0SBarry Smith     y[8*i+4] = sum5;
102066ed3db0SBarry Smith     y[8*i+5] = sum6;
102166ed3db0SBarry Smith     y[8*i+6] = sum7;
102266ed3db0SBarry Smith     y[8*i+7] = sum8;
102366ed3db0SBarry Smith   }
102466ed3db0SBarry Smith 
102566ed3db0SBarry Smith   PetscLogFlops(16*a->nz - 8*m);
10261ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
10271ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
102866ed3db0SBarry Smith   PetscFunctionReturn(0);
102966ed3db0SBarry Smith }
103066ed3db0SBarry Smith 
103166ed3db0SBarry Smith #undef __FUNCT__
103266ed3db0SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_8"
1033dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_8(Mat A,Vec xx,Vec yy)
103466ed3db0SBarry Smith {
103566ed3db0SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
103666ed3db0SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
103787828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8,zero = 0.0;
1038dfbe8321SBarry Smith   PetscErrorCode ierr;
1039b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
104066ed3db0SBarry Smith 
104166ed3db0SBarry Smith   PetscFunctionBegin;
104266ed3db0SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
10431ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
10441ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
1045bfec09a0SHong Zhang 
104666ed3db0SBarry Smith   for (i=0; i<m; i++) {
1047bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
1048bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
104966ed3db0SBarry Smith     n      = a->i[i+1] - a->i[i];
105066ed3db0SBarry Smith     alpha1 = x[8*i];
105166ed3db0SBarry Smith     alpha2 = x[8*i+1];
105266ed3db0SBarry Smith     alpha3 = x[8*i+2];
105366ed3db0SBarry Smith     alpha4 = x[8*i+3];
105466ed3db0SBarry Smith     alpha5 = x[8*i+4];
105566ed3db0SBarry Smith     alpha6 = x[8*i+5];
105666ed3db0SBarry Smith     alpha7 = x[8*i+6];
105766ed3db0SBarry Smith     alpha8 = x[8*i+7];
105866ed3db0SBarry Smith     while (n-->0) {
105966ed3db0SBarry Smith       y[8*(*idx)]   += alpha1*(*v);
106066ed3db0SBarry Smith       y[8*(*idx)+1] += alpha2*(*v);
106166ed3db0SBarry Smith       y[8*(*idx)+2] += alpha3*(*v);
106266ed3db0SBarry Smith       y[8*(*idx)+3] += alpha4*(*v);
106366ed3db0SBarry Smith       y[8*(*idx)+4] += alpha5*(*v);
106466ed3db0SBarry Smith       y[8*(*idx)+5] += alpha6*(*v);
106566ed3db0SBarry Smith       y[8*(*idx)+6] += alpha7*(*v);
106666ed3db0SBarry Smith       y[8*(*idx)+7] += alpha8*(*v);
106766ed3db0SBarry Smith       idx++; v++;
106866ed3db0SBarry Smith     }
106966ed3db0SBarry Smith   }
107066ed3db0SBarry Smith   PetscLogFlops(16*a->nz - 8*b->AIJ->n);
10711ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
10721ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
107366ed3db0SBarry Smith   PetscFunctionReturn(0);
107466ed3db0SBarry Smith }
107566ed3db0SBarry Smith 
107666ed3db0SBarry Smith #undef __FUNCT__
107766ed3db0SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_8"
1078dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_8(Mat A,Vec xx,Vec yy,Vec zz)
107966ed3db0SBarry Smith {
108066ed3db0SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
108166ed3db0SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
108287828ca2SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
1083dfbe8321SBarry Smith   PetscErrorCode ierr;
1084b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
1085b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
108666ed3db0SBarry Smith 
108766ed3db0SBarry Smith   PetscFunctionBegin;
108866ed3db0SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
10891ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
10901ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
109166ed3db0SBarry Smith   idx  = a->j;
109266ed3db0SBarry Smith   v    = a->a;
109366ed3db0SBarry Smith   ii   = a->i;
109466ed3db0SBarry Smith 
109566ed3db0SBarry Smith   for (i=0; i<m; i++) {
109666ed3db0SBarry Smith     jrow = ii[i];
109766ed3db0SBarry Smith     n    = ii[i+1] - jrow;
109866ed3db0SBarry Smith     sum1  = 0.0;
109966ed3db0SBarry Smith     sum2  = 0.0;
110066ed3db0SBarry Smith     sum3  = 0.0;
110166ed3db0SBarry Smith     sum4  = 0.0;
110266ed3db0SBarry Smith     sum5  = 0.0;
110366ed3db0SBarry Smith     sum6  = 0.0;
110466ed3db0SBarry Smith     sum7  = 0.0;
110566ed3db0SBarry Smith     sum8  = 0.0;
110666ed3db0SBarry Smith     for (j=0; j<n; j++) {
110766ed3db0SBarry Smith       sum1 += v[jrow]*x[8*idx[jrow]];
110866ed3db0SBarry Smith       sum2 += v[jrow]*x[8*idx[jrow]+1];
110966ed3db0SBarry Smith       sum3 += v[jrow]*x[8*idx[jrow]+2];
111066ed3db0SBarry Smith       sum4 += v[jrow]*x[8*idx[jrow]+3];
111166ed3db0SBarry Smith       sum5 += v[jrow]*x[8*idx[jrow]+4];
111266ed3db0SBarry Smith       sum6 += v[jrow]*x[8*idx[jrow]+5];
111366ed3db0SBarry Smith       sum7 += v[jrow]*x[8*idx[jrow]+6];
111466ed3db0SBarry Smith       sum8 += v[jrow]*x[8*idx[jrow]+7];
111566ed3db0SBarry Smith       jrow++;
111666ed3db0SBarry Smith      }
111766ed3db0SBarry Smith     y[8*i]   += sum1;
111866ed3db0SBarry Smith     y[8*i+1] += sum2;
111966ed3db0SBarry Smith     y[8*i+2] += sum3;
112066ed3db0SBarry Smith     y[8*i+3] += sum4;
112166ed3db0SBarry Smith     y[8*i+4] += sum5;
112266ed3db0SBarry Smith     y[8*i+5] += sum6;
112366ed3db0SBarry Smith     y[8*i+6] += sum7;
112466ed3db0SBarry Smith     y[8*i+7] += sum8;
112566ed3db0SBarry Smith   }
112666ed3db0SBarry Smith 
112766ed3db0SBarry Smith   PetscLogFlops(16*a->nz);
11281ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
11291ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
113066ed3db0SBarry Smith   PetscFunctionReturn(0);
113166ed3db0SBarry Smith }
113266ed3db0SBarry Smith 
113366ed3db0SBarry Smith #undef __FUNCT__
113466ed3db0SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_8"
1135dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_8(Mat A,Vec xx,Vec yy,Vec zz)
113666ed3db0SBarry Smith {
113766ed3db0SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
113866ed3db0SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
113987828ca2SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8;
1140dfbe8321SBarry Smith   PetscErrorCode ierr;
1141b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
114266ed3db0SBarry Smith 
114366ed3db0SBarry Smith   PetscFunctionBegin;
114466ed3db0SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
11451ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
11461ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
114766ed3db0SBarry Smith   for (i=0; i<m; i++) {
1148bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
1149bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
115066ed3db0SBarry Smith     n      = a->i[i+1] - a->i[i];
115166ed3db0SBarry Smith     alpha1 = x[8*i];
115266ed3db0SBarry Smith     alpha2 = x[8*i+1];
115366ed3db0SBarry Smith     alpha3 = x[8*i+2];
115466ed3db0SBarry Smith     alpha4 = x[8*i+3];
115566ed3db0SBarry Smith     alpha5 = x[8*i+4];
115666ed3db0SBarry Smith     alpha6 = x[8*i+5];
115766ed3db0SBarry Smith     alpha7 = x[8*i+6];
115866ed3db0SBarry Smith     alpha8 = x[8*i+7];
115966ed3db0SBarry Smith     while (n-->0) {
116066ed3db0SBarry Smith       y[8*(*idx)]   += alpha1*(*v);
116166ed3db0SBarry Smith       y[8*(*idx)+1] += alpha2*(*v);
116266ed3db0SBarry Smith       y[8*(*idx)+2] += alpha3*(*v);
116366ed3db0SBarry Smith       y[8*(*idx)+3] += alpha4*(*v);
116466ed3db0SBarry Smith       y[8*(*idx)+4] += alpha5*(*v);
116566ed3db0SBarry Smith       y[8*(*idx)+5] += alpha6*(*v);
116666ed3db0SBarry Smith       y[8*(*idx)+6] += alpha7*(*v);
116766ed3db0SBarry Smith       y[8*(*idx)+7] += alpha8*(*v);
116866ed3db0SBarry Smith       idx++; v++;
116966ed3db0SBarry Smith     }
117066ed3db0SBarry Smith   }
117166ed3db0SBarry Smith   PetscLogFlops(16*a->nz);
11721ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
11731ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
11742f7816d4SBarry Smith   PetscFunctionReturn(0);
11752f7816d4SBarry Smith }
11762f7816d4SBarry Smith 
11772b692628SMatthew Knepley /* ------------------------------------------------------------------------------*/
11782b692628SMatthew Knepley #undef __FUNCT__
11792b692628SMatthew Knepley #define __FUNCT__ "MatMult_SeqMAIJ_9"
1180dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_9(Mat A,Vec xx,Vec yy)
11812b692628SMatthew Knepley {
11822b692628SMatthew Knepley   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
11832b692628SMatthew Knepley   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
11842b692628SMatthew Knepley   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8, sum9;
1185dfbe8321SBarry Smith   PetscErrorCode ierr;
1186b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
1187b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
11882b692628SMatthew Knepley 
11892b692628SMatthew Knepley   PetscFunctionBegin;
11901ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
11911ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
11922b692628SMatthew Knepley   idx  = a->j;
11932b692628SMatthew Knepley   v    = a->a;
11942b692628SMatthew Knepley   ii   = a->i;
11952b692628SMatthew Knepley 
11962b692628SMatthew Knepley   for (i=0; i<m; i++) {
11972b692628SMatthew Knepley     jrow = ii[i];
11982b692628SMatthew Knepley     n    = ii[i+1] - jrow;
11992b692628SMatthew Knepley     sum1  = 0.0;
12002b692628SMatthew Knepley     sum2  = 0.0;
12012b692628SMatthew Knepley     sum3  = 0.0;
12022b692628SMatthew Knepley     sum4  = 0.0;
12032b692628SMatthew Knepley     sum5  = 0.0;
12042b692628SMatthew Knepley     sum6  = 0.0;
12052b692628SMatthew Knepley     sum7  = 0.0;
12062b692628SMatthew Knepley     sum8  = 0.0;
12072b692628SMatthew Knepley     sum9  = 0.0;
12082b692628SMatthew Knepley     for (j=0; j<n; j++) {
12092b692628SMatthew Knepley       sum1 += v[jrow]*x[9*idx[jrow]];
12102b692628SMatthew Knepley       sum2 += v[jrow]*x[9*idx[jrow]+1];
12112b692628SMatthew Knepley       sum3 += v[jrow]*x[9*idx[jrow]+2];
12122b692628SMatthew Knepley       sum4 += v[jrow]*x[9*idx[jrow]+3];
12132b692628SMatthew Knepley       sum5 += v[jrow]*x[9*idx[jrow]+4];
12142b692628SMatthew Knepley       sum6 += v[jrow]*x[9*idx[jrow]+5];
12152b692628SMatthew Knepley       sum7 += v[jrow]*x[9*idx[jrow]+6];
12162b692628SMatthew Knepley       sum8 += v[jrow]*x[9*idx[jrow]+7];
12172b692628SMatthew Knepley       sum9 += v[jrow]*x[9*idx[jrow]+8];
12182b692628SMatthew Knepley       jrow++;
12192b692628SMatthew Knepley      }
12202b692628SMatthew Knepley     y[9*i]   = sum1;
12212b692628SMatthew Knepley     y[9*i+1] = sum2;
12222b692628SMatthew Knepley     y[9*i+2] = sum3;
12232b692628SMatthew Knepley     y[9*i+3] = sum4;
12242b692628SMatthew Knepley     y[9*i+4] = sum5;
12252b692628SMatthew Knepley     y[9*i+5] = sum6;
12262b692628SMatthew Knepley     y[9*i+6] = sum7;
12272b692628SMatthew Knepley     y[9*i+7] = sum8;
12282b692628SMatthew Knepley     y[9*i+8] = sum9;
12292b692628SMatthew Knepley   }
12302b692628SMatthew Knepley 
12312b692628SMatthew Knepley   PetscLogFlops(18*a->nz - 9*m);
12321ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
12331ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
12342b692628SMatthew Knepley   PetscFunctionReturn(0);
12352b692628SMatthew Knepley }
12362b692628SMatthew Knepley 
12372b692628SMatthew Knepley #undef __FUNCT__
12382b692628SMatthew Knepley #define __FUNCT__ "MatMultTranspose_SeqMAIJ_9"
1239dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_9(Mat A,Vec xx,Vec yy)
12402b692628SMatthew Knepley {
12412b692628SMatthew Knepley   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
12422b692628SMatthew Knepley   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
12432b692628SMatthew Knepley   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8,alpha9,zero = 0.0;
1244dfbe8321SBarry Smith   PetscErrorCode ierr;
1245b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
12462b692628SMatthew Knepley 
12472b692628SMatthew Knepley   PetscFunctionBegin;
12482b692628SMatthew Knepley   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
12491ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
12501ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
12512b692628SMatthew Knepley 
12522b692628SMatthew Knepley   for (i=0; i<m; i++) {
12532b692628SMatthew Knepley     idx    = a->j + a->i[i] ;
12542b692628SMatthew Knepley     v      = a->a + a->i[i] ;
12552b692628SMatthew Knepley     n      = a->i[i+1] - a->i[i];
12562b692628SMatthew Knepley     alpha1 = x[9*i];
12572b692628SMatthew Knepley     alpha2 = x[9*i+1];
12582b692628SMatthew Knepley     alpha3 = x[9*i+2];
12592b692628SMatthew Knepley     alpha4 = x[9*i+3];
12602b692628SMatthew Knepley     alpha5 = x[9*i+4];
12612b692628SMatthew Knepley     alpha6 = x[9*i+5];
12622b692628SMatthew Knepley     alpha7 = x[9*i+6];
12632b692628SMatthew Knepley     alpha8 = x[9*i+7];
12642f6bd0c6SMatthew Knepley     alpha9 = x[9*i+8];
12652b692628SMatthew Knepley     while (n-->0) {
12662b692628SMatthew Knepley       y[9*(*idx)]   += alpha1*(*v);
12672b692628SMatthew Knepley       y[9*(*idx)+1] += alpha2*(*v);
12682b692628SMatthew Knepley       y[9*(*idx)+2] += alpha3*(*v);
12692b692628SMatthew Knepley       y[9*(*idx)+3] += alpha4*(*v);
12702b692628SMatthew Knepley       y[9*(*idx)+4] += alpha5*(*v);
12712b692628SMatthew Knepley       y[9*(*idx)+5] += alpha6*(*v);
12722b692628SMatthew Knepley       y[9*(*idx)+6] += alpha7*(*v);
12732b692628SMatthew Knepley       y[9*(*idx)+7] += alpha8*(*v);
12742b692628SMatthew Knepley       y[9*(*idx)+8] += alpha9*(*v);
12752b692628SMatthew Knepley       idx++; v++;
12762b692628SMatthew Knepley     }
12772b692628SMatthew Knepley   }
12782b692628SMatthew Knepley   PetscLogFlops(18*a->nz - 9*b->AIJ->n);
12791ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
12801ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
12812b692628SMatthew Knepley   PetscFunctionReturn(0);
12822b692628SMatthew Knepley }
12832b692628SMatthew Knepley 
12842b692628SMatthew Knepley #undef __FUNCT__
12852b692628SMatthew Knepley #define __FUNCT__ "MatMultAdd_SeqMAIJ_9"
1286dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_9(Mat A,Vec xx,Vec yy,Vec zz)
12872b692628SMatthew Knepley {
12882b692628SMatthew Knepley   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
12892b692628SMatthew Knepley   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
12902b692628SMatthew Knepley   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8, sum9;
1291dfbe8321SBarry Smith   PetscErrorCode ierr;
1292b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
1293b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
12942b692628SMatthew Knepley 
12952b692628SMatthew Knepley   PetscFunctionBegin;
12962b692628SMatthew Knepley   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
12971ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
12981ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
12992b692628SMatthew Knepley   idx  = a->j;
13002b692628SMatthew Knepley   v    = a->a;
13012b692628SMatthew Knepley   ii   = a->i;
13022b692628SMatthew Knepley 
13032b692628SMatthew Knepley   for (i=0; i<m; i++) {
13042b692628SMatthew Knepley     jrow = ii[i];
13052b692628SMatthew Knepley     n    = ii[i+1] - jrow;
13062b692628SMatthew Knepley     sum1  = 0.0;
13072b692628SMatthew Knepley     sum2  = 0.0;
13082b692628SMatthew Knepley     sum3  = 0.0;
13092b692628SMatthew Knepley     sum4  = 0.0;
13102b692628SMatthew Knepley     sum5  = 0.0;
13112b692628SMatthew Knepley     sum6  = 0.0;
13122b692628SMatthew Knepley     sum7  = 0.0;
13132b692628SMatthew Knepley     sum8  = 0.0;
13142b692628SMatthew Knepley     sum9  = 0.0;
13152b692628SMatthew Knepley     for (j=0; j<n; j++) {
13162b692628SMatthew Knepley       sum1 += v[jrow]*x[9*idx[jrow]];
13172b692628SMatthew Knepley       sum2 += v[jrow]*x[9*idx[jrow]+1];
13182b692628SMatthew Knepley       sum3 += v[jrow]*x[9*idx[jrow]+2];
13192b692628SMatthew Knepley       sum4 += v[jrow]*x[9*idx[jrow]+3];
13202b692628SMatthew Knepley       sum5 += v[jrow]*x[9*idx[jrow]+4];
13212b692628SMatthew Knepley       sum6 += v[jrow]*x[9*idx[jrow]+5];
13222b692628SMatthew Knepley       sum7 += v[jrow]*x[9*idx[jrow]+6];
13232b692628SMatthew Knepley       sum8 += v[jrow]*x[9*idx[jrow]+7];
13242b692628SMatthew Knepley       sum9 += v[jrow]*x[9*idx[jrow]+8];
13252b692628SMatthew Knepley       jrow++;
13262b692628SMatthew Knepley      }
13272b692628SMatthew Knepley     y[9*i]   += sum1;
13282b692628SMatthew Knepley     y[9*i+1] += sum2;
13292b692628SMatthew Knepley     y[9*i+2] += sum3;
13302b692628SMatthew Knepley     y[9*i+3] += sum4;
13312b692628SMatthew Knepley     y[9*i+4] += sum5;
13322b692628SMatthew Knepley     y[9*i+5] += sum6;
13332b692628SMatthew Knepley     y[9*i+6] += sum7;
13342b692628SMatthew Knepley     y[9*i+7] += sum8;
13352b692628SMatthew Knepley     y[9*i+8] += sum9;
13362b692628SMatthew Knepley   }
13372b692628SMatthew Knepley 
13382b692628SMatthew Knepley   PetscLogFlops(18*a->nz);
13391ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
13401ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
13412b692628SMatthew Knepley   PetscFunctionReturn(0);
13422b692628SMatthew Knepley }
13432b692628SMatthew Knepley 
13442b692628SMatthew Knepley #undef __FUNCT__
13452b692628SMatthew Knepley #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_9"
1346dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_9(Mat A,Vec xx,Vec yy,Vec zz)
13472b692628SMatthew Knepley {
13482b692628SMatthew Knepley   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
13492b692628SMatthew Knepley   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
13502b692628SMatthew Knepley   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8,alpha9;
1351dfbe8321SBarry Smith   PetscErrorCode ierr;
1352b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
13532b692628SMatthew Knepley 
13542b692628SMatthew Knepley   PetscFunctionBegin;
13552b692628SMatthew Knepley   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
13561ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
13571ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
13582b692628SMatthew Knepley   for (i=0; i<m; i++) {
13592b692628SMatthew Knepley     idx    = a->j + a->i[i] ;
13602b692628SMatthew Knepley     v      = a->a + a->i[i] ;
13612b692628SMatthew Knepley     n      = a->i[i+1] - a->i[i];
13622b692628SMatthew Knepley     alpha1 = x[9*i];
13632b692628SMatthew Knepley     alpha2 = x[9*i+1];
13642b692628SMatthew Knepley     alpha3 = x[9*i+2];
13652b692628SMatthew Knepley     alpha4 = x[9*i+3];
13662b692628SMatthew Knepley     alpha5 = x[9*i+4];
13672b692628SMatthew Knepley     alpha6 = x[9*i+5];
13682b692628SMatthew Knepley     alpha7 = x[9*i+6];
13692b692628SMatthew Knepley     alpha8 = x[9*i+7];
13702b692628SMatthew Knepley     alpha9 = x[9*i+8];
13712b692628SMatthew Knepley     while (n-->0) {
13722b692628SMatthew Knepley       y[9*(*idx)]   += alpha1*(*v);
13732b692628SMatthew Knepley       y[9*(*idx)+1] += alpha2*(*v);
13742b692628SMatthew Knepley       y[9*(*idx)+2] += alpha3*(*v);
13752b692628SMatthew Knepley       y[9*(*idx)+3] += alpha4*(*v);
13762b692628SMatthew Knepley       y[9*(*idx)+4] += alpha5*(*v);
13772b692628SMatthew Knepley       y[9*(*idx)+5] += alpha6*(*v);
13782b692628SMatthew Knepley       y[9*(*idx)+6] += alpha7*(*v);
13792b692628SMatthew Knepley       y[9*(*idx)+7] += alpha8*(*v);
13802b692628SMatthew Knepley       y[9*(*idx)+8] += alpha9*(*v);
13812b692628SMatthew Knepley       idx++; v++;
13822b692628SMatthew Knepley     }
13832b692628SMatthew Knepley   }
13842b692628SMatthew Knepley   PetscLogFlops(18*a->nz);
13851ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
13861ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
13872b692628SMatthew Knepley   PetscFunctionReturn(0);
13882b692628SMatthew Knepley }
13892b692628SMatthew Knepley 
13902f7816d4SBarry Smith /*--------------------------------------------------------------------------------------------*/
13912f7816d4SBarry Smith #undef __FUNCT__
13922f7816d4SBarry Smith #define __FUNCT__ "MatMult_SeqMAIJ_16"
1393dfbe8321SBarry Smith PetscErrorCode MatMult_SeqMAIJ_16(Mat A,Vec xx,Vec yy)
13942f7816d4SBarry Smith {
13952f7816d4SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
13962f7816d4SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
13972f7816d4SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
13982f7816d4SBarry Smith   PetscScalar    sum9, sum10, sum11, sum12, sum13, sum14, sum15, sum16;
1399dfbe8321SBarry Smith   PetscErrorCode ierr;
1400b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
1401b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
14022f7816d4SBarry Smith 
14032f7816d4SBarry Smith   PetscFunctionBegin;
14041ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
14051ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
14062f7816d4SBarry Smith   idx  = a->j;
14072f7816d4SBarry Smith   v    = a->a;
14082f7816d4SBarry Smith   ii   = a->i;
14092f7816d4SBarry Smith 
14102f7816d4SBarry Smith   for (i=0; i<m; i++) {
14112f7816d4SBarry Smith     jrow = ii[i];
14122f7816d4SBarry Smith     n    = ii[i+1] - jrow;
14132f7816d4SBarry Smith     sum1  = 0.0;
14142f7816d4SBarry Smith     sum2  = 0.0;
14152f7816d4SBarry Smith     sum3  = 0.0;
14162f7816d4SBarry Smith     sum4  = 0.0;
14172f7816d4SBarry Smith     sum5  = 0.0;
14182f7816d4SBarry Smith     sum6  = 0.0;
14192f7816d4SBarry Smith     sum7  = 0.0;
14202f7816d4SBarry Smith     sum8  = 0.0;
14212f7816d4SBarry Smith     sum9  = 0.0;
14222f7816d4SBarry Smith     sum10 = 0.0;
14232f7816d4SBarry Smith     sum11 = 0.0;
14242f7816d4SBarry Smith     sum12 = 0.0;
14252f7816d4SBarry Smith     sum13 = 0.0;
14262f7816d4SBarry Smith     sum14 = 0.0;
14272f7816d4SBarry Smith     sum15 = 0.0;
14282f7816d4SBarry Smith     sum16 = 0.0;
14292f7816d4SBarry Smith     for (j=0; j<n; j++) {
14302f7816d4SBarry Smith       sum1  += v[jrow]*x[16*idx[jrow]];
14312f7816d4SBarry Smith       sum2  += v[jrow]*x[16*idx[jrow]+1];
14322f7816d4SBarry Smith       sum3  += v[jrow]*x[16*idx[jrow]+2];
14332f7816d4SBarry Smith       sum4  += v[jrow]*x[16*idx[jrow]+3];
14342f7816d4SBarry Smith       sum5  += v[jrow]*x[16*idx[jrow]+4];
14352f7816d4SBarry Smith       sum6  += v[jrow]*x[16*idx[jrow]+5];
14362f7816d4SBarry Smith       sum7  += v[jrow]*x[16*idx[jrow]+6];
14372f7816d4SBarry Smith       sum8  += v[jrow]*x[16*idx[jrow]+7];
14382f7816d4SBarry Smith       sum9  += v[jrow]*x[16*idx[jrow]+8];
14392f7816d4SBarry Smith       sum10 += v[jrow]*x[16*idx[jrow]+9];
14402f7816d4SBarry Smith       sum11 += v[jrow]*x[16*idx[jrow]+10];
14412f7816d4SBarry Smith       sum12 += v[jrow]*x[16*idx[jrow]+11];
14422f7816d4SBarry Smith       sum13 += v[jrow]*x[16*idx[jrow]+12];
14432f7816d4SBarry Smith       sum14 += v[jrow]*x[16*idx[jrow]+13];
14442f7816d4SBarry Smith       sum15 += v[jrow]*x[16*idx[jrow]+14];
14452f7816d4SBarry Smith       sum16 += v[jrow]*x[16*idx[jrow]+15];
14462f7816d4SBarry Smith       jrow++;
14472f7816d4SBarry Smith      }
14482f7816d4SBarry Smith     y[16*i]    = sum1;
14492f7816d4SBarry Smith     y[16*i+1]  = sum2;
14502f7816d4SBarry Smith     y[16*i+2]  = sum3;
14512f7816d4SBarry Smith     y[16*i+3]  = sum4;
14522f7816d4SBarry Smith     y[16*i+4]  = sum5;
14532f7816d4SBarry Smith     y[16*i+5]  = sum6;
14542f7816d4SBarry Smith     y[16*i+6]  = sum7;
14552f7816d4SBarry Smith     y[16*i+7]  = sum8;
14562f7816d4SBarry Smith     y[16*i+8]  = sum9;
14572f7816d4SBarry Smith     y[16*i+9]  = sum10;
14582f7816d4SBarry Smith     y[16*i+10] = sum11;
14592f7816d4SBarry Smith     y[16*i+11] = sum12;
14602f7816d4SBarry Smith     y[16*i+12] = sum13;
14612f7816d4SBarry Smith     y[16*i+13] = sum14;
14622f7816d4SBarry Smith     y[16*i+14] = sum15;
14632f7816d4SBarry Smith     y[16*i+15] = sum16;
14642f7816d4SBarry Smith   }
14652f7816d4SBarry Smith 
14662f7816d4SBarry Smith   PetscLogFlops(32*a->nz - 16*m);
14671ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
14681ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
14692f7816d4SBarry Smith   PetscFunctionReturn(0);
14702f7816d4SBarry Smith }
14712f7816d4SBarry Smith 
14722f7816d4SBarry Smith #undef __FUNCT__
14732f7816d4SBarry Smith #define __FUNCT__ "MatMultTranspose_SeqMAIJ_16"
1474dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqMAIJ_16(Mat A,Vec xx,Vec yy)
14752f7816d4SBarry Smith {
14762f7816d4SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
14772f7816d4SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
14782f7816d4SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8,zero = 0.0;
14792f7816d4SBarry Smith   PetscScalar    alpha9,alpha10,alpha11,alpha12,alpha13,alpha14,alpha15,alpha16;
1480dfbe8321SBarry Smith   PetscErrorCode ierr;
1481b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
14822f7816d4SBarry Smith 
14832f7816d4SBarry Smith   PetscFunctionBegin;
14842f7816d4SBarry Smith   ierr = VecSet(&zero,yy);CHKERRQ(ierr);
14851ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
14861ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
1487bfec09a0SHong Zhang 
14882f7816d4SBarry Smith   for (i=0; i<m; i++) {
1489bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
1490bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
14912f7816d4SBarry Smith     n      = a->i[i+1] - a->i[i];
14922f7816d4SBarry Smith     alpha1  = x[16*i];
14932f7816d4SBarry Smith     alpha2  = x[16*i+1];
14942f7816d4SBarry Smith     alpha3  = x[16*i+2];
14952f7816d4SBarry Smith     alpha4  = x[16*i+3];
14962f7816d4SBarry Smith     alpha5  = x[16*i+4];
14972f7816d4SBarry Smith     alpha6  = x[16*i+5];
14982f7816d4SBarry Smith     alpha7  = x[16*i+6];
14992f7816d4SBarry Smith     alpha8  = x[16*i+7];
15002f7816d4SBarry Smith     alpha9  = x[16*i+8];
15012f7816d4SBarry Smith     alpha10 = x[16*i+9];
15022f7816d4SBarry Smith     alpha11 = x[16*i+10];
15032f7816d4SBarry Smith     alpha12 = x[16*i+11];
15042f7816d4SBarry Smith     alpha13 = x[16*i+12];
15052f7816d4SBarry Smith     alpha14 = x[16*i+13];
15062f7816d4SBarry Smith     alpha15 = x[16*i+14];
15072f7816d4SBarry Smith     alpha16 = x[16*i+15];
15082f7816d4SBarry Smith     while (n-->0) {
15092f7816d4SBarry Smith       y[16*(*idx)]    += alpha1*(*v);
15102f7816d4SBarry Smith       y[16*(*idx)+1]  += alpha2*(*v);
15112f7816d4SBarry Smith       y[16*(*idx)+2]  += alpha3*(*v);
15122f7816d4SBarry Smith       y[16*(*idx)+3]  += alpha4*(*v);
15132f7816d4SBarry Smith       y[16*(*idx)+4]  += alpha5*(*v);
15142f7816d4SBarry Smith       y[16*(*idx)+5]  += alpha6*(*v);
15152f7816d4SBarry Smith       y[16*(*idx)+6]  += alpha7*(*v);
15162f7816d4SBarry Smith       y[16*(*idx)+7]  += alpha8*(*v);
15172f7816d4SBarry Smith       y[16*(*idx)+8]  += alpha9*(*v);
15182f7816d4SBarry Smith       y[16*(*idx)+9]  += alpha10*(*v);
15192f7816d4SBarry Smith       y[16*(*idx)+10] += alpha11*(*v);
15202f7816d4SBarry Smith       y[16*(*idx)+11] += alpha12*(*v);
15212f7816d4SBarry Smith       y[16*(*idx)+12] += alpha13*(*v);
15222f7816d4SBarry Smith       y[16*(*idx)+13] += alpha14*(*v);
15232f7816d4SBarry Smith       y[16*(*idx)+14] += alpha15*(*v);
15242f7816d4SBarry Smith       y[16*(*idx)+15] += alpha16*(*v);
15252f7816d4SBarry Smith       idx++; v++;
15262f7816d4SBarry Smith     }
15272f7816d4SBarry Smith   }
15282f7816d4SBarry Smith   PetscLogFlops(32*a->nz - 16*b->AIJ->n);
15291ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
15301ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
15312f7816d4SBarry Smith   PetscFunctionReturn(0);
15322f7816d4SBarry Smith }
15332f7816d4SBarry Smith 
15342f7816d4SBarry Smith #undef __FUNCT__
15352f7816d4SBarry Smith #define __FUNCT__ "MatMultAdd_SeqMAIJ_16"
1536dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqMAIJ_16(Mat A,Vec xx,Vec yy,Vec zz)
15372f7816d4SBarry Smith {
15382f7816d4SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
15392f7816d4SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
15402f7816d4SBarry Smith   PetscScalar    *x,*y,*v,sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8;
15412f7816d4SBarry Smith   PetscScalar    sum9, sum10, sum11, sum12, sum13, sum14, sum15, sum16;
1542dfbe8321SBarry Smith   PetscErrorCode ierr;
1543b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,*idx,*ii;
1544b24ad042SBarry Smith   PetscInt       n,i,jrow,j;
15452f7816d4SBarry Smith 
15462f7816d4SBarry Smith   PetscFunctionBegin;
15472f7816d4SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
15481ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
15491ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
15502f7816d4SBarry Smith   idx  = a->j;
15512f7816d4SBarry Smith   v    = a->a;
15522f7816d4SBarry Smith   ii   = a->i;
15532f7816d4SBarry Smith 
15542f7816d4SBarry Smith   for (i=0; i<m; i++) {
15552f7816d4SBarry Smith     jrow = ii[i];
15562f7816d4SBarry Smith     n    = ii[i+1] - jrow;
15572f7816d4SBarry Smith     sum1  = 0.0;
15582f7816d4SBarry Smith     sum2  = 0.0;
15592f7816d4SBarry Smith     sum3  = 0.0;
15602f7816d4SBarry Smith     sum4  = 0.0;
15612f7816d4SBarry Smith     sum5  = 0.0;
15622f7816d4SBarry Smith     sum6  = 0.0;
15632f7816d4SBarry Smith     sum7  = 0.0;
15642f7816d4SBarry Smith     sum8  = 0.0;
15652f7816d4SBarry Smith     sum9  = 0.0;
15662f7816d4SBarry Smith     sum10 = 0.0;
15672f7816d4SBarry Smith     sum11 = 0.0;
15682f7816d4SBarry Smith     sum12 = 0.0;
15692f7816d4SBarry Smith     sum13 = 0.0;
15702f7816d4SBarry Smith     sum14 = 0.0;
15712f7816d4SBarry Smith     sum15 = 0.0;
15722f7816d4SBarry Smith     sum16 = 0.0;
15732f7816d4SBarry Smith     for (j=0; j<n; j++) {
15742f7816d4SBarry Smith       sum1  += v[jrow]*x[16*idx[jrow]];
15752f7816d4SBarry Smith       sum2  += v[jrow]*x[16*idx[jrow]+1];
15762f7816d4SBarry Smith       sum3  += v[jrow]*x[16*idx[jrow]+2];
15772f7816d4SBarry Smith       sum4  += v[jrow]*x[16*idx[jrow]+3];
15782f7816d4SBarry Smith       sum5  += v[jrow]*x[16*idx[jrow]+4];
15792f7816d4SBarry Smith       sum6  += v[jrow]*x[16*idx[jrow]+5];
15802f7816d4SBarry Smith       sum7  += v[jrow]*x[16*idx[jrow]+6];
15812f7816d4SBarry Smith       sum8  += v[jrow]*x[16*idx[jrow]+7];
15822f7816d4SBarry Smith       sum9  += v[jrow]*x[16*idx[jrow]+8];
15832f7816d4SBarry Smith       sum10 += v[jrow]*x[16*idx[jrow]+9];
15842f7816d4SBarry Smith       sum11 += v[jrow]*x[16*idx[jrow]+10];
15852f7816d4SBarry Smith       sum12 += v[jrow]*x[16*idx[jrow]+11];
15862f7816d4SBarry Smith       sum13 += v[jrow]*x[16*idx[jrow]+12];
15872f7816d4SBarry Smith       sum14 += v[jrow]*x[16*idx[jrow]+13];
15882f7816d4SBarry Smith       sum15 += v[jrow]*x[16*idx[jrow]+14];
15892f7816d4SBarry Smith       sum16 += v[jrow]*x[16*idx[jrow]+15];
15902f7816d4SBarry Smith       jrow++;
15912f7816d4SBarry Smith      }
15922f7816d4SBarry Smith     y[16*i]    += sum1;
15932f7816d4SBarry Smith     y[16*i+1]  += sum2;
15942f7816d4SBarry Smith     y[16*i+2]  += sum3;
15952f7816d4SBarry Smith     y[16*i+3]  += sum4;
15962f7816d4SBarry Smith     y[16*i+4]  += sum5;
15972f7816d4SBarry Smith     y[16*i+5]  += sum6;
15982f7816d4SBarry Smith     y[16*i+6]  += sum7;
15992f7816d4SBarry Smith     y[16*i+7]  += sum8;
16002f7816d4SBarry Smith     y[16*i+8]  += sum9;
16012f7816d4SBarry Smith     y[16*i+9]  += sum10;
16022f7816d4SBarry Smith     y[16*i+10] += sum11;
16032f7816d4SBarry Smith     y[16*i+11] += sum12;
16042f7816d4SBarry Smith     y[16*i+12] += sum13;
16052f7816d4SBarry Smith     y[16*i+13] += sum14;
16062f7816d4SBarry Smith     y[16*i+14] += sum15;
16072f7816d4SBarry Smith     y[16*i+15] += sum16;
16082f7816d4SBarry Smith   }
16092f7816d4SBarry Smith 
16102f7816d4SBarry Smith   PetscLogFlops(32*a->nz);
16111ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
16121ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
16132f7816d4SBarry Smith   PetscFunctionReturn(0);
16142f7816d4SBarry Smith }
16152f7816d4SBarry Smith 
16162f7816d4SBarry Smith #undef __FUNCT__
16172f7816d4SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_SeqMAIJ_16"
1618dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqMAIJ_16(Mat A,Vec xx,Vec yy,Vec zz)
16192f7816d4SBarry Smith {
16202f7816d4SBarry Smith   Mat_SeqMAIJ    *b = (Mat_SeqMAIJ*)A->data;
16212f7816d4SBarry Smith   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)b->AIJ->data;
16222f7816d4SBarry Smith   PetscScalar    *x,*y,*v,alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8;
16232f7816d4SBarry Smith   PetscScalar    alpha9,alpha10,alpha11,alpha12,alpha13,alpha14,alpha15,alpha16;
1624dfbe8321SBarry Smith   PetscErrorCode ierr;
1625b24ad042SBarry Smith   PetscInt       m = b->AIJ->m,n,i,*idx;
16262f7816d4SBarry Smith 
16272f7816d4SBarry Smith   PetscFunctionBegin;
16282f7816d4SBarry Smith   if (yy != zz) {ierr = VecCopy(yy,zz);CHKERRQ(ierr);}
16291ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
16301ebc52fbSHong Zhang   ierr = VecGetArray(zz,&y);CHKERRQ(ierr);
16312f7816d4SBarry Smith   for (i=0; i<m; i++) {
1632bfec09a0SHong Zhang     idx    = a->j + a->i[i] ;
1633bfec09a0SHong Zhang     v      = a->a + a->i[i] ;
16342f7816d4SBarry Smith     n      = a->i[i+1] - a->i[i];
16352f7816d4SBarry Smith     alpha1 = x[16*i];
16362f7816d4SBarry Smith     alpha2 = x[16*i+1];
16372f7816d4SBarry Smith     alpha3 = x[16*i+2];
16382f7816d4SBarry Smith     alpha4 = x[16*i+3];
16392f7816d4SBarry Smith     alpha5 = x[16*i+4];
16402f7816d4SBarry Smith     alpha6 = x[16*i+5];
16412f7816d4SBarry Smith     alpha7 = x[16*i+6];
16422f7816d4SBarry Smith     alpha8 = x[16*i+7];
16432f7816d4SBarry Smith     alpha9  = x[16*i+8];
16442f7816d4SBarry Smith     alpha10 = x[16*i+9];
16452f7816d4SBarry Smith     alpha11 = x[16*i+10];
16462f7816d4SBarry Smith     alpha12 = x[16*i+11];
16472f7816d4SBarry Smith     alpha13 = x[16*i+12];
16482f7816d4SBarry Smith     alpha14 = x[16*i+13];
16492f7816d4SBarry Smith     alpha15 = x[16*i+14];
16502f7816d4SBarry Smith     alpha16 = x[16*i+15];
16512f7816d4SBarry Smith     while (n-->0) {
16522f7816d4SBarry Smith       y[16*(*idx)]   += alpha1*(*v);
16532f7816d4SBarry Smith       y[16*(*idx)+1] += alpha2*(*v);
16542f7816d4SBarry Smith       y[16*(*idx)+2] += alpha3*(*v);
16552f7816d4SBarry Smith       y[16*(*idx)+3] += alpha4*(*v);
16562f7816d4SBarry Smith       y[16*(*idx)+4] += alpha5*(*v);
16572f7816d4SBarry Smith       y[16*(*idx)+5] += alpha6*(*v);
16582f7816d4SBarry Smith       y[16*(*idx)+6] += alpha7*(*v);
16592f7816d4SBarry Smith       y[16*(*idx)+7] += alpha8*(*v);
16602f7816d4SBarry Smith       y[16*(*idx)+8]  += alpha9*(*v);
16612f7816d4SBarry Smith       y[16*(*idx)+9]  += alpha10*(*v);
16622f7816d4SBarry Smith       y[16*(*idx)+10] += alpha11*(*v);
16632f7816d4SBarry Smith       y[16*(*idx)+11] += alpha12*(*v);
16642f7816d4SBarry Smith       y[16*(*idx)+12] += alpha13*(*v);
16652f7816d4SBarry Smith       y[16*(*idx)+13] += alpha14*(*v);
16662f7816d4SBarry Smith       y[16*(*idx)+14] += alpha15*(*v);
16672f7816d4SBarry Smith       y[16*(*idx)+15] += alpha16*(*v);
16682f7816d4SBarry Smith       idx++; v++;
16692f7816d4SBarry Smith     }
16702f7816d4SBarry Smith   }
16712f7816d4SBarry Smith   PetscLogFlops(32*a->nz);
16721ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
16731ebc52fbSHong Zhang   ierr = VecRestoreArray(zz,&y);CHKERRQ(ierr);
167466ed3db0SBarry Smith   PetscFunctionReturn(0);
167566ed3db0SBarry Smith }
167666ed3db0SBarry Smith 
1677f4a53059SBarry Smith /*===================================================================================*/
16784a2ae208SSatish Balay #undef __FUNCT__
16794a2ae208SSatish Balay #define __FUNCT__ "MatMult_MPIMAIJ_dof"
1680dfbe8321SBarry Smith PetscErrorCode MatMult_MPIMAIJ_dof(Mat A,Vec xx,Vec yy)
1681f4a53059SBarry Smith {
16824cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b = (Mat_MPIMAIJ*)A->data;
1683dfbe8321SBarry Smith   PetscErrorCode ierr;
1684f4a53059SBarry Smith 
1685b24ad042SBarry Smith   PetscFunctionBegin;
1686f4a53059SBarry Smith   /* start the scatter */
1687f4a53059SBarry Smith   ierr = VecScatterBegin(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
16884cb9d9b8SBarry Smith   ierr = (*b->AIJ->ops->mult)(b->AIJ,xx,yy);CHKERRQ(ierr);
1689f4a53059SBarry Smith   ierr = VecScatterEnd(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
16904cb9d9b8SBarry Smith   ierr = (*b->OAIJ->ops->multadd)(b->OAIJ,b->w,yy,yy);CHKERRQ(ierr);
1691f4a53059SBarry Smith   PetscFunctionReturn(0);
1692f4a53059SBarry Smith }
1693f4a53059SBarry Smith 
16944a2ae208SSatish Balay #undef __FUNCT__
16954a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_MPIMAIJ_dof"
1696dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_MPIMAIJ_dof(Mat A,Vec xx,Vec yy)
16974cb9d9b8SBarry Smith {
16984cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b = (Mat_MPIMAIJ*)A->data;
1699dfbe8321SBarry Smith   PetscErrorCode ierr;
1700b24ad042SBarry Smith 
17014cb9d9b8SBarry Smith   PetscFunctionBegin;
17024cb9d9b8SBarry Smith   ierr = (*b->OAIJ->ops->multtranspose)(b->OAIJ,xx,b->w);CHKERRQ(ierr);
17034cb9d9b8SBarry Smith   ierr = VecScatterBegin(b->w,yy,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
17044cb9d9b8SBarry Smith   ierr = (*b->AIJ->ops->multtranspose)(b->AIJ,xx,yy);CHKERRQ(ierr);
17054cb9d9b8SBarry Smith   ierr = VecScatterEnd(b->w,yy,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
17064cb9d9b8SBarry Smith   PetscFunctionReturn(0);
17074cb9d9b8SBarry Smith }
17084cb9d9b8SBarry Smith 
17094a2ae208SSatish Balay #undef __FUNCT__
17104a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_MPIMAIJ_dof"
1711dfbe8321SBarry Smith PetscErrorCode MatMultAdd_MPIMAIJ_dof(Mat A,Vec xx,Vec yy,Vec zz)
17124cb9d9b8SBarry Smith {
17134cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b = (Mat_MPIMAIJ*)A->data;
1714dfbe8321SBarry Smith   PetscErrorCode ierr;
17154cb9d9b8SBarry Smith 
1716b24ad042SBarry Smith   PetscFunctionBegin;
17174cb9d9b8SBarry Smith   /* start the scatter */
17184cb9d9b8SBarry Smith   ierr = VecScatterBegin(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
1719d72c5c08SBarry Smith   ierr = (*b->AIJ->ops->multadd)(b->AIJ,xx,yy,zz);CHKERRQ(ierr);
17204cb9d9b8SBarry Smith   ierr = VecScatterEnd(xx,b->w,INSERT_VALUES,SCATTER_FORWARD,b->ctx);CHKERRQ(ierr);
1721*717f2ec8SHong Zhang   ierr = (*b->OAIJ->ops->multadd)(b->OAIJ,b->w,zz,zz);CHKERRQ(ierr);
17224cb9d9b8SBarry Smith   PetscFunctionReturn(0);
17234cb9d9b8SBarry Smith }
17244cb9d9b8SBarry Smith 
17254a2ae208SSatish Balay #undef __FUNCT__
17264a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_MPIMAIJ_dof"
1727dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_MPIMAIJ_dof(Mat A,Vec xx,Vec yy,Vec zz)
17284cb9d9b8SBarry Smith {
17294cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b = (Mat_MPIMAIJ*)A->data;
1730dfbe8321SBarry Smith   PetscErrorCode ierr;
1731b24ad042SBarry Smith 
17324cb9d9b8SBarry Smith   PetscFunctionBegin;
17334cb9d9b8SBarry Smith   ierr = (*b->OAIJ->ops->multtranspose)(b->OAIJ,xx,b->w);CHKERRQ(ierr);
1734d72c5c08SBarry Smith   ierr = VecScatterBegin(b->w,zz,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
1735d72c5c08SBarry Smith   ierr = (*b->AIJ->ops->multtransposeadd)(b->AIJ,xx,yy,zz);CHKERRQ(ierr);
1736d72c5c08SBarry Smith   ierr = VecScatterEnd(b->w,zz,ADD_VALUES,SCATTER_REVERSE,b->ctx);CHKERRQ(ierr);
17374cb9d9b8SBarry Smith   PetscFunctionReturn(0);
17384cb9d9b8SBarry Smith }
17394cb9d9b8SBarry Smith 
17409c4fc4c7SBarry Smith #undef __FUNCT__
17410fd73130SBarry Smith #define __FUNCT__ "MatConvert_SeqMAIJ_SeqAIJ"
17429c4fc4c7SBarry Smith PetscErrorCode MatConvert_SeqMAIJ_SeqAIJ(Mat A,const MatType newtype,Mat *B)
17439c4fc4c7SBarry Smith {
17449c4fc4c7SBarry Smith   Mat_SeqMAIJ       *b = (Mat_SeqMAIJ*)A->data;
17459c4fc4c7SBarry Smith   Mat               a = b->AIJ;
17469c4fc4c7SBarry Smith   Mat_SeqAIJ        *aij = (Mat_SeqAIJ*)a->data;
17479c4fc4c7SBarry Smith   PetscErrorCode    ierr;
17480fd73130SBarry Smith   PetscInt          m,n,i,ncols,*ilen,nmax = 0,*icols,j,k,ii,dof = b->dof;
1749ba8c8a56SBarry Smith   PetscInt          *cols;
1750ba8c8a56SBarry Smith   PetscScalar       *vals;
17519c4fc4c7SBarry Smith 
17529c4fc4c7SBarry Smith   PetscFunctionBegin;
17539c4fc4c7SBarry Smith   ierr = MatGetSize(a,&m,&n);CHKERRQ(ierr);
17540fd73130SBarry Smith   ierr = PetscMalloc(dof*m*sizeof(int),&ilen);CHKERRQ(ierr);
17559c4fc4c7SBarry Smith   for (i=0; i<m; i++) {
17569c4fc4c7SBarry Smith     nmax = PetscMax(nmax,aij->ilen[i]);
17570fd73130SBarry Smith     for (j=0; j<dof; j++) {
17580fd73130SBarry Smith       ilen[dof*i+j] = aij->ilen[i];
17599c4fc4c7SBarry Smith     }
17609c4fc4c7SBarry Smith   }
17610fd73130SBarry Smith   ierr = MatCreateSeqAIJ(PETSC_COMM_SELF,dof*m,dof*n,0,ilen,B);CHKERRQ(ierr);
17629c4fc4c7SBarry Smith   ierr = MatSetOption(*B,MAT_COLUMNS_SORTED);CHKERRQ(ierr);
17639c4fc4c7SBarry Smith   ierr = PetscFree(ilen);CHKERRQ(ierr);
17649c4fc4c7SBarry Smith   ierr = PetscMalloc(nmax*sizeof(PetscInt),&icols);CHKERRQ(ierr);
17659c4fc4c7SBarry Smith   ii   = 0;
17669c4fc4c7SBarry Smith   for (i=0; i<m; i++) {
1767ba8c8a56SBarry Smith     ierr = MatGetRow_SeqAIJ(a,i,&ncols,&cols,&vals);CHKERRQ(ierr);
17680fd73130SBarry Smith     for (j=0; j<dof; j++) {
17699c4fc4c7SBarry Smith       for (k=0; k<ncols; k++) {
17700fd73130SBarry Smith         icols[k] = dof*cols[k]+j;
17719c4fc4c7SBarry Smith       }
17729c4fc4c7SBarry Smith       ierr = MatSetValues_SeqAIJ(*B,1,&ii,ncols,icols,vals,INSERT_VALUES);CHKERRQ(ierr);
17739c4fc4c7SBarry Smith       ii++;
17749c4fc4c7SBarry Smith     }
1775ba8c8a56SBarry Smith     ierr = MatRestoreRow_SeqAIJ(a,i,&ncols,&cols,&vals);CHKERRQ(ierr);
17769c4fc4c7SBarry Smith   }
17779c4fc4c7SBarry Smith   ierr = PetscFree(icols);CHKERRQ(ierr);
17789c4fc4c7SBarry Smith   ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17799c4fc4c7SBarry Smith   ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17809c4fc4c7SBarry Smith   PetscFunctionReturn(0);
17819c4fc4c7SBarry Smith }
17829c4fc4c7SBarry Smith 
17830fd73130SBarry Smith #include "src/mat/impls/aij/mpi/mpiaij.h"
17840fd73130SBarry Smith #undef __FUNCT__
17850fd73130SBarry Smith #define __FUNCT__ "MatConvert_MPIMAIJ_MPIAIJ"
17860fd73130SBarry Smith PetscErrorCode MatConvert_MPIMAIJ_MPIAIJ(Mat A,const MatType newtype,Mat *B)
17870fd73130SBarry Smith {
17880fd73130SBarry Smith   Mat_MPIMAIJ       *maij = (Mat_MPIMAIJ*)A->data;
17890fd73130SBarry Smith   Mat               MatAIJ  = ((Mat_SeqMAIJ*)maij->AIJ->data)->AIJ;
17900fd73130SBarry Smith   Mat               MatOAIJ = ((Mat_SeqMAIJ*)maij->OAIJ->data)->AIJ;
17910fd73130SBarry Smith   Mat_SeqAIJ        *AIJ = (Mat_SeqAIJ*) MatAIJ->data;
17920fd73130SBarry Smith   Mat_SeqAIJ        *OAIJ =(Mat_SeqAIJ*) MatOAIJ->data;
17930fd73130SBarry Smith   Mat_MPIAIJ        *mpiaij = (Mat_MPIAIJ*) maij->A->data;
17947a1a7badSBarry Smith   PetscInt          dof = maij->dof,i,j,*dnz,*onz,nmax = 0,onmax = 0,*oicols,*icols,ncols,*cols,oncols,*ocols;
17950fd73130SBarry Smith   PetscInt          rstart,cstart,*garray,ii,k;
17960fd73130SBarry Smith   PetscErrorCode    ierr;
17970fd73130SBarry Smith   PetscScalar       *vals,*ovals;
17980fd73130SBarry Smith 
17990fd73130SBarry Smith   PetscFunctionBegin;
18007a1a7badSBarry Smith   ierr = PetscMalloc2(A->m,PetscInt,&dnz,A->m,PetscInt,&onz);CHKERRQ(ierr);
18010fd73130SBarry Smith   for (i=0; i<A->m/dof; i++) {
18020fd73130SBarry Smith     nmax  = PetscMax(nmax,AIJ->ilen[i]);
18030fd73130SBarry Smith     onmax = PetscMax(onmax,OAIJ->ilen[i]);
18040fd73130SBarry Smith     for (j=0; j<dof; j++) {
18050fd73130SBarry Smith       dnz[dof*i+j] = AIJ->ilen[i];
18060fd73130SBarry Smith       onz[dof*i+j] = OAIJ->ilen[i];
18070fd73130SBarry Smith     }
18080fd73130SBarry Smith   }
18090fd73130SBarry Smith   ierr = MatCreateMPIAIJ(A->comm,A->m,A->n,A->M,A->N,0,dnz,0,onz,B);CHKERRQ(ierr);
18100fd73130SBarry Smith   ierr = MatSetOption(*B,MAT_COLUMNS_SORTED);CHKERRQ(ierr);
18110fd73130SBarry Smith   ierr = PetscFree2(dnz,onz);CHKERRQ(ierr);
18120fd73130SBarry Smith 
18137a1a7badSBarry Smith   ierr   = PetscMalloc2(nmax,PetscInt,&icols,onmax,PetscInt,&oicols);CHKERRQ(ierr);
18140fd73130SBarry Smith   rstart = dof*mpiaij->rstart;
18150fd73130SBarry Smith   cstart = dof*mpiaij->cstart;
18160fd73130SBarry Smith   garray = mpiaij->garray;
18170fd73130SBarry Smith 
18180fd73130SBarry Smith   ii = rstart;
18190fd73130SBarry Smith   for (i=0; i<A->m/dof; i++) {
18200fd73130SBarry Smith     ierr = MatGetRow_SeqAIJ(MatAIJ,i,&ncols,&cols,&vals);CHKERRQ(ierr);
18210fd73130SBarry Smith     ierr = MatGetRow_SeqAIJ(MatOAIJ,i,&oncols,&ocols,&ovals);CHKERRQ(ierr);
18220fd73130SBarry Smith     for (j=0; j<dof; j++) {
18230fd73130SBarry Smith       for (k=0; k<ncols; k++) {
18240fd73130SBarry Smith         icols[k] = cstart + dof*cols[k]+j;
18250fd73130SBarry Smith       }
18260fd73130SBarry Smith       for (k=0; k<oncols; k++) {
18270fd73130SBarry Smith         oicols[k] = dof*garray[ocols[k]]+j;
18280fd73130SBarry Smith       }
18290fd73130SBarry Smith       ierr = MatSetValues_MPIAIJ(*B,1,&ii,ncols,icols,vals,INSERT_VALUES);CHKERRQ(ierr);
18300fd73130SBarry Smith       ierr = MatSetValues_MPIAIJ(*B,1,&ii,oncols,oicols,ovals,INSERT_VALUES);CHKERRQ(ierr);
18310fd73130SBarry Smith       ii++;
18320fd73130SBarry Smith     }
18330fd73130SBarry Smith     ierr = MatRestoreRow_SeqAIJ(MatAIJ,i,&ncols,&cols,&vals);CHKERRQ(ierr);
18340fd73130SBarry Smith     ierr = MatRestoreRow_SeqAIJ(MatOAIJ,i,&oncols,&ocols,&ovals);CHKERRQ(ierr);
18350fd73130SBarry Smith   }
18360fd73130SBarry Smith   ierr = PetscFree2(icols,oicols);CHKERRQ(ierr);
18370fd73130SBarry Smith 
18380fd73130SBarry Smith   ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
18390fd73130SBarry Smith   ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
18400fd73130SBarry Smith   PetscFunctionReturn(0);
18410fd73130SBarry Smith }
18420fd73130SBarry Smith 
18430fd73130SBarry Smith 
18440fd73130SBarry Smith 
1845bcc973b7SBarry Smith /* ---------------------------------------------------------------------------------- */
18465983afb6SSatish Balay /*MC
18470bad9183SKris Buschelman   MatCreateMAIJ - Creates a matrix type providing restriction and interpolation
18480bad9183SKris Buschelman   operations for multicomponent problems.  It interpolates each component the same
18490bad9183SKris Buschelman   way independently.  The matrix type is based on MATSEQAIJ for sequential matrices,
18500bad9183SKris Buschelman   and MATMPIAIJ for distributed matrices.
18510bad9183SKris Buschelman 
18520bad9183SKris Buschelman   Operations provided:
18530fd73130SBarry Smith + MatMult
18540bad9183SKris Buschelman . MatMultTranspose
18550bad9183SKris Buschelman . MatMultAdd
18560bad9183SKris Buschelman . MatMultTransposeAdd
18570fd73130SBarry Smith - MatView
18580bad9183SKris Buschelman 
18590bad9183SKris Buschelman   Level: advanced
18600bad9183SKris Buschelman 
18610bad9183SKris Buschelman M*/
18624a2ae208SSatish Balay #undef __FUNCT__
18634a2ae208SSatish Balay #define __FUNCT__ "MatCreateMAIJ"
1864b24ad042SBarry Smith PetscErrorCode MatCreateMAIJ(Mat A,PetscInt dof,Mat *maij)
186582b1193eSBarry Smith {
1866dfbe8321SBarry Smith   PetscErrorCode ierr;
1867b24ad042SBarry Smith   PetscMPIInt    size;
1868b24ad042SBarry Smith   PetscInt       n;
18694cb9d9b8SBarry Smith   Mat_MPIMAIJ    *b;
187082b1193eSBarry Smith   Mat            B;
187182b1193eSBarry Smith 
187282b1193eSBarry Smith   PetscFunctionBegin;
1873d72c5c08SBarry Smith   ierr   = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
1874d72c5c08SBarry Smith 
1875d72c5c08SBarry Smith   if (dof == 1) {
1876d72c5c08SBarry Smith     *maij = A;
1877d72c5c08SBarry Smith   } else {
187883903688SBarry Smith     ierr = MatCreate(A->comm,dof*A->m,dof*A->n,dof*A->M,dof*A->N,&B);CHKERRQ(ierr);
1879cd3bbe55SBarry Smith     B->assembled    = PETSC_TRUE;
1880d72c5c08SBarry Smith 
1881f4a53059SBarry Smith     ierr = MPI_Comm_size(A->comm,&size);CHKERRQ(ierr);
1882f4a53059SBarry Smith     if (size == 1) {
1883b9b97703SBarry Smith       ierr = MatSetType(B,MATSEQMAIJ);CHKERRQ(ierr);
18844cb9d9b8SBarry Smith       B->ops->destroy = MatDestroy_SeqMAIJ;
18850fd73130SBarry Smith       B->ops->view    = MatView_SeqMAIJ;
1886b9b97703SBarry Smith       b      = (Mat_MPIMAIJ*)B->data;
1887b9b97703SBarry Smith       b->dof = dof;
18884cb9d9b8SBarry Smith       b->AIJ = A;
1889d72c5c08SBarry Smith       if (dof == 2) {
1890cd3bbe55SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_2;
1891cd3bbe55SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_2;
1892cd3bbe55SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_2;
1893cd3bbe55SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_2;
1894bcc973b7SBarry Smith       } else if (dof == 3) {
1895bcc973b7SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_3;
1896bcc973b7SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_3;
1897bcc973b7SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_3;
1898bcc973b7SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_3;
1899bcc973b7SBarry Smith       } else if (dof == 4) {
1900bcc973b7SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_4;
1901bcc973b7SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_4;
1902bcc973b7SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_4;
1903bcc973b7SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_4;
1904f9fae5adSBarry Smith       } else if (dof == 5) {
1905f9fae5adSBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_5;
1906f9fae5adSBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_5;
1907f9fae5adSBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_5;
1908f9fae5adSBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_5;
19096cd98798SBarry Smith       } else if (dof == 6) {
19106cd98798SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_6;
19116cd98798SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_6;
19126cd98798SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_6;
19136cd98798SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_6;
191466ed3db0SBarry Smith       } else if (dof == 8) {
191566ed3db0SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_8;
191666ed3db0SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_8;
191766ed3db0SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_8;
191866ed3db0SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_8;
19192b692628SMatthew Knepley       } else if (dof == 9) {
19202b692628SMatthew Knepley         B->ops->mult             = MatMult_SeqMAIJ_9;
19212b692628SMatthew Knepley         B->ops->multadd          = MatMultAdd_SeqMAIJ_9;
19222b692628SMatthew Knepley         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_9;
19232b692628SMatthew Knepley         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_9;
19242f7816d4SBarry Smith       } else if (dof == 16) {
19252f7816d4SBarry Smith         B->ops->mult             = MatMult_SeqMAIJ_16;
19262f7816d4SBarry Smith         B->ops->multadd          = MatMultAdd_SeqMAIJ_16;
19272f7816d4SBarry Smith         B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_16;
19282f7816d4SBarry Smith         B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_16;
192982b1193eSBarry Smith       } else {
193077431f27SBarry Smith         SETERRQ1(PETSC_ERR_SUP,"Cannot handle a dof of %D. Send request for code to petsc-maint@mcs.anl.gov\n",dof);
193182b1193eSBarry Smith       }
19329c4fc4c7SBarry Smith       ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqmaij_seqaij_C","MatConvert_SeqMAIJ_SeqAIJ",MatConvert_SeqMAIJ_SeqAIJ);CHKERRQ(ierr);
1933f4a53059SBarry Smith     } else {
1934f4a53059SBarry Smith       Mat_MPIAIJ *mpiaij = (Mat_MPIAIJ *)A->data;
1935f4a53059SBarry Smith       IS         from,to;
1936f4a53059SBarry Smith       Vec        gvec;
1937b24ad042SBarry Smith       PetscInt   *garray,i;
1938f4a53059SBarry Smith 
1939b9b97703SBarry Smith       ierr = MatSetType(B,MATMPIMAIJ);CHKERRQ(ierr);
1940d72c5c08SBarry Smith       B->ops->destroy = MatDestroy_MPIMAIJ;
19410fd73130SBarry Smith       B->ops->view    = MatView_MPIMAIJ;
1942b9b97703SBarry Smith       b      = (Mat_MPIMAIJ*)B->data;
1943b9b97703SBarry Smith       b->dof = dof;
1944b9b97703SBarry Smith       b->A   = A;
19454cb9d9b8SBarry Smith       ierr = MatCreateMAIJ(mpiaij->A,dof,&b->AIJ);CHKERRQ(ierr);
19464cb9d9b8SBarry Smith       ierr = MatCreateMAIJ(mpiaij->B,dof,&b->OAIJ);CHKERRQ(ierr);
19474cb9d9b8SBarry Smith 
1948f4a53059SBarry Smith       ierr = VecGetSize(mpiaij->lvec,&n);CHKERRQ(ierr);
1949f4a53059SBarry Smith       ierr = VecCreateSeq(PETSC_COMM_SELF,n*dof,&b->w);CHKERRQ(ierr);
1950f4a53059SBarry Smith 
1951f4a53059SBarry Smith       /* create two temporary Index sets for build scatter gather */
1952b24ad042SBarry Smith       ierr = PetscMalloc((n+1)*sizeof(PetscInt),&garray);CHKERRQ(ierr);
1953f4a53059SBarry Smith       for (i=0; i<n; i++) garray[i] = dof*mpiaij->garray[i];
1954f4a53059SBarry Smith       ierr = ISCreateBlock(A->comm,dof,n,garray,&from);CHKERRQ(ierr);
1955f4a53059SBarry Smith       ierr = PetscFree(garray);CHKERRQ(ierr);
1956f4a53059SBarry Smith       ierr = ISCreateStride(PETSC_COMM_SELF,n*dof,0,1,&to);CHKERRQ(ierr);
1957f4a53059SBarry Smith 
1958f4a53059SBarry Smith       /* create temporary global vector to generate scatter context */
1959f4a53059SBarry Smith       ierr = VecCreateMPI(A->comm,dof*A->n,dof*A->N,&gvec);CHKERRQ(ierr);
1960f4a53059SBarry Smith 
1961f4a53059SBarry Smith       /* generate the scatter context */
1962f4a53059SBarry Smith       ierr = VecScatterCreate(gvec,from,b->w,to,&b->ctx);CHKERRQ(ierr);
1963f4a53059SBarry Smith 
1964f4a53059SBarry Smith       ierr = ISDestroy(from);CHKERRQ(ierr);
1965f4a53059SBarry Smith       ierr = ISDestroy(to);CHKERRQ(ierr);
1966f4a53059SBarry Smith       ierr = VecDestroy(gvec);CHKERRQ(ierr);
1967f4a53059SBarry Smith 
1968f4a53059SBarry Smith       B->ops->mult             = MatMult_MPIMAIJ_dof;
19694cb9d9b8SBarry Smith       B->ops->multtranspose    = MatMultTranspose_MPIMAIJ_dof;
19704cb9d9b8SBarry Smith       B->ops->multadd          = MatMultAdd_MPIMAIJ_dof;
19714cb9d9b8SBarry Smith       B->ops->multtransposeadd = MatMultTransposeAdd_MPIMAIJ_dof;
19720fd73130SBarry Smith       ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_mpimaij_mpiaij_C","MatConvert_MPIMAIJ_MPIAIJ",MatConvert_MPIMAIJ_MPIAIJ);CHKERRQ(ierr);
1973f4a53059SBarry Smith     }
1974cd3bbe55SBarry Smith     *maij = B;
19750fd73130SBarry Smith     ierr = MatView_Private(B);CHKERRQ(ierr);
1976d72c5c08SBarry Smith   }
197782b1193eSBarry Smith   PetscFunctionReturn(0);
197882b1193eSBarry Smith }
197982b1193eSBarry Smith 
198082b1193eSBarry Smith 
198182b1193eSBarry Smith 
198282b1193eSBarry Smith 
198382b1193eSBarry Smith 
198482b1193eSBarry Smith 
198582b1193eSBarry Smith 
198682b1193eSBarry Smith 
198782b1193eSBarry Smith 
198882b1193eSBarry Smith 
198982b1193eSBarry Smith 
199082b1193eSBarry Smith 
1991