Hello everyone, Thank you Barry for the feedback. 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 ?
Thibault Bridel-Bertomeu Le mer. 16 déc. 2020 à 04:46, Barry Smith <[email protected]> a écrit : > > 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]> a écrit : > >> Thibault Bridel-Bertomeu <[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> > > >
