Dave, Thx a lot for your very clear answer. My last question about modules could be reformulated like this :
Why would I put anything in a ctx while I could simply use modules ? Maybe it has something to do with the fact that PETSc is initially written for C ? Best Timothee 2015-08-18 17:59 GMT+09:00 Dave May <[email protected]>: > > > On 18 August 2015 at 10:42, Timothée Nicolas <[email protected]> > wrote: > >> Hi all, >> >> I am in the process of writing an implicit solver for a set of PDEs >> (namely MHD equations), in FORTRAN. When setting the non-linear function to >> solve via Newton-Krylov, I use a "user defined context", namely the thing >> denoted by "ctx" on the doc page about SNESFunction : >> >> >> http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/SNES/SNESFunction.html#SNESFunction >> >> In practice ctx is a user defined type which contains everything I need >> in the local routine which sets the function on the local part of the grid, >> FormFunctionLocal. That is, some local/global geometrical information on >> the grid, the physical parameter, and possibly any other thing. >> >> In my case it so happens that due to the scheme I have chosen, when I >> compute my function, I need the full solution of the problem at the last >> two time steps (which are in Vec format). So my ctx contains two Vec >> elements. Since I will work in 3D and intend to use a lot of points in the >> future, I am concerned about memory problems which could occur. >> > > In the grand scheme of things, the two vectors in your context aren't > likely to significantly add to the total memory footprint of your code. A > couple of things to note: > * If you run in parallel, only the local part of the vector will be stored > on each MPI process. > * All the KSP methods will allocate auxiliary vectors. Most methods > require more than 2 auxiliary vectors. > * SNES also requires auxiliary vectors. If you use JFNK, that method will > also need some additional temporary vectors. > * If you assemble a Jacobian, this matrix will likely require much more > memory per MPI process than two vectors > > > >> Is there a limit to the size occupied by ctx ? >> > > The only limit is defined by the available memory per MPI process you have > on your target machine. > > >> Would this be better if instead I was declaring global variables in a >> module and using this module inside FormFunctionLocal ? Is this allowed ? >> > > What would be the difference in doing that - the memory usage will be > identical. > > Cheers > Dave > > >> >> Best regards >> >> Timothee NICOLAS >> > >
