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