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). https://docs.petsc.org/en/latest/developers/integration/
Barry > On Dec 15, 2020, at 5:35 AM, Thibault Bridel-Bertomeu > <[email protected]> wrote: > > Hello everyone, > > 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. > > Thank you again for your help, I'll try to post updates of the F90 version of > ex11 regularly in this thread. > > Stay safe, > > Thibault Bridel-Bertomeu > > Le dim. 13 déc. 2020 à 16:39, Jed Brown <[email protected] > <mailto:[email protected]>> a écrit : > Thibault Bridel-Bertomeu <[email protected] > <mailto:[email protected]>> writes: > > > Thank you Mark for your answer. > > > > I am not sure what you think could be in the setBC1 routine ? How to make > > the connection with the PetscDS ? > > > > On the other hand, I actually found after a while TSMonitorSet has a > > fortran wrapper, and it does take as arguments two function pointers, so I > > guess it is possible ? Although I am not sure exactly how to play with the > > PetscObjectSetFortranCallback & PetscObjectUseFortranCallback macros - > > could anybody advise please ? > > 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. > > static struct { > PetscFortranCallbackId prestep; > PetscFortranCallbackId poststep; > PetscFortranCallbackId rhsfunction; > PetscFortranCallbackId rhsjacobian; > PetscFortranCallbackId ifunction; > PetscFortranCallbackId ijacobian; > PetscFortranCallbackId monitor; > PetscFortranCallbackId mondestroy; > PetscFortranCallbackId transform; > #if defined(PETSC_HAVE_F90_2PTR_ARG) > PetscFortranCallbackId function_pgiptr; > #endif > } _cb; > > /* > 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 > */ > static PetscErrorCode ourmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void *ctx) > { > PetscObjectUseFortranCallback(ts,_cb.monitor,(TS*,PetscInt*,PetscReal*,Vec > *,void*,PetscErrorCode*),(&ts,&i,&d,&v,_ctx,&ierr)); > } > > Then follow as in tsmonitorset_, which sets two callbacks. > > PETSC_EXTERN void tsmonitorset_(TS *ts,void > (*func)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*),void *mctx,void > (*d)(void*,PetscErrorCode*),PetscErrorCode *ierr) > { > CHKFORTRANNULLFUNCTION(d); > if ((PetscVoidFunction)func == (PetscVoidFunction) tsmonitordefault_) { > *ierr = TSMonitorSet(*ts,(PetscErrorCode > (*)(TS,PetscInt,PetscReal,Vec,void*))TSMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode > (*)(void **))PetscViewerAndFormatDestroy); > } else { > *ierr = > PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx); > *ierr = > PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)d,mctx); > *ierr = TSMonitorSet(*ts,ourmonitor,*ts,ourmonitordestroy); > } > } > <wrapper_petsc.h90><wrapper_petsc.c>
