xref: /petsc/src/ksp/pc/impls/deflation/deflationspace.c (revision 7b3faf330b6088da2e575551b6f8a2eac93b9592)
15170378fSJakub Kruzik #include <../src/ksp/pc/impls/deflation/deflation.h> /*I "petscksp.h" I*/
2e53e0a0dSJakub Kruzik 
3e53e0a0dSJakub Kruzik PetscScalar db2[] = {0.7071067811865476,0.7071067811865476};
4e53e0a0dSJakub Kruzik 
5e53e0a0dSJakub Kruzik PetscScalar db4[] = {-0.12940952255092145,0.22414386804185735,0.836516303737469,0.48296291314469025};
6e53e0a0dSJakub Kruzik 
7e53e0a0dSJakub Kruzik PetscScalar db8[] = {-0.010597401784997278,
8e53e0a0dSJakub Kruzik 0.032883011666982945,
9e53e0a0dSJakub Kruzik 0.030841381835986965,
10e53e0a0dSJakub Kruzik -0.18703481171888114,
11e53e0a0dSJakub Kruzik -0.02798376941698385,
12e53e0a0dSJakub Kruzik 0.6308807679295904,
13e53e0a0dSJakub Kruzik 0.7148465705525415,
14e53e0a0dSJakub Kruzik 0.23037781330885523};
15e53e0a0dSJakub Kruzik 
16e53e0a0dSJakub Kruzik PetscScalar db16[] = {-0.00011747678400228192,
17e53e0a0dSJakub Kruzik 0.0006754494059985568,
18e53e0a0dSJakub Kruzik -0.0003917403729959771,
19e53e0a0dSJakub Kruzik -0.00487035299301066,
20e53e0a0dSJakub Kruzik 0.008746094047015655,
21e53e0a0dSJakub Kruzik 0.013981027917015516,
22e53e0a0dSJakub Kruzik -0.04408825393106472,
23e53e0a0dSJakub Kruzik -0.01736930100202211,
24e53e0a0dSJakub Kruzik 0.128747426620186,
25e53e0a0dSJakub Kruzik 0.00047248457399797254,
26e53e0a0dSJakub Kruzik -0.2840155429624281,
27e53e0a0dSJakub Kruzik -0.015829105256023893,
28e53e0a0dSJakub Kruzik 0.5853546836548691,
29e53e0a0dSJakub Kruzik 0.6756307362980128,
30e53e0a0dSJakub Kruzik 0.3128715909144659,
31e53e0a0dSJakub Kruzik 0.05441584224308161};
32e53e0a0dSJakub Kruzik 
33e53e0a0dSJakub Kruzik PetscScalar biorth22[] = {0.0,
34e53e0a0dSJakub Kruzik -0.1767766952966369,
35e53e0a0dSJakub Kruzik 0.3535533905932738,
36e53e0a0dSJakub Kruzik 1.0606601717798214,
37e53e0a0dSJakub Kruzik 0.3535533905932738,
38e53e0a0dSJakub Kruzik -0.1767766952966369};
39e53e0a0dSJakub Kruzik 
4065149469SJakub Kruzik PetscScalar meyer[] = {0.0,-1.009999956941423e-12,8.519459636796214e-09,-1.111944952595278e-08,-1.0798819539621958e-08,6.066975741351135e-08,-1.0866516536735883e-07,8.200680650386481e-08,1.1783004497663934e-07,-5.506340565252278e-07,1.1307947017916706e-06,-1.489549216497156e-06,7.367572885903746e-07,3.20544191334478e-06,-1.6312699734552807e-05,6.554305930575149e-05,-0.0006011502343516092,-0.002704672124643725,0.002202534100911002,0.006045814097323304,-0.006387718318497156,-0.011061496392513451,0.015270015130934803,0.017423434103729693,-0.03213079399021176,-0.024348745906078023,0.0637390243228016,0.030655091960824263,-0.13284520043622938,-0.035087555656258346,0.44459300275757724,0.7445855923188063,0.44459300275757724,-0.035087555656258346,-0.13284520043622938,0.030655091960824263,0.0637390243228016,-0.024348745906078023,-0.03213079399021176,0.017423434103729693,0.015270015130934803,-0.011061496392513451,-0.006387718318497156,0.006045814097323304,0.002202534100911002,-0.002704672124643725,-0.0006011502343516092,6.554305930575149e-05,-1.6312699734552807e-05,3.20544191334478e-06,7.367572885903746e-07,-1.489549216497156e-06,1.1307947017916706e-06,-5.506340565252278e-07,1.1783004497663934e-07,8.200680650386481e-08,-1.0866516536735883e-07,6.066975741351135e-08,-1.0798819539621958e-08,-1.111944952595278e-08,8.519459636796214e-09,-1.009999956941423e-12};
41e53e0a0dSJakub Kruzik 
42e53e0a0dSJakub Kruzik static PetscErrorCode PCDeflationCreateSpaceWave(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscInt ncoeffs,PetscScalar *coeffs,PetscBool trunc,Mat *H)
43e53e0a0dSJakub Kruzik {
44e53e0a0dSJakub Kruzik   Mat            defl;
45e53e0a0dSJakub Kruzik   PetscInt       i,j,k,ilo,ihi,*Iidx;
4683aaf211SJakub Kruzik   PetscErrorCode ierr;
47e53e0a0dSJakub Kruzik 
48e53e0a0dSJakub Kruzik   PetscFunctionBegin;
49e53e0a0dSJakub Kruzik   ierr = PetscMalloc1(ncoeffs,&Iidx);CHKERRQ(ierr);
50e53e0a0dSJakub Kruzik 
51e53e0a0dSJakub Kruzik   ierr = MatCreate(comm,&defl);CHKERRQ(ierr);
52e53e0a0dSJakub Kruzik   ierr = MatSetSizes(defl,m,n,M,N);CHKERRQ(ierr);
53e53e0a0dSJakub Kruzik   ierr = MatSetUp(defl);CHKERRQ(ierr);
54e53e0a0dSJakub Kruzik   ierr = MatSeqAIJSetPreallocation(defl,ncoeffs,NULL);CHKERRQ(ierr);
55e53e0a0dSJakub Kruzik   ierr = MatMPIAIJSetPreallocation(defl,ncoeffs,NULL,ncoeffs,NULL);CHKERRQ(ierr);
56e53e0a0dSJakub Kruzik   ierr = MatSetOption(defl,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE);CHKERRQ(ierr);
577632c537SJakub Kruzik   ierr = MatSetOption(defl,MAT_NO_OFF_PROC_ENTRIES,PETSC_TRUE);CHKERRQ(ierr);
58e53e0a0dSJakub Kruzik 
59e53e0a0dSJakub Kruzik   /* Alg 735 Taswell: fvecmat */
60e53e0a0dSJakub Kruzik   k = ncoeffs -2;
61e53e0a0dSJakub Kruzik   if (trunc) k = k/2;
62e53e0a0dSJakub Kruzik 
63e53e0a0dSJakub Kruzik   ierr = MatGetOwnershipRange(defl,&ilo,&ihi);CHKERRQ(ierr);
64e53e0a0dSJakub Kruzik   for (i=0; i<ncoeffs; i++) {
65e53e0a0dSJakub Kruzik     Iidx[i] = i+ilo*2 -k;
66e53e0a0dSJakub Kruzik     if (Iidx[i] >= N) Iidx[i] = PETSC_MIN_INT;
67e53e0a0dSJakub Kruzik   }
68e53e0a0dSJakub Kruzik   for (i=ilo; i<ihi; i++) {
69e53e0a0dSJakub Kruzik     ierr = MatSetValues(defl,1,&i,ncoeffs,Iidx,coeffs,INSERT_VALUES);CHKERRQ(ierr);
70e53e0a0dSJakub Kruzik     for (j=0; j<ncoeffs; j++) {
71e53e0a0dSJakub Kruzik       Iidx[j] += 2;
72e53e0a0dSJakub Kruzik       if (Iidx[j] >= N) Iidx[j] = PETSC_MIN_INT;
73e53e0a0dSJakub Kruzik     }
74e53e0a0dSJakub Kruzik   }
75e53e0a0dSJakub Kruzik 
76e53e0a0dSJakub Kruzik   ierr = MatAssemblyBegin(defl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
77e53e0a0dSJakub Kruzik   ierr = MatAssemblyEnd(defl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
78e53e0a0dSJakub Kruzik 
79e53e0a0dSJakub Kruzik   ierr = PetscFree(Iidx);CHKERRQ(ierr);
80e53e0a0dSJakub Kruzik   *H = defl;
81e53e0a0dSJakub Kruzik   PetscFunctionReturn(0);
82e53e0a0dSJakub Kruzik }
83e53e0a0dSJakub Kruzik 
84e53e0a0dSJakub Kruzik PetscErrorCode PCDeflationGetSpaceHaar(PC pc,Mat *W,PetscInt size)
85e53e0a0dSJakub Kruzik {
86e53e0a0dSJakub Kruzik   Mat            A,defl;
87e53e0a0dSJakub Kruzik   PetscInt       i,j,len,ilo,ihi,*Iidx,m,M;
889e56ec8aSJakub Kruzik   PetscScalar    *col,val;
8983aaf211SJakub Kruzik   PetscErrorCode ierr;
90e53e0a0dSJakub Kruzik 
91e53e0a0dSJakub Kruzik   PetscFunctionBegin;
92e53e0a0dSJakub Kruzik   /* Haar basis wavelet, level=size */
93e53e0a0dSJakub Kruzik   len = pow(2,size);
9420cd032fSJakub Kruzik   ierr = PetscMalloc2(len,&col,len,&Iidx);CHKERRQ(ierr);
95e53e0a0dSJakub Kruzik   val = 1./pow(2,size/2.);
96e53e0a0dSJakub Kruzik   for (i=0; i<len; i++) col[i] = val;
97e53e0a0dSJakub Kruzik 
981fdb00f9SJakub Kruzik   ierr = PCGetOperators(pc,NULL,&A);CHKERRQ(ierr);
99e53e0a0dSJakub Kruzik   ierr = MatGetLocalSize(A,&m,NULL);CHKERRQ(ierr);
100e53e0a0dSJakub Kruzik   ierr = MatGetSize(A,&M,NULL);CHKERRQ(ierr);
101e53e0a0dSJakub Kruzik   ierr = MatCreate(PetscObjectComm((PetscObject)A),&defl);CHKERRQ(ierr);
1021fdb00f9SJakub Kruzik   ierr = MatSetSizes(defl,m,PETSC_DECIDE,M,(PetscInt)ceil(M/(float)len));CHKERRQ(ierr);
103e53e0a0dSJakub Kruzik   ierr = MatSetUp(defl);CHKERRQ(ierr);
104e53e0a0dSJakub Kruzik   ierr = MatSeqAIJSetPreallocation(defl,size,NULL);CHKERRQ(ierr);
105e53e0a0dSJakub Kruzik   ierr = MatMPIAIJSetPreallocation(defl,size,NULL,size,NULL);CHKERRQ(ierr);
106e53e0a0dSJakub Kruzik   ierr = MatSetOption(defl,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE);CHKERRQ(ierr);
107e53e0a0dSJakub Kruzik 
108e53e0a0dSJakub Kruzik   ierr = MatGetOwnershipRangeColumn(defl,&ilo,&ihi);CHKERRQ(ierr);
109e53e0a0dSJakub Kruzik   for (i=0; i<len; i++) Iidx[i] = i+ilo*len;
110e53e0a0dSJakub Kruzik   if (M%len && ihi == (int)ceil(M/(float)len)) ihi -= 1;
111e53e0a0dSJakub Kruzik   for (i=ilo; i<ihi; i++) {
112e53e0a0dSJakub Kruzik     ierr = MatSetValues(defl,len,Iidx,1,&i,col,INSERT_VALUES);CHKERRQ(ierr);
113e53e0a0dSJakub Kruzik     for (j=0; j<len; j++) Iidx[j] += len;
114e53e0a0dSJakub Kruzik   }
115e53e0a0dSJakub Kruzik   if (M%len && ihi+1 == ceil(M/(float)len)) {
116e53e0a0dSJakub Kruzik     len = M%len;
117e53e0a0dSJakub Kruzik     val = 1./pow(pow(2,len),0.5);
118e53e0a0dSJakub Kruzik     for (i=0; i<len; i++) col[i] = val;
119e53e0a0dSJakub Kruzik     ierr = MatSetValues(defl,len,Iidx,1,&ihi,col,INSERT_VALUES);CHKERRQ(ierr);
120e53e0a0dSJakub Kruzik   }
121e53e0a0dSJakub Kruzik 
122e53e0a0dSJakub Kruzik   ierr = MatAssemblyBegin(defl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
123e53e0a0dSJakub Kruzik   ierr = MatAssemblyEnd(defl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
124e53e0a0dSJakub Kruzik 
12520cd032fSJakub Kruzik   ierr = PetscFree2(col,Iidx);CHKERRQ(ierr);
126e53e0a0dSJakub Kruzik   *W = defl;
127e53e0a0dSJakub Kruzik   PetscFunctionReturn(0);
128e53e0a0dSJakub Kruzik }
129e53e0a0dSJakub Kruzik 
130e53e0a0dSJakub Kruzik PetscErrorCode PCDeflationGetSpaceWave(PC pc,Mat *W,PetscInt size,PetscInt ncoeffs,PetscScalar *coeffs,PetscBool trunc)
131e53e0a0dSJakub Kruzik {
132e53e0a0dSJakub Kruzik   Mat            A,*H,defl;
133e53e0a0dSJakub Kruzik   PetscInt       i,m,M,Mdefl,Ndefl;
134e53e0a0dSJakub Kruzik   MPI_Comm       comm;
13583aaf211SJakub Kruzik   PetscErrorCode ierr;
136e53e0a0dSJakub Kruzik 
137e53e0a0dSJakub Kruzik   PetscFunctionBegin;
138e53e0a0dSJakub Kruzik   ierr = PetscObjectGetComm((PetscObject)pc,&comm);CHKERRQ(ierr);
139e53e0a0dSJakub Kruzik   ierr = PetscMalloc1(size,&H);CHKERRQ(ierr);
1401fdb00f9SJakub Kruzik   ierr = PCGetOperators(pc,&A,NULL);CHKERRQ(ierr);
141e53e0a0dSJakub Kruzik   ierr = MatGetLocalSize(A,&m,NULL);CHKERRQ(ierr);
142e53e0a0dSJakub Kruzik   ierr = MatGetSize(A,&M,NULL);CHKERRQ(ierr);
143e53e0a0dSJakub Kruzik   Mdefl = M;
144e53e0a0dSJakub Kruzik   Ndefl = M;
145e53e0a0dSJakub Kruzik   for (i=0; i<size; i++) {
146e53e0a0dSJakub Kruzik     if (Mdefl%2)  {
14720cd032fSJakub Kruzik       if (trunc) Mdefl = (PetscInt)PetscCeilReal(Mdefl/2.);
14820cd032fSJakub Kruzik       else       Mdefl = (PetscInt)PetscFloorReal((ncoeffs+Mdefl-1)/2.);
14920cd032fSJakub Kruzik     } else       Mdefl = Mdefl/2;
150e53e0a0dSJakub Kruzik     ierr = PCDeflationCreateSpaceWave(comm,PETSC_DECIDE,m,Mdefl,Ndefl,ncoeffs,coeffs,trunc,&H[i]);CHKERRQ(ierr);
151e53e0a0dSJakub Kruzik     ierr = MatGetLocalSize(H[i],&m,NULL);CHKERRQ(ierr);
152e53e0a0dSJakub Kruzik     Ndefl = Mdefl;
153e53e0a0dSJakub Kruzik   }
154e53e0a0dSJakub Kruzik   ierr = MatCreateComposite(comm,size,H,&defl);CHKERRQ(ierr);
155e53e0a0dSJakub Kruzik   ierr = MatCompositeSetType(defl,MAT_COMPOSITE_MULTIPLICATIVE);CHKERRQ(ierr);
156e53e0a0dSJakub Kruzik   *W = defl;
157e53e0a0dSJakub Kruzik 
158e53e0a0dSJakub Kruzik   for (i=0; i<size; i++) {
159e53e0a0dSJakub Kruzik     ierr = MatDestroy(&H[i]);CHKERRQ(ierr);
160e53e0a0dSJakub Kruzik   }
161e53e0a0dSJakub Kruzik   ierr = PetscFree(H);CHKERRQ(ierr);
162e53e0a0dSJakub Kruzik   PetscFunctionReturn(0);
163e53e0a0dSJakub Kruzik }
164e53e0a0dSJakub Kruzik 
165e53e0a0dSJakub Kruzik PetscErrorCode PCDeflationGetSpaceAggregation(PC pc,Mat *W)
166e53e0a0dSJakub Kruzik {
167e53e0a0dSJakub Kruzik   Mat            A,defl;
168*7b3faf33SJakub Kruzik   PetscInt       i,ilo,ihi,*Iidx,M;
169*7b3faf33SJakub Kruzik   PetscMPIInt    m;
1709e56ec8aSJakub Kruzik   PetscScalar    *col;
171e53e0a0dSJakub Kruzik   MPI_Comm       comm;
17283aaf211SJakub Kruzik   PetscErrorCode ierr;
173e53e0a0dSJakub Kruzik 
174e53e0a0dSJakub Kruzik   PetscFunctionBegin;
1751fdb00f9SJakub Kruzik   ierr = PCGetOperators(pc,&A,NULL);CHKERRQ(ierr);
176e53e0a0dSJakub Kruzik   ierr = MatGetOwnershipRangeColumn(A,&ilo,&ihi);CHKERRQ(ierr);
177e53e0a0dSJakub Kruzik   ierr = MatGetSize(A,&M,NULL);CHKERRQ(ierr);
178e53e0a0dSJakub Kruzik   ierr = PetscObjectGetComm((PetscObject)A,&comm);CHKERRQ(ierr);
179e53e0a0dSJakub Kruzik   ierr = MPI_Comm_size(comm,&m);CHKERRQ(ierr);
180e53e0a0dSJakub Kruzik   ierr = MatCreate(comm,&defl);CHKERRQ(ierr);
181e53e0a0dSJakub Kruzik   ierr = MatSetSizes(defl,ihi-ilo,1,M,m);CHKERRQ(ierr);
182e53e0a0dSJakub Kruzik   ierr = MatSetUp(defl);CHKERRQ(ierr);
183e53e0a0dSJakub Kruzik   ierr = MatSeqAIJSetPreallocation(defl,1,NULL);CHKERRQ(ierr);
184e53e0a0dSJakub Kruzik   ierr = MatMPIAIJSetPreallocation(defl,1,NULL,0,NULL);CHKERRQ(ierr);
185e53e0a0dSJakub Kruzik   ierr = MatSetOption(defl,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE);CHKERRQ(ierr);
1867632c537SJakub Kruzik   ierr = MatSetOption(defl,MAT_NO_OFF_PROC_ENTRIES,PETSC_TRUE);CHKERRQ(ierr);
187e53e0a0dSJakub Kruzik 
18820cd032fSJakub Kruzik   ierr = PetscMalloc2(ihi-ilo,&col,ihi-ilo,&Iidx);CHKERRQ(ierr);
189e53e0a0dSJakub Kruzik   for (i=ilo; i<ihi; i++) {
190e53e0a0dSJakub Kruzik     Iidx[i-ilo] = i;
191e53e0a0dSJakub Kruzik     col[i-ilo] = 1;
192e53e0a0dSJakub Kruzik   }
193*7b3faf33SJakub Kruzik   ierr = MPI_Comm_rank(comm,&m);CHKERRQ(ierr);
194*7b3faf33SJakub Kruzik   i = m;
195e53e0a0dSJakub Kruzik   ierr = MatSetValues(defl,ihi-ilo,Iidx,1,&i,col,INSERT_VALUES);CHKERRQ(ierr);
196e53e0a0dSJakub Kruzik 
197e53e0a0dSJakub Kruzik   ierr = MatAssemblyBegin(defl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
198e53e0a0dSJakub Kruzik   ierr = MatAssemblyEnd(defl,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
199e53e0a0dSJakub Kruzik 
20020cd032fSJakub Kruzik   ierr = PetscFree2(col,Iidx);CHKERRQ(ierr);
201e53e0a0dSJakub Kruzik   *W = defl;
202e53e0a0dSJakub Kruzik   PetscFunctionReturn(0);
203e53e0a0dSJakub Kruzik }
204e53e0a0dSJakub Kruzik 
205e53e0a0dSJakub Kruzik PetscErrorCode PCDeflationComputeSpace(PC pc)
206e53e0a0dSJakub Kruzik {
207e53e0a0dSJakub Kruzik   Mat            defl;
208e53e0a0dSJakub Kruzik   PetscBool      transp=PETSC_TRUE;
209e53e0a0dSJakub Kruzik   PC_Deflation   *def = (PC_Deflation*)pc->data;
21083aaf211SJakub Kruzik   PetscErrorCode ierr;
211e53e0a0dSJakub Kruzik 
212e53e0a0dSJakub Kruzik   PetscFunctionBegin;
2131fdb00f9SJakub Kruzik   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
2141fdb00f9SJakub Kruzik   if (def->spacesize < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Wrong PCDeflation space size specified: %D",def->spacesize);
215e53e0a0dSJakub Kruzik   switch (def->spacetype) {
216e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_HAAR:
217e53e0a0dSJakub Kruzik       transp = PETSC_FALSE;
218e53e0a0dSJakub Kruzik       ierr = PCDeflationGetSpaceHaar(pc,&defl,def->spacesize);CHKERRQ(ierr);break;
219e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_DB2:
22058e59ef8SJakub Kruzik       ierr = PCDeflationGetSpaceWave(pc,&defl,def->spacesize,2,db2,PetscNot(def->extendsp));CHKERRQ(ierr);break;
221e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_DB4:
22258e59ef8SJakub Kruzik       ierr = PCDeflationGetSpaceWave(pc,&defl,def->spacesize,4,db4,PetscNot(def->extendsp));CHKERRQ(ierr);break;
223e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_DB8:
22458e59ef8SJakub Kruzik       ierr = PCDeflationGetSpaceWave(pc,&defl,def->spacesize,8,db8,PetscNot(def->extendsp));CHKERRQ(ierr);break;
225e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_DB16:
22658e59ef8SJakub Kruzik       ierr = PCDeflationGetSpaceWave(pc,&defl,def->spacesize,16,db16,PetscNot(def->extendsp));CHKERRQ(ierr);break;
227e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_BIORTH22:
22858e59ef8SJakub Kruzik       ierr = PCDeflationGetSpaceWave(pc,&defl,def->spacesize,6,biorth22,PetscNot(def->extendsp));CHKERRQ(ierr);break;
229e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_MEYER:
23058e59ef8SJakub Kruzik       ierr = PCDeflationGetSpaceWave(pc,&defl,def->spacesize,62,meyer,PetscNot(def->extendsp));CHKERRQ(ierr);break;
231e53e0a0dSJakub Kruzik     case PC_DEFLATION_SPACE_AGGREGATION:
232e53e0a0dSJakub Kruzik       transp = PETSC_FALSE;
233e53e0a0dSJakub Kruzik       ierr = PCDeflationGetSpaceAggregation(pc,&defl);CHKERRQ(ierr);break;
2341fdb00f9SJakub Kruzik     default: SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Wrong PCDeflationSpaceType specified");
235e53e0a0dSJakub Kruzik   }
236e53e0a0dSJakub Kruzik 
237e53e0a0dSJakub Kruzik   ierr = PCDeflationSetSpace(pc,defl,transp);CHKERRQ(ierr);
23828da0170SJakub Kruzik   ierr = MatDestroy(&defl);CHKERRQ(ierr);
239e53e0a0dSJakub Kruzik   PetscFunctionReturn(0);
240e53e0a0dSJakub Kruzik }
241e53e0a0dSJakub Kruzik 
242