<div dir="ltr"><div><div><div><div>Hi,<br></div><div>Thank you so much for your reply.<br></div><div><br>1<br>One note that I forgot to mention is that I'm using FORTRAN (sorry!).<br>Is it possible to set up the context to pass M and the ksp for M? I also try to avoid common blocks but in this case it seemed inevitable. Since M and A are already global in the code that I'm using maybe I could just use the kspM in the context.<br><br>The other side of my question was more on whether doing MatCreateShell(...) and then MatShellSetOperation(...,MATOP_CREATE,...) would work because it seems like a chicken-vs-egg kind of situation. Is the CREATE operation executed after this? I couldn't find an example that uses this operation and if I google MATOP_CREATE the only thing I get is the source code of the file petscmat.h.<br><br>2<br></div>Thanks!<br>I'm sorry if this was already included in your answer but I just wanted to make sure. For a moderately large sparse problem (100K equations) considering that I'm using two KSPSolve in each call to MatMult, and I'm going to use this Shell in an eigensolver (that will probably call MatMult several times), wouldn't it end up being faster to just do a Sparse Direct to get the LU decomposition of M and then just do the forward and back substitution?<br><br>3<br></div>My colleague suggested that I do a first run without shift for EPS_LARGEST_MAGNITUDE and then, if this value is negative, I would use the eigenvalue as a shift and compute EPS_LARGEST_MAGNITUDE again. This seems like a fine solution to me but I was wondering if just doing EPS_LARGEST_REAL without shift would already do something like this but more efficiently since, for example, you can detect very soon if your eigenvalue is converging to a negative number, allowing with just a few iterations to get the magnitude of the necessary shift. Should I just add a very large shift to begin with? Or is EPS_LARGEST_REAL fine?<br><br></div>Thank for your time,<br></div>Miguel<br><div><div><br><br><div><div> <br></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 7, 2014 at 5:56 PM, Jed Brown <span dir="ltr"><<a href="mailto:jed@jedbrown.org" target="_blank">jed@jedbrown.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Miguel Arriaga <<a href="mailto:miguelarriagaecunha@gmail.com">miguelarriagaecunha@gmail.com</a>> writes:<br>
<br>
> Hi there,<br>
> I have a matrix shell where the Mult operation looks like this:<br>
> y=1/2(K+K*) x<br>
> with K=M^-1 A and K* its transpose.<br>
><br>
> 1- For setting-up the operation MatMult, since I need to do a KSPSolve on<br>
> M, should I set-up the KSP on the operation MATOP_CREATE and destroy it on<br>
> MATOP_DESTROY and store it as a global variable?<br>
<br>
</span>Store it in the context.  That's why callbacks always have a context.<br>
Global variables are terrible.<br>
<span class=""><br>
> 2- For "inverting" M, considering that M is symmetric, Should I (a) use LU,<br>
> or should I (b) use an iterative procedure like CG with ILU, since M is<br>
> symmetric positive definite? Is there a faster iterative method for a SPD<br>
> matrix?<br>
<br>
</span>CG/Jacobi is usually fine for the mass matrix.<br>
<span class=""><br>
> 3- I want to use this matrix shell in SLEPc to compute the largest positive<br>
> eigenvalue, which will be smaller in magnitude than the smallest negative<br>
> real (possibly very close to zero). Since it is a matrix shell I assume<br>
> that I can't really use Shift-and-invert without choosing an iterative<br>
> procedure that only requires MatMult.<br>
<br>
</span>Start with a simple shift (not shift-and-invert).<br>
<div class="HOEnZb"><div class="h5"><br>
> What would be the best Method+Preconditioner for this case? Note that<br>
> this is a Real Symmetric matrix (but not Positive definite). Should I<br>
> set all of these as true?<br>
><br>
> MATOP_IS_HERMITIAN<br>
> MATOP_IS_STRUCTURALLY_SYMMETRIC<br>
> MATOP_IS_SYMMETRIC<br>
><br>
> Thank you,<br>
> Miguel<br>
</div></div></blockquote></div><br></div>