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