[petsc-users] Copy MPIAIJ Matrix onto MPISeq Matrices on All Processors
Ali Berk Kahraman
aliberkkahraman at yahoo.com
Tue Mar 20 09:11:07 CDT 2018
First of all, thank you for elaboration.
The problem is, I want to generate J myself, using FD, for the following
reason.
I have a WORLD matrix M that I feed into F(u) using user defined context
pointer *ctx. And I call collective functions on that matrix.
I call a for loop inside CreateJacobian function to perturb the F()
entries one by one. But since I have collective calls on a WORLD matrix
M inside F, I have to do this virtually sequentially(not "truly"
sequential, but other processes must wait while one is calling F()). I
cannot have two different processes perturb the u vector at different
locations, this confuses the collective calls on that matrix (or so I
have observed, maybe there was another bug in my code.).
Here, what I want to do is to have a SELF copy of the u vector and the
input matrix M to F() on every process, so every process can
independently work the data. So, I need a way to copy the WORLD matrix
into SELF. My current idea is to write the WORLD matrix as a binary
file, and read it into a SELF matrix.
I am aware that what I want to do should be done using coloring, much
memory and time effective. But, I am working on adaptive grid finite
differences so there is not an easy way to create coloring on my grid.
If there is a Petsc function that generates the coloring for me, I can
also try it.
My apologies, even the simple form got this long :)
On 20-03-2018 16:47, Matthew Knepley wrote:
> On Tue, Mar 20, 2018 at 9:31 AM, Ali Berk Kahraman
> <aliberkkahraman at yahoo.com <mailto:aliberkkahraman at yahoo.com>> wrote:
>
> Thank your for the reply.
>
> I have tried it, but could not get it to work. For it to work, I
> have to know at which vector entry the epsilon in the FD
> approximation is to be added. It is an input for my inexpensive
> function, and I could not find a way to pass it in using MFFD context.
>
>
> MFFD has it in the context as current_u. There is no accessor, but we
> can easily write one. However, that is not how MFFD works. Here is the
> idea:
>
> You give us a function F, your inexpensive function. We get to call
> F however we want to call it, and produce the action of the matrix. So
> for instance,
> we could do this
>
> F(x + h u) - F(x)
> ---------------------
> h ||u||
>
> but we do not have to do that. You should not worry about how we
> perturb the function, you just return the value of the function when
> we call it.
>
> I have been trying to get it working with PETSC_COMM_WORLD too
> with no luck. My guess is that my FormRHSFunction becomes a
> collective function on WORLD, so I cannot generate many separate
> copies each doing its own thing. For this reason I am trying to
> move it to SELF, but I cannot do that if I cannot find a way to
> represent my WORLD matrix input fully on each process.
>
>
> I think things have gotten too confused here for us to help. Lets step
> back and simplify. Can you tell us briefly exactly what you want to
> accomplish? I will start by
> explaining SNES. We are essentially doing Newton's method. This means
> calculating a step du, based on an initial solution u, using this equation
>
> J(u) du = -F(u)
>
> so we need a function to form the residual F, and maybe the Jacobian J
> but we can also form it using calls to F.
>
> It sounds like you want to do something inside F, but I cannot figure
> out what yet.
>
> Thanks,
>
> Matt
>
> Sorry I am stuck in the same question, but any ideas on how to
> move a matrix from WORLD to SELF, similar to the way it is
> possible with vectors using VecScatter?
>
>
>
> On 19-03-2018 21:08, Smith, Barry F. wrote:
>
>
> On Mar 19, 2018, at 12:00 PM, Ali Berk Kahraman
> <aliberkkahraman at yahoo.com
> <mailto:aliberkkahraman at yahoo.com>> wrote:
>
> Dear All,
>
> I have to create my Jacobian numerically using an FD
> function I have written, but the problem is that the
> function evaluation FormRHSFunction creates
> PETSC_COMM_WORLD objects in it, and takes 1
> PETSC_COMM_WORLD matrix as an input. So I cannot work it
> on parallel (every processor calculating its own portion
> of Jacobian), I tried but the machine gets confused.
>
> Huh. It is fine to have the function work on
> PETSC_COMM_WORLD, and it can be in parallel.
>
> My initial idea was to create the objects in
> PETSC_COMM_SELF type within the RHS function, but the
> input COMM_WORLD matrix standed where it was. So my
> question is, is there a way to get a complete copy of a
> distributed matrix on all the processors as seq matrices?
>
> I cannot use the Petsc's version FD function because the
> FormRHSFunction I call to create the Jacobian is slightly
> different than the original FormRHSFunction. The original
> function is too expensive, so I only calculate the
> relevant parts of it in the Jacobian function.
>
> You can do this with MatCreateMFFD() and set your
> inexpensive function as the function.
>
> Best Regards,
>
> Ali Berk Kahraman
> M.Sc. Student, Mechanical Engineering
> Bogazici Uni. Istanbul, Turkey
>
>
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which
> their experiments lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/%7Emk51/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180320/6d78e412/attachment-0001.html>
More information about the petsc-users
mailing list