Actual source code: multigridmat.c

  1: #include "multigridmat.h"

  3: #include "src/petsctao/vector/taovec_petsc.h"
  4: #include "src/petsctao/indexset/taois_petsc.h"

  6: TaoMultiGridMatPetsc::TaoMultiGridMatPetsc(Mat MM):TaoMatPetsc(MM){
  7:   int i,nn=PETSCDAAPPMAXGRIDS;
  9:   for (i=0;i<nn;i++){
 10:     this->grid[i].da=0;
 11:     this->grid[i].H=0;
 12:     this->grid[i].R=0;
 13:     this->grid[i].RHS=0;
 14:     this->grid[i].Interpolate=0;
 15:     this->grid[i].CScale=0;
 16:     this->grid[i].W3=0;
 17:     this->grid[i].coloring=0;
 18:     this->grid[i].mgrid=0;
 19:   }
 20:   this->nda=0;
 21:   return;
 22: }
 23:  
 24: TaoMultiGridMatPetsc::~TaoMultiGridMatPetsc(){
 25:   this->TakeDown();
 26:   return;
 27: }
 28:  

 32: int TaoMultiGridMatPetsc::TakeDown(){
 33:   int i,info,nn=this->nda;
 35:   for (i=0;i<nn;i++){
 36:     this->grid[i].da=0;
 37:     this->grid[i].H=0;
 38:     this->grid[i].R=0;
 39:     this->grid[i].RHS=0;
 40:     this->grid[i].Interpolate=0;
 41:     this->grid[i].mgrid=0;
 42:     this->grid[i].CScale=0;
 43:     if (this->grid[i].W3){
 44:       info=VecDestroy(this->grid[i].W3);CHKERRQ(info);
 45:     }
 46:     this->grid[i].W3=0;
 47:   }
 48:   this->nda=0;
 49:   return(0);
 50: }


 55: int TaoMultiGridMatPetsc::SetUpMultiGrid(GridCtx*dagrid,int nn){
 56:   int i,info;
 58:   info=this->TakeDown(); CHKERRQ(info);
 59:   this->nda=nn;
 60:   this->ndamax=PETSCDAAPPMAXGRIDS;
 61:   for (i=0;i<nn;i++){
 62:     this->grid[i].H = dagrid[i].H;
 63:     this->grid[i].R = dagrid[i].R;
 64:     this->grid[i].RHS = dagrid[i].RHS;
 65:     this->grid[i].Interpolate = dagrid[i].Interpolate;
 66:     this->grid[i].CScale = dagrid[i].CScale;
 67:     this->grid[i].W3=0;
 68:     info=VecDuplicate(this->grid[i].R,&this->grid[i].W3); CHKERRQ(info);
 69:   }
 70:   info = this->SetMatrix(this->grid[nn-1].H,this->grid[nn-1].H,SAME_NONZERO_PATTERN); CHKERRQ(info);
 71:   info=TaoSelectSubset(TaoMaskFullSpace); CHKERRQ(info);
 72:   return(0);
 73: }


 78: int TaoMultiGridMatPetsc::SetDiagonal(TaoVec *tv)
 79: {
 80:   TaoVecPetsc *pv = dynamic_cast <TaoVecPetsc *> (tv);

 82:   int i,info;
 83:   Vec VCourse, VFine = pv->GetVec();

 86:   info = MatDiagonalSet(this->grid[this->nda-1].H,VFine,INSERT_VALUES); CHKERRQ(info);
 87:   for (i=this->nda-1;i>0;i--){
 88:     VCourse=this->grid[i-1].R;
 89:     info=MatMultTranspose(this->grid[i].Interpolate,VFine,VCourse); CHKERRQ(info);
 90:     info=VecPointwiseMult(VCourse,this->grid[i].CScale,VCourse); CHKERRQ(info);
 91:     info=MatDiagonalSet(this->grid[i-1].H,VCourse,INSERT_VALUES); CHKERRQ(info);
 92:     VFine=VCourse;
 93:   }
 94:   return(0);
 95: }

 99: int TaoMultiGridMatPetsc::AddDiagonal(TaoVec*tv) 
100: {
101:   TaoVecPetsc *pv = dynamic_cast <TaoVecPetsc *> (tv);

103:   int i,info;
104:   Vec VCourse, VFine = pv->GetVec();

107:   info = MatDiagonalSet(this->pm,VFine,ADD_VALUES); CHKERRQ(info);
108:   for (i=this->nda-1;i>0;i--){
109:     VCourse=this->grid[i-1].R;
110:     info=MatMultTranspose(this->grid[i].Interpolate,VFine,VCourse); CHKERRQ(info);
111:     info=VecPointwiseMult(VCourse,this->grid[i].CScale,VCourse); CHKERRQ(info);
112:     info=MatDiagonalSet(this->grid[i-1].H,VCourse,ADD_VALUES); CHKERRQ(info);
113:     VFine=VCourse;
114:   }
115:   return(0);
116: }


121: int TaoMultiGridMatPetsc::ShiftDiagonal(double c){
122:   int i,info;
123:   PetscScalar cc=c;
125:   info = MatShift(pm,cc); CHKERRQ(info);
126:   for (i=this->nda-1;i>0;i--){
127:     info = MatShift(this->grid[i-1].H,cc); CHKERRQ(info);
128:   }
129:   return(0);
130: }

