1*cd3bbe55SBarry Smith /*$Id: maij.c,v 1.1 2000/05/17 19:44:12 bsmith Exp bsmith $*/ 282b1193eSBarry Smith /* 3*cd3bbe55SBarry Smith Defines the basic matrix operations for the MAIJ matrix storage format. 4*cd3bbe55SBarry Smith This format is used for restriction and interpolation operations for 5*cd3bbe55SBarry Smith multicomponent problems. It interpolates each component the same way 6*cd3bbe55SBarry Smith independently. 7*cd3bbe55SBarry Smith 8*cd3bbe55SBarry Smith We provide: 9*cd3bbe55SBarry Smith MatMult() 10*cd3bbe55SBarry Smith MatMultTranspose() 11*cd3bbe55SBarry Smith MatMultTransposeAdd() 12*cd3bbe55SBarry Smith MatMultAdd() 13*cd3bbe55SBarry Smith and 14*cd3bbe55SBarry Smith MatCreateMAIJ(Mat,dof,Mat*) 1582b1193eSBarry Smith */ 1682b1193eSBarry Smith 1782b1193eSBarry Smith #include "src/mat/impls/aij/seq/aij.h" 1882b1193eSBarry Smith 19*cd3bbe55SBarry Smith typedef struct { 20*cd3bbe55SBarry Smith int dof; /* number of components */ 21*cd3bbe55SBarry Smith Mat AIJ; /* representation of interpolation for one component */ 22*cd3bbe55SBarry Smith } Mat_SeqMAIJ; 2382b1193eSBarry Smith 2482b1193eSBarry Smith #undef __FUNC__ 25*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatDestroy_SeqMAIJ"></a>*/"MatDestroy_SeqMAIJ" 26*cd3bbe55SBarry Smith int MatDestroy_SeqMAIJ(Mat A) 2782b1193eSBarry Smith { 2882b1193eSBarry Smith int ierr; 29*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 3082b1193eSBarry Smith 3182b1193eSBarry Smith PetscFunctionBegin; 32*cd3bbe55SBarry Smith if (b->AIJ) { 33*cd3bbe55SBarry Smith ierr = MatDestroy(b->AIJ);CHKERRQ(ierr); 3482b1193eSBarry Smith } 35*cd3bbe55SBarry Smith ierr = PetscFree(b);CHKERRQ(ierr); 3682b1193eSBarry Smith PetscHeaderDestroy(A); 3782b1193eSBarry Smith PetscFunctionReturn(0); 3882b1193eSBarry Smith } 3982b1193eSBarry Smith 4082b1193eSBarry Smith EXTERN_C_BEGIN 4182b1193eSBarry Smith #undef __FUNC__ 42*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatCreate_SeqMAIJ"></a>*/"MatCreate_SeqMAIJ" 43*cd3bbe55SBarry Smith int MatCreate_SeqMAIJ(Mat A) 4482b1193eSBarry Smith { 45*cd3bbe55SBarry Smith int ierr; 46*cd3bbe55SBarry Smith Mat_SeqMAIJ *b; 4782b1193eSBarry Smith 4882b1193eSBarry Smith PetscFunctionBegin; 49*cd3bbe55SBarry Smith A->data = (void*)(b = PetscNew(Mat_SeqMAIJ));CHKPTRQ(b); 50*cd3bbe55SBarry Smith ierr = PetscMemzero(b,sizeof(Mat_SeqMAIJ));CHKERRQ(ierr); 51*cd3bbe55SBarry Smith ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr); 52*cd3bbe55SBarry Smith A->factor = 0; 53*cd3bbe55SBarry Smith A->mapping = 0; 54*cd3bbe55SBarry Smith b->AIJ = 0; 55*cd3bbe55SBarry Smith b->dof = 0; 5682b1193eSBarry Smith PetscFunctionReturn(0); 5782b1193eSBarry Smith } 5882b1193eSBarry Smith EXTERN_C_END 5982b1193eSBarry Smith 60*cd3bbe55SBarry Smith EXTERN int MatMult_SeqAIJ(Mat,Vec,Vec); 61*cd3bbe55SBarry Smith EXTERN int MatMultTranspose_SeqAIJ(Mat,Vec,Vec); 62*cd3bbe55SBarry Smith EXTERN int MatMultTransposeAdd_SeqAIJ(Mat,Vec,Vec,Vec); 63*cd3bbe55SBarry Smith EXTERN int matmulttransposeadd_seqaijMatMultAdd_SeqAIJ(Mat,Vec,Vec,Vec); 64*cd3bbe55SBarry Smith 6582b1193eSBarry Smith #undef __FUNC__ 66*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_1"></a>*/"MatMult_SeqMAIJ_1" 67*cd3bbe55SBarry Smith int MatMult_SeqMAIJ_1(Mat A,Vec xx,Vec yy) 6882b1193eSBarry Smith { 69*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 70*cd3bbe55SBarry Smith int ierr; 7182b1193eSBarry Smith PetscFunctionBegin; 72*cd3bbe55SBarry Smith ierr = MatMult_SeqAIJ(b->AIJ,xx,yy); 73*cd3bbe55SBarry Smith PetscFunctionReturn(0); 7482b1193eSBarry Smith } 75*cd3bbe55SBarry Smith #undef __FUNC__ 76*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_1"></a>*/"MatMultTranspose_SeqMAIJ_1" 77*cd3bbe55SBarry Smith int MatMultTranspose_SeqMAIJ_1(Mat A,Vec xx,Vec yy) 78*cd3bbe55SBarry Smith { 79*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 80*cd3bbe55SBarry Smith int ierr; 81*cd3bbe55SBarry Smith PetscFunctionBegin; 82*cd3bbe55SBarry Smith ierr = MatMultTranspose_SeqAIJ(b->AIJ,xx,yy); 83*cd3bbe55SBarry Smith PetscFunctionReturn(0); 84*cd3bbe55SBarry Smith } 85*cd3bbe55SBarry Smith #undef __FUNC__ 86*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_1"></a>*/"MatMultAdd_SeqMAIJ_1" 87*cd3bbe55SBarry Smith int MatMultAdd_SeqMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz) 88*cd3bbe55SBarry Smith { 89*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 90*cd3bbe55SBarry Smith int ierr; 91*cd3bbe55SBarry Smith PetscFunctionBegin; 92*cd3bbe55SBarry Smith ierr = MatMultAdd_SeqAIJ(b->AIJ,xx,yy,zz); 93*cd3bbe55SBarry Smith PetscFunctionReturn(0); 94*cd3bbe55SBarry Smith } 95*cd3bbe55SBarry Smith #undef __FUNC__ 96*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_1"></a>*/"MatMultTransposeAdd_SeqMAIJ_1" 97*cd3bbe55SBarry Smith int MatMultTransposeAdd_SeqMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz) 98*cd3bbe55SBarry Smith { 99*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 100*cd3bbe55SBarry Smith int ierr; 101*cd3bbe55SBarry Smith PetscFunctionBegin; 102*cd3bbe55SBarry Smith ierr = MatMultTransposeAdd_SeqAIJ(b->AIJ,xx,yy,zz); 10382b1193eSBarry Smith PetscFunctionReturn(0); 10482b1193eSBarry Smith } 10582b1193eSBarry Smith 106*cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/ 10782b1193eSBarry Smith #undef __FUNC__ 108*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMult_SeqMAIJ_2"></a>*/"MatMult_SeqMAIJ_2" 109*cd3bbe55SBarry Smith int MatMult_SeqMAIJ_2(Mat A,Vec xx,Vec yy) 11082b1193eSBarry Smith { 111*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 112*cd3bbe55SBarry Smith int ierr; 11382b1193eSBarry Smith PetscFunctionBegin; 11482b1193eSBarry Smith 11582b1193eSBarry Smith PetscFunctionReturn(0); 11682b1193eSBarry Smith } 11782b1193eSBarry Smith #undef __FUNC__ 118*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_2"></a>*/"MatMultTranspose_SeqMAIJ_2" 119*cd3bbe55SBarry Smith int MatMultTranspose_SeqMAIJ_2(Mat A,Vec xx,Vec yy) 12082b1193eSBarry Smith { 121*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 122*cd3bbe55SBarry Smith int ierr; 12382b1193eSBarry Smith PetscFunctionBegin; 12482b1193eSBarry Smith 12582b1193eSBarry Smith PetscFunctionReturn(0); 12682b1193eSBarry Smith } 12782b1193eSBarry Smith #undef __FUNC__ 128*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_2"></a>*/"MatMultAdd_SeqMAIJ_2" 129*cd3bbe55SBarry Smith int MatMultAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz) 13082b1193eSBarry Smith { 131*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 132*cd3bbe55SBarry Smith int ierr; 13382b1193eSBarry Smith PetscFunctionBegin; 13482b1193eSBarry Smith 13582b1193eSBarry Smith PetscFunctionReturn(0); 13682b1193eSBarry Smith } 13782b1193eSBarry Smith #undef __FUNC__ 138*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_2"></a>*/"MatMultTransposeAdd_SeqMAIJ_2" 139*cd3bbe55SBarry Smith int MatMultTransposeAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz) 14082b1193eSBarry Smith { 141*cd3bbe55SBarry Smith Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data; 142*cd3bbe55SBarry Smith int ierr; 14382b1193eSBarry Smith PetscFunctionBegin; 14482b1193eSBarry Smith 14582b1193eSBarry Smith PetscFunctionReturn(0); 14682b1193eSBarry Smith } 147*cd3bbe55SBarry Smith /* --------------------------------------------------------------------------------------*/ 14882b1193eSBarry Smith 14982b1193eSBarry Smith #undef __FUNC__ 150*cd3bbe55SBarry Smith #define __FUNC__ /*<a name="MatCreateMAIJ"></a>*/"MatCreateMAIJ" 151*cd3bbe55SBarry Smith int MatCreateMAIJ(Mat A,int dof,Mat *maij) 15282b1193eSBarry Smith { 153*cd3bbe55SBarry Smith int ierr; 154*cd3bbe55SBarry Smith Mat_SeqMAIJ *b; 15582b1193eSBarry Smith Mat B; 15682b1193eSBarry Smith 15782b1193eSBarry Smith PetscFunctionBegin; 158*cd3bbe55SBarry Smith ierr = MATCreate(A->comm,dof*A->m,dof*A->n,dof*A->M,dof*A->N,&B);CHKERRQ(ierr); 159*cd3bbe55SBarry Smith ierr = MatSetType(B,MATSEQMAIJ);CHKERRQ(ierr); 16082b1193eSBarry Smith 161*cd3bbe55SBarry Smith B->assembled = PETSC_TRUE; 162*cd3bbe55SBarry Smith B->ops->destroy = MatDestroy_SeqMAIJ; 163*cd3bbe55SBarry Smith b = (Mat_SeqMAIJ*)B->data; 16482b1193eSBarry Smith 165*cd3bbe55SBarry Smith b->AIJ = A; 166*cd3bbe55SBarry Smith b->dof = dof; 167*cd3bbe55SBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 168*cd3bbe55SBarry Smith if (dof == 1) { 169*cd3bbe55SBarry Smith B->ops->mult = MatMult_SeqMAIJ_1; 170*cd3bbe55SBarry Smith B->ops->multadd = MatMultAdd_SeqMAIJ_1; 171*cd3bbe55SBarry Smith B->ops->multtranspose = MatMultTranspose_SeqMAIJ_1; 172*cd3bbe55SBarry Smith B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_1; 173*cd3bbe55SBarry Smith } else if (dof == 2) { 174*cd3bbe55SBarry Smith B->ops->mult = MatMult_SeqMAIJ_2; 175*cd3bbe55SBarry Smith B->ops->multadd = MatMultAdd_SeqMAIJ_2; 176*cd3bbe55SBarry Smith B->ops->multtranspose = MatMultTranspose_SeqMAIJ_2; 177*cd3bbe55SBarry Smith B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_2; 17882b1193eSBarry Smith } else { 179*cd3bbe55SBarry Smith SETERRQ1(1,1,"Cannot handle a dof of %d\n",dof); 18082b1193eSBarry Smith } 181*cd3bbe55SBarry Smith *maij = B; 18282b1193eSBarry Smith PetscFunctionReturn(0); 18382b1193eSBarry Smith } 18482b1193eSBarry Smith 18582b1193eSBarry Smith 18682b1193eSBarry Smith 18782b1193eSBarry Smith 18882b1193eSBarry Smith 18982b1193eSBarry Smith 19082b1193eSBarry Smith 19182b1193eSBarry Smith 19282b1193eSBarry Smith 19382b1193eSBarry Smith 19482b1193eSBarry Smith 19582b1193eSBarry Smith 196