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: }