134: int TaoMultiGridMatPetsc::RowScale(TaoVec*tv)
135: {
136:   TaoVecPetsc *pv = dynamic_cast <TaoVecPetsc *> (tv);

138:   int i,info;
139:   Vec VCourse, VFine = pv->GetVec();

142:   info = MatDiagonalScale(this->pm,VFine,PETSC_NULL); CHKERRQ(info);
143:   for (i=this->nda-1;i>0;i--){
144:     VCourse=this->grid[i-1].R;
145:     info=MatMultTranspose(this->grid[i].Interpolate,VFine,VCourse); CHKERRQ(info);
146:     info=VecPointwiseMult(VCourse,this->grid[i].CScale,VCourse); CHKERRQ(info);
147:     info=MatDiagonalScale(this->grid[i-1].H,VCourse,PETSC_NULL); CHKERRQ(info);
148:     VFine=VCourse;
149:   }
150:   return(0);
151: }

155: int TaoMultiGridMatPetsc::ColScale(TaoVec*tv)
156: {
157:   TaoVecPetsc *pv = dynamic_cast <TaoVecPetsc *> (tv);

159:   int i,info;
160:   Vec VCourse,VFine = pv->GetVec();

163:   info = MatDiagonalScale(this->pm,PETSC_NULL,VFine); CHKERRQ(info);
164:   for (i=this->nda-1;i>0;i--){
165:     VCourse=this->grid[i-1].R;
166:     info=MatMultTranspose(this->grid[i].Interpolate,VFine,VCourse); CHKERRQ(info);
167:     info=VecPointwiseMult(VCourse,this->grid[i].CScale,VCourse); CHKERRQ(info);
168:     info=MatDiagonalScale(this->grid[i-1].H,PETSC_NULL,VCourse); CHKERRQ(info);
169:     VFine=VCourse;
170:   }
171:   return(0);
172: }

176: int TaoMultiGridMatPetsc::CreateReducedMatrix(TaoIndexSet*S1,TaoIndexSet*S2,TaoMat**MM){
177:   int info;
178:   Mat B,BPre;
179:   MatStructure flag;
180:   TaoMultiGridMatPetsc *MMM;

183:   info = this->GetMatrix(&B,&BPre,&flag); CHKERRQ(info);
184:   MMM = new TaoMultiGridMatPetsc(B);
185:   info=MMM->SetUpMultiGrid(this->grid,this->nda); CHKERRQ(info);
186:   info = MMM->SetMatrix(B,BPre,flag); CHKERRQ(info);
187:   /*
188:     info = MatDuplicate(B,BB); CHKERRQ(info);
189:     info = MMM->SetMatrix(BB,BBPre,flag); CHKERRQ(info);
190:   */
191:   *MM=MMM;
192:   return(0);
193: }

197: int TaoMultiGridMatPetsc::SetReducedMatrix(TaoMat*M,TaoIndexSet*S1,TaoIndexSet*S2){

199:   int i,info;
200:   TaoIndexSetPetsc *TRows=((TaoIndexSetPetsc *)S1);
201:   TaoIndexSetPetsc *TCols=((TaoIndexSetPetsc *)S2);
202:   TaoMatPetsc *MM=(TaoMatPetsc *)M;
203:   Vec CFine,CCourse,RFine,RCourse;
204:   Mat A,Apre,B,Bpre;

207:   info=MM->GetMatrix(&A,&Apre,0); CHKERRQ(info);
208:   info=this->GetMatrix(&B,&Bpre,0); CHKERRQ(info);
209:   info=TRows->GetMask(&RFine); CHKERRQ(info);
210:   info=TCols->GetMask(&CFine); CHKERRQ(info);
211:   if (A!=B){
212:     info=MatCopy(A,B,SAME_NONZERO_PATTERN); CHKERRQ(info);
213:   }
214:   info=MatGetDiagonal(B,this->grid[this->nda-1].W3); CHKERRQ(info);
215:   info=MatDiagonalScale(B,RFine,CFine); CHKERRQ(info);
216:   info=MatDiagonalSet(B,this->grid[this->nda-1].W3,INSERT_VALUES); CHKERRQ(info);
217:   if (B!=Bpre){
218:     info=MatCopy(Apre,Bpre,SAME_NONZERO_PATTERN); CHKERRQ(info);
219:     info=MatGetDiagonal(Bpre,this->grid[this->nda-1].W3); CHKERRQ(info);
220:     info=MatDiagonalScale(Bpre,RFine,CFine); CHKERRQ(info);
221:     info=MatDiagonalSet(Bpre,this->grid[this->nda-1].W3,INSERT_VALUES); CHKERRQ(info);
222:   }
223:   for (i=this->nda-1;i>0;i--){
224:     CCourse=this->grid[i-1].R;
225:     RCourse=this->grid[i-1].RHS;
226:     info=MatMultTranspose(this->grid[i].Interpolate,CFine,CCourse); CHKERRQ(info);
227:     info=MatMultTranspose(this->grid[i].Interpolate,RFine,RCourse); CHKERRQ(info);
228:     info=VecPointwiseMult(CCourse,this->grid[i].CScale,CCourse); CHKERRQ(info);
229:     info=VecPointwiseMult(RCourse,this->grid[i].CScale,RCourse); CHKERRQ(info);
230:     info=MatGetDiagonal(this->grid[i-1].H,this->grid[i-1].W3); CHKERRQ(info);
231:     info=MatDiagonalScale(this->grid[i-1].H,CCourse,RCourse); CHKERRQ(info);
232:     info=MatDiagonalSet(this->grid[i-1].H,this->grid[i-1].W3,INSERT_VALUES); CHKERRQ(info);
233:     RFine=RCourse;
234:     CFine=CCourse;
235:   }
236:   return(0);
237: }