[petsc-users] TS tutorial ex11 in Fortran

Thibault Bridel-Bertomeu thibault.bridelbertomeu at gmail.com
Fri Dec 18 03:00:13 CST 2020


Hello Barry,

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 ?

Thibault


Le mer. 16 déc. 2020 à 07:47, Barry Smith <bsmith at petsc.dev> a écrit :

>
>   Thibault,
>
>   A subdirectory for the example is fine; we have other examples that use
> subdirectories and multiple files.
>
>   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.
>
>   Barry
>
>
>
>
> On Dec 16, 2020, at 12:35 AM, Thibault Bridel-Bertomeu <
> thibault.bridelbertomeu at gmail.com> wrote:
>
> 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/20201218/fe5be540/attachment.html>


More information about the petsc-users mailing list