xref: /petsc/src/mat/impls/maij/maij.c (revision f56f2b3ff21308484da8df32936fdacdda7bd667)
1 /*$Id: maij.c,v 1.1 2000/05/17 19:44:12 bsmith Exp bsmith $*/
2 /*
3     Defines the basic matrix operations for the MAIJ  matrix storage format.
4   This format is used for restriction and interpolation operations for
5   multicomponent problems. It interpolates each component the same way
6   independently.
7 
8      We provide:
9          MatMult()
10          MatMultTranspose()
11          MatMultTransposeAdd()
12          MatMultAdd()
13           and
14          MatCreateMAIJ(Mat,dof,Mat*)
15 */
16 
17 #include "src/mat/impls/aij/seq/aij.h"
18 
19 typedef struct {
20   int dof;               /* number of components */
21   Mat AIJ;               /* representation of interpolation for one component */
22 } Mat_SeqMAIJ;
23 
24 #undef __FUNC__
25 #define __FUNC__ /*<a name="MatDestroy_SeqMAIJ"></a>*/"MatDestroy_SeqMAIJ"
26 int MatDestroy_SeqMAIJ(Mat A)
27 {
28   int         ierr;
29   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
30 
31   PetscFunctionBegin;
32   if (b->AIJ) {
33     ierr = MatDestroy(b->AIJ);CHKERRQ(ierr);
34   }
35   ierr = PetscFree(b);CHKERRQ(ierr);
36   PetscHeaderDestroy(A);
37   PetscFunctionReturn(0);
38 }
39 
40 EXTERN_C_BEGIN
41 #undef __FUNC__
42 #define __FUNC__ /*<a name="MatCreate_SeqMAIJ"></a>*/"MatCreate_SeqMAIJ"
43 int MatCreate_SeqMAIJ(Mat A)
44 {
45   int         ierr;
46   Mat_SeqMAIJ *b;
47 
48   PetscFunctionBegin;
49   A->data             = (void*)(b = PetscNew(Mat_SeqMAIJ));CHKPTRQ(b);
50   ierr = PetscMemzero(b,sizeof(Mat_SeqMAIJ));CHKERRQ(ierr);
51   ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr);
52   A->factor           = 0;
53   A->mapping          = 0;
54   b->AIJ = 0;
55   b->dof = 0;
56   PetscFunctionReturn(0);
57 }
58 EXTERN_C_END
59 
60 EXTERN int MatMult_SeqAIJ(Mat,Vec,Vec);
61 EXTERN int MatMultTranspose_SeqAIJ(Mat,Vec,Vec);
62 EXTERN int MatMultTransposeAdd_SeqAIJ(Mat,Vec,Vec,Vec);
63 EXTERN int matmulttransposeadd_seqaijMatMultAdd_SeqAIJ(Mat,Vec,Vec,Vec);
64 
65 #undef __FUNC__
66 #define __FUNC__ /*<a name="MatMult_SeqMAIJ_1"></a>*/"MatMult_SeqMAIJ_1"
67 int MatMult_SeqMAIJ_1(Mat A,Vec xx,Vec yy)
68 {
69   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
70   int         ierr;
71   PetscFunctionBegin;
72   ierr = MatMult_SeqAIJ(b->AIJ,xx,yy);
73   PetscFunctionReturn(0);
74 }
75 #undef __FUNC__
76 #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_1"></a>*/"MatMultTranspose_SeqMAIJ_1"
77 int MatMultTranspose_SeqMAIJ_1(Mat A,Vec xx,Vec yy)
78 {
79   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
80   int         ierr;
81   PetscFunctionBegin;
82   ierr = MatMultTranspose_SeqAIJ(b->AIJ,xx,yy);
83   PetscFunctionReturn(0);
84 }
85 #undef __FUNC__
86 #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_1"></a>*/"MatMultAdd_SeqMAIJ_1"
87 int MatMultAdd_SeqMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz)
88 {
89   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
90   int         ierr;
91   PetscFunctionBegin;
92   ierr = MatMultAdd_SeqAIJ(b->AIJ,xx,yy,zz);
93   PetscFunctionReturn(0);
94 }
95 #undef __FUNC__
96 #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_1"></a>*/"MatMultTransposeAdd_SeqMAIJ_1"
97 int MatMultTransposeAdd_SeqMAIJ_1(Mat A,Vec xx,Vec yy,Vec zz)
98 {
99   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
100   int         ierr;
101   PetscFunctionBegin;
102   ierr = MatMultTransposeAdd_SeqAIJ(b->AIJ,xx,yy,zz);
103   PetscFunctionReturn(0);
104 }
105 
106 /* --------------------------------------------------------------------------------------*/
107 #undef __FUNC__
108 #define __FUNC__ /*<a name="MatMult_SeqMAIJ_2"></a>*/"MatMult_SeqMAIJ_2"
109 int MatMult_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
110 {
111   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
112   int         ierr;
113   PetscFunctionBegin;
114 
115   PetscFunctionReturn(0);
116 }
117 #undef __FUNC__
118 #define __FUNC__ /*<a name="MatMultTranspose_SeqMAIJ_2"></a>*/"MatMultTranspose_SeqMAIJ_2"
119 int MatMultTranspose_SeqMAIJ_2(Mat A,Vec xx,Vec yy)
120 {
121   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
122   int         ierr;
123   PetscFunctionBegin;
124 
125   PetscFunctionReturn(0);
126 }
127 #undef __FUNC__
128 #define __FUNC__ /*<a name="MatMultAdd_SeqMAIJ_2"></a>*/"MatMultAdd_SeqMAIJ_2"
129 int MatMultAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
130 {
131   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
132   int         ierr;
133   PetscFunctionBegin;
134 
135   PetscFunctionReturn(0);
136 }
137 #undef __FUNC__
138 #define __FUNC__ /*<a name="MatMultTransposeAdd_SeqMAIJ_2"></a>*/"MatMultTransposeAdd_SeqMAIJ_2"
139 int MatMultTransposeAdd_SeqMAIJ_2(Mat A,Vec xx,Vec yy,Vec zz)
140 {
141   Mat_SeqMAIJ *b = (Mat_SeqMAIJ*)A->data;
142   int         ierr;
143   PetscFunctionBegin;
144 
145   PetscFunctionReturn(0);
146 }
147 /* --------------------------------------------------------------------------------------*/
148 
149 #undef __FUNC__
150 #define __FUNC__ /*<a name="MatCreateMAIJ"></a>*/"MatCreateMAIJ"
151 int MatCreateMAIJ(Mat A,int dof,Mat *maij)
152 {
153   int         ierr;
154   Mat_SeqMAIJ *b;
155   Mat         B;
156 
157   PetscFunctionBegin;
158   ierr = MATCreate(A->comm,dof*A->m,dof*A->n,dof*A->M,dof*A->N,&B);CHKERRQ(ierr);
159   ierr = MatSetType(B,MATSEQMAIJ);CHKERRQ(ierr);
160 
161   B->assembled    = PETSC_TRUE;
162   B->ops->destroy = MatDestroy_SeqMAIJ;
163   b = (Mat_SeqMAIJ*)B->data;
164 
165   b->AIJ = A;
166   b->dof = dof;
167   ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
168   if (dof == 1) {
169     B->ops->mult             = MatMult_SeqMAIJ_1;
170     B->ops->multadd          = MatMultAdd_SeqMAIJ_1;
171     B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_1;
172     B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_1;
173   } else if (dof == 2) {
174     B->ops->mult             = MatMult_SeqMAIJ_2;
175     B->ops->multadd          = MatMultAdd_SeqMAIJ_2;
176     B->ops->multtranspose    = MatMultTranspose_SeqMAIJ_2;
177     B->ops->multtransposeadd = MatMultTransposeAdd_SeqMAIJ_2;
178   } else {
179     SETERRQ1(1,1,"Cannot handle a dof of %d\n",dof);
180   }
181   *maij = B;
182   PetscFunctionReturn(0);
183 }
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196