On Jan 13, 2011, at 12:00 PM, Gianluca Meneghello wrote: > Dear Barry and Jed, > > thanks again for your answers. I'm at the moment trying to understand more > about how ASM and FieldSplit works. I've started reading Barry's book "Domain > Decomposition, Parallel Multilevel Methods for Elliptic Partial Differential > Equations". I hope it's the right starting point. > > Please let me know if you have further suggested readings, taking into > account that I know nothing on domain decomposition in general --- but > something in multigrid. > > Let me ask you a couple of questions for the moment: > Is PCFIELDSPLIT additive the same as PCASM (I guess no as it does not use > overlap)?
It can be additive or multiplicative depending on what you set with PCFieldSplitSetType() > Or is it a Substructuring Method (I haven't yet arrived to that chapter of > the book!). No, nothing to do with substructuring. > What's the difference between multiplicative and symmetric-multiplicative for > PCFIELDSPLIT? Does symmetric-multiplicative refers to eq 1.15 of "Domain > Decomposition"? Yes > > Is it possible use ASM and/or FieldSplit with a matrix-free method? Yes, BUT the algorithms are coded around MatGetSubMatrix() and or MatGetSubMatrices() so to do matrix free you need to have code that applies "part" of the operator at a time (that is you cannot just have a matrix vector product that applies the entire operator to the entire vector. Once you have the ability to apply "part" of the operator at a time you need to code up a MATSHELL that responds appropriately to MatGetSubMatrix() and or MatGetSubMatrices() and returns new matrix-free shell matrices that apply only "their" part of the operator. This is non-trivial for many people but possible. Barry > > Thanks > > Gianluca > > Il giorno 06/gen/2011, alle ore 21.55, Barry Smith ha scritto: > >> >> On Jan 6, 2011, at 6:01 AM, Gianluca Meneghello wrote: >> >>> Dear Barry, >>> >>> thanks a lot for your answer. >>> >>> I tried to do some experiments with MatGetSubMatrix, but I guess I'm >>> doing something wrong as it looks like being painfully slow. >> >> Hmm, we've always found the getsubmatrix takes a few percent of the time. >> Perhaps you are calling it repeatedly for the each domain, rather than once >> and reusing it? Also use MatGetSubMatrices() and get all the submatrices in >> one call rather than one at a time. >> >>> >>> I changed approach and now I'm using the ASM preconditioner. What I'm >>> actually trying to do is to split the domain in different parts --- >>> like interior and boundaries --- and relax (solve) each one with a >>> different smoother (solver). In your opinion, is this the right >>> approach? >> >> Worth trying since it is easy. You can experiment with different smoothers >> on the subdomains using the -sub_pc_type etc options and set different >> prefixes for different subdomains. >> >>> So far it looks much faster than my previous approach of >>> extracting each submatrix. >> >> ASM just uses MatGetSubMatrices() so shouldn't be faster or slower than a >> custom code that does the same thing. >> >>> >>> Also, please let me ask you one more thing. When using ASM with >>> different subdomains on the same process, is the order in which the >>> domains are solved the same as the one in which they are stored in the >>> IS array passed to PCASMSetLocalSubdomains()? I would be interested in >>> controlling this in order to build a downstream marching smoother. >> >> It is only additive, there is no order as Jed noted. Doing multiplicative in >> general is tricky because you want to just update the parts of the residual >> that need to be updated. >> >>> >>> Looking at the references, I've noticed you have worked on multigrid. >>> What I'm trying to do is close to what is described in Diskin, Thomas, >>> Mineck, "Textbook Multigrid Efficiency for Leading Edge Stagnation", >>> in case you already know the paper. >>> http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20040081104_2004082284.pdf >>> >>> Again, thanks a lot. >>> >>> Gianluca >>> >>> On 3 January 2011 17:43, Barry Smith <bsmith at mcs.anl.gov> wrote: >>>> >>>> Gianluca, >>>> >>>> The expected use is with the VecScatter object. First you create a >>>> VecScatter object with VecScatterCreate() then each time you need the >>>> "subvector" you call VecScatterBegin() followed by VecScatterEnd() Note >>>> that usually the VecScatter object is retained and used many times. >>>> >>>> Barry >>>> >>>> >>>> >>>> On Jan 3, 2011, at 5:22 AM, Gianluca Meneghello wrote: >>>> >>>>> Hi, >>>>> >>>>> I'm new to PETSc, so that this can be a very simple question: >>>>> >>>>> I'm looking for something like VecGetSubVector, which I've seen it >>>>> exists in the dev version but not in the released one. >>>>> >>>>> I need to write a smoother for a multigrid algorithm (something like a >>>>> block Gauss Seidel) which can be written in matlab as >>>>> >>>>> for j = 1:ny >>>>> P = <some matrix indices as function of j>; >>>>> du(P) = L(P,P) \ ( rhs(P) - L(P,:)*du + D2(P,P)*du(P) ); >>>>> end >>>>> >>>>> where L is a matrix (in my case the linearized Navier Stokes). >>>>> >>>>> I was thinking about using IS for declaring P, so that D2(P,P) can be >>>>> obtained using MatGetSubMatrix. I would need the same for the vector >>>>> du. >>>>> >>>>> Is there a way to do that without using the developer version? (I >>>>> really don't feel like being "experienced with building, using and >>>>> debugging PETSc). >>>>> >>>>> Thanks in advance >>>>> >>>>> Gianluca >>>> >>>> >> >
