[petsc-users] TS tutorial ex11 in Fortran

Thibault Bridel-Bertomeu thibault.bridelbertomeu at gmail.com
Tue Dec 15 05:35:17 CST 2020


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 <jed at jedbrown.org> a écrit :

> Thibault Bridel-Bertomeu <thibault.bridelbertomeu at gmail.com> 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);
>   }
> }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20201215/c112968c/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: wrapper_petsc.h90
Type: application/octet-stream
Size: 887 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20201215/c112968c/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: wrapper_petsc.c
Type: text/x-csrc
Size: 6507 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20201215/c112968c/attachment.bin>


More information about the petsc-users mailing list