<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>  Good question.  There is a trick to limit the amount of work you need to do with a  new fork after you have already made changes with a PETSc clone, but it looks like we do not document this clearly in the webpages. (I couldn't find it).<div class=""><br class=""></div><div class="">  Yes, you do need to make a fork, but after you have made the fork on the GitLab website (and have done nothing on your machine) edit the file $PETSC_DIR/.git/config  for your clone on your machine </div><div class=""><br class=""></div><div class="">  Locate the line that has url = <a href="mailto:git@gitlab.com" class="">git@gitlab.com</a>:petsc/petsc.git  (this may have an https at the beginning of the line)</div><div class=""><br class=""></div><div class="">  Change this line to point to the fork url instead with git@ not https, which will be pretty much the same URL but with your user id instead of petsc in the address.  Then git push and it will push to your fork.</div><div class=""><br class=""></div><div class="">  Now you changes will be in your fork and you can make the MR from your fork URL on Gitlab. (In other words this editing trick converts your PETSc clone on your machine to a PETSc fork).</div><div class=""><br class=""></div><div class="">  I hope I have explained this clearly enough it goes smoothly.</div><div class=""><br class=""></div><div class="">  Barry</div><div class=""><br class=""></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Dec 18, 2020, at 3:00 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="">Hello Barry, <div class=""><br class=""></div><div class="">I'll start the MR as soon as possible then so that specialists can indeed have a look. Do I have to fork PETSc to start a MR or are PETSc repo settings such that can I push a branch from the PETSc clone I got ?</div><div class=""><br clear="all" 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<br class=""></div></div></div></div></div></div></div></div></div></div></div><br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le mer. 16 déc. 2020 à 07:47, Barry Smith <<a href="mailto:bsmith@petsc.dev" class="">bsmith@petsc.dev</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"><div style="overflow-wrap: break-word;" class=""><div class=""><br class=""></div><div class="">  Thibault,</div><div class=""><br class=""></div>  A subdirectory for the example is fine; we have other examples that use subdirectories and multiple files.<div class=""><br class=""></div><div class="">  Note: even if you don't have something completely working you can still make MR and list it as DRAFT request for comments, some other PETSc members who understand the packages you are using and Fortran better than I may be able to help as you develop the code.</div><div class=""><div class=""><br class=""></div><div class="">  Barry</div><div class=""><br class=""><div class=""><br class=""></div><div class=""><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Dec 16, 2020, at 12:35 AM, Thibault Bridel-Bertomeu <<a href="mailto:thibault.bridelbertomeu@gmail.com" target="_blank" class="">thibault.bridelbertomeu@gmail.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class=""><div class="">Hello everyone, <br class=""></div><div class=""><br class=""></div><div class="">Thank you Barry for the feedback.</div><div class="">OK, yes I'll work up an MR as soon as I have got something working. By the way, does the fortran-version of the example have to be a single file ? If my push contains a directory with several files (different modules and the main), and the Makefile that goes with it, is that ok ?</div><div class=""><br class=""></div><div class=""><div class=""><div dir="ltr" class=""><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</div></div></div></div></div></div></div></div></div></div></div><br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le mer. 16 déc. 2020 à 04:46, Barry Smith <<a href="mailto:bsmith@petsc.dev" target="_blank" class="">bsmith@petsc.dev</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"><div 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/" target="_blank" class="">https://docs.petsc.org/en/latest/developers/integration/</a><div class=""><br class=""></div><div class="">   Barry</div><div class=""><br class=""><div class=""><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" target="_blank" class="">thibault.bridelbertomeu@gmail.com</a>> wrote:</div><br class=""><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=""><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" target="_blank" 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="gmail-m_2866696447715203370gmail-m_1645657168228053713cid:f_kipwslzw0" class=""><wrapper_petsc.h90></span><span id="gmail-m_2866696447715203370gmail-m_1645657168228053713cid:f_kipwsm1a1" class=""><wrapper_petsc.c></span></div></blockquote></div><br class=""></div></div></blockquote></div>
</div></blockquote></div><br class=""></div></div></div></div></blockquote></div>
</div></blockquote></div><br class=""></div></body></html>