What you describe is not the expected behavior. I expected exactly the result that you expected.
Do you perhaps have some PETSc options around that may be changing the post-smoother? On the command line or in the file petscrc or in the environmental variable PETSC_OPTIONS? Can you send us some code that we could run that reproduces the problem? Barry > On Aug 19, 2015, at 9:26 PM, Aulisa, Eugenio <[email protected]> wrote: > > Hi, > > I am solving an iteration of > > GMRES -> PCMG -> PCASM > > where I build my particular ASM domain decomposition. > > In setting the PCMG I would like at each level > to use the same pre- and post-smoother > and for this reason I am using > ... > PCMGGetSmoother ( pcMG, level , &subksp ); > > to extract and set at each level the ksp object. > > In setting PCASM then I use > ... > KSPGetPC ( subksp, &subpc ); > PCSetType ( subpc, PCASM ); > ... > and then set my own decomposition > ... > PCASMSetLocalSubdomains(subpc,_is_loc_idx.size(),&_is_ovl[0],&_is_loc[0]); > ... > > Now everything compiles, and runs with no memory leakage, > but I do not get the expected convergence. > > When I checked the output of -ksp_view, I saw something that puzzled me: > at each level >0, while in the MG pre-smoother the ASM domain decomposition > is the one that I set, for example with 4 processes I get > >>>>>>>>>>>>>>>>>>>> > ... > Down solver (pre-smoother) on level 2 ------------------------------- > KSP Object: (level-2) 4 MPI processes > type: gmres > GMRES: restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > GMRES: happy breakdown tolerance 1e-30 > maximum iterations=1 > using preconditioner applied to right hand side for initial guess > tolerances: relative=1e-12, absolute=1e-20, divergence=1e+50 > left preconditioning > using nonzero initial guess > using NONE norm type for convergence test > PC Object: (level-2) 4 MPI processes > type: asm > Additive Schwarz: total subdomain blocks = 198, amount of overlap = 0 > Additive Schwarz: restriction/interpolation type - RESTRICT > [0] number of local blocks = 52 > [1] number of local blocks = 48 > [2] number of local blocks = 48 > [3] number of local blocks = 50 > Local solve info for each block is in the following KSP and PC objects: > - - - - - - - - - - - - - - - - - - > ... >>>>>>>>>>>> > > > in the post-smoother I have the default ASM decomposition with overlapping 1: > > >>>>>>>>>>>> > ... > Up solver (post-smoother) on level 2 ------------------------------- > KSP Object: (level-2) 4 MPI processes > type: gmres > GMRES: restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > GMRES: happy breakdown tolerance 1e-30 > maximum iterations=2 > tolerances: relative=1e-12, absolute=1e-20, divergence=1e+50 > left preconditioning > using nonzero initial guess > using NONE norm type for convergence test > PC Object: (level-2) 4 MPI processes > type: asm > Additive Schwarz: total subdomain blocks = 4, amount of overlap = 1 > Additive Schwarz: restriction/interpolation type - RESTRICT > Local solve is same for all blocks, in the following KSP and PC > objects: > KSP Object: (level-2sub_) 1 MPI processes > type: preonly > maximum iterations=10000, initial guess is zero > tolerances: relative=1e-05, absolute=1e-50, divergence=10000 > left preconditioning > ... >>>>>>>>>>>>>> > %%%%%%%%%%%%%%%%%%%%%%%% > > So it seams that by using > > PCMGGetSmoother ( pcMG, level , &subksp ); > > I was capable to set both the pre- and post- smoothers to be PCASM > but everything I did after that applied only to the > pre-smoother, while the post-smoother got the default PCASM options. > > I know that I can use > PCMGGetSmootherDown and PCMGGetSmootherUp, but that would > probably double the memory allocation and the computational time in the ASM. > > Is there any way I can just use PCMGGetSmoother > and use the same PCASM in the pre- and post- smoother? > > I hope I was clear enough. > > Thanks a lot for your help, > Eugenio > > >
