<div dir="ltr"><div><div>Thank you very much Barry. It is working smoothly. Apparently it is very important that for the Get context routine, the context be declared as a pointer, and consistently, also in the routine where it is called (as in ex5f90.F indeed). <br><br></div>Best<br><br></div>Timothee<br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-10-07 20:50 GMT+02:00 Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
  Timothee,<br>
<br>
   That information in the manual is not really accurate.<br>
<br>
   Here is how you should do it. Take a look at  src/snes/examples/tutorials/ex5f90.F and see the definition of the userctx data type and then further down the interface<br>
definitions for SNESSetApplicationContext() and SNESGetApplicationContext(). You need to mimic that same structure in your code but with MatShellSet/GetContext() instead.<br>
In this way you can do things properly and not need to deal with integer keys into data etc. Note that each level can have its own userctx data.<br>
<span class="HOEnZb"><font color="#888888"><br>
  Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
<br>
> On Oct 7, 2015, at 1:19 PM, Timothée Nicolas <<a href="mailto:timothee.nicolas@gmail.com">timothee.nicolas@gmail.com</a>> wrote:<br>
><br>
> Hi all,<br>
><br>
> In the manual, it says, about MatShellSetContext and MatShellGetContext, that in FORTRAN we cannot set a context other than integer or PetscObject.<br>
><br>
> <a href="http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatCreateShell.html#MatCreateShell" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatCreateShell.html#MatCreateShell</a><br>
><br>
> In my understanding, it means that I would be allowed to do, say<br>
><br>
> PetscInt :: ione<br>
> ione=1<br>
> call MatCreateShell(PETSC_COMM_WORLD,m,m,N,N,PETSC_NULL_INTEGER,A,ierr)<br>
> call MatShellSetContext(A,ione,ierr)<br>
> call MatShellSetOperation(A,MATOP_MULT,MyMult,ierr)<br>
><br>
> in the routine where I define the matrix A, and then recover the integer in the routine MyMult with<br>
><br>
> PetscInt :: intval<br>
> call MatShellGetContext(A,intval,ierr)<br>
><br>
> This would allow me to circumvent the interdiction to pass a real context, by e.g. using a module at the beginning of MyMult, containing contexts and discriminating which context to use with the value of the integer (I want to use Multigrid, so I cannot have a different routine for each level obviously). However, this approach did not work, the value in intval stays undefined. How could I solve this ?<br>
><br>
> Best<br>
><br>
> Timothee<br>
<br>
</div></div></blockquote></div><br></div>