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