xref: /petsc/src/mat/impls/maij/maij.c (revision cd3bbe55810eee9e0f7f31d4d8fda7a36d53a367)
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