[petsc-users] TS tutorial ex11 in Fortran

Thibault Bridel-Bertomeu thibault.bridelbertomeu at gmail.com
Wed Dec 16 00:35:53 CST 2020


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 <bsmith at petsc.dev> 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 <
> thibault.bridelbertomeu at gmail.com> 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 <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);
>>   }
>> }
>>
> <wrapper_petsc.h90><wrapper_petsc.c>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20201216/dc352c85/attachment-0001.html>


More information about the petsc-users mailing list