<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div>  This is great. If you make a branch off of the PETSc  git repository with these additions and work on ex11 you can make a merge request and we can run the code easily on all our test systems (for security reasons one of use needs to launch the tests from your MR).  <a href="https://docs.petsc.org/en/latest/developers/integration/" class="">https://docs.petsc.org/en/latest/developers/integration/</a><div class=""><br class=""></div><div class="">   Barry</div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Dec 15, 2020, at 5:35 AM, Thibault Bridel-Bertomeu <<a href="mailto:thibault.bridelbertomeu@gmail.com" class="">thibault.bridelbertomeu@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Hello everyone, <br class=""></div><div class=""><br class=""></div><div class="">So far, I have the wrappers in the files attached to this e-mail. I still do not know if they work properly - at least the code compiles and the calls to the wrapped-subroutine do not fail - but I wanted to put this here in case someone sees something really wrong with it already.</div><div class=""><br class=""></div><div class="">Thank you again for your help, I'll try to post updates of the F90 version of ex11 regularly in this thread.</div><div class=""><br class=""></div><div class="">Stay safe, <br class=""></div><div class=""><br class=""></div><div class=""><div class=""><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr" class=""><div class=""><div dir="ltr" class=""><div dir="ltr" class=""><div class=""><div class=""><div class=""><div class=""><div class="">Thibault Bridel-Bertomeu<br class=""></div></div></div></div></div></div></div></div></div></div></div></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le dim. 13 déc. 2020 à 16:39, Jed Brown <<a href="mailto:jed@jedbrown.org" class="">jed@jedbrown.org</a>> a écrit :<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Thibault Bridel-Bertomeu <<a href="mailto:thibault.bridelbertomeu@gmail.com" target="_blank" class="">thibault.bridelbertomeu@gmail.com</a>> writes:<br class="">
<br class="">
> Thank you Mark for your answer.<br class="">
><br class="">
> I am not sure what you think could be in the setBC1 routine ? How to make<br class="">
> the connection with the PetscDS ?<br class="">
><br class="">
> On the other hand, I actually found after a while TSMonitorSet has a<br class="">
> fortran wrapper, and it does take as arguments two function pointers, so I<br class="">
> guess it is possible ? Although I am not sure exactly how to play with the<br class="">
> PetscObjectSetFortranCallback & PetscObjectUseFortranCallback macros -<br class="">
> could anybody advise please ?<br class="">
<br class="">
tsmonitorset_ is a good example to follow. In your file, create one of these static structs with a member for each callback. These are IDs that will be used as keys for Fortran callbacks and their contexts. The salient parts of the file are below.<br class="">
<br class="">
static struct {<br class="">
  PetscFortranCallbackId prestep;<br class="">
  PetscFortranCallbackId poststep;<br class="">
  PetscFortranCallbackId rhsfunction;<br class="">
  PetscFortranCallbackId rhsjacobian;<br class="">
  PetscFortranCallbackId ifunction;<br class="">
  PetscFortranCallbackId ijacobian;<br class="">
  PetscFortranCallbackId monitor;<br class="">
  PetscFortranCallbackId mondestroy;<br class="">
  PetscFortranCallbackId transform;<br class="">
#if defined(PETSC_HAVE_F90_2PTR_ARG)<br class="">
  PetscFortranCallbackId function_pgiptr;<br class="">
#endif<br class="">
} _cb;<br class="">
<br class="">
/*<br class="">
   Note ctx is the same as ts so we need to get the Fortran context out of the TS; this gets put in _ctx using the callback ID<br class="">
*/<br class="">
static PetscErrorCode ourmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void *ctx)<br class="">
{<br class="">
  PetscObjectUseFortranCallback(ts,_cb.monitor,(TS*,PetscInt*,PetscReal*,Vec *,void*,PetscErrorCode*),(&ts,&i,&d,&v,_ctx,&ierr));<br class="">
}<br class="">
<br class="">
Then follow as in tsmonitorset_, which sets two callbacks. <br class="">
<br class="">
PETSC_EXTERN void tsmonitorset_(TS *ts,void (*func)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*),void *mctx,void (*d)(void*,PetscErrorCode*),PetscErrorCode *ierr)<br class="">
{<br class="">
  CHKFORTRANNULLFUNCTION(d);<br class="">
  if ((PetscVoidFunction)func == (PetscVoidFunction) tsmonitordefault_) {<br class="">
    *ierr = TSMonitorSet(*ts,(PetscErrorCode (*)(TS,PetscInt,PetscReal,Vec,void*))TSMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);<br class="">
  } else {<br class="">
    *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);<br class="">
    *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)d,mctx);<br class="">
    *ierr = TSMonitorSet(*ts,ourmonitor,*ts,ourmonitordestroy);<br class="">
  }<br class="">
}<br class="">
</blockquote></div>
<span id="cid:f_kipwslzw0"><wrapper_petsc.h90></span><span id="cid:f_kipwsm1a1"><wrapper_petsc.c></span></div></blockquote></div><br class=""></div></body></html>