[petsc-dev] PetscSF in Fortran

Adrian Croucher a.croucher at auckland.ac.nz
Thu Oct 12 23:25:00 CDT 2017


hi Jed

I have had a go at writing a Fortran binding for the PetscSFGetGraph() 
function, along the lines of what you suggested:

> On 21/09/17 15:15, Jed Brown wrote:
> Unfortunately PetscSFSetGraph/PetscSFGetGraph need custom bindings for
> Fortran and they have not been written.  Shouldn't be difficult, but
> will take a little work/testing.  I would probably make the array of
> PetscSFNode be a PetscInt array of length 2n (or of shape (2,n)) --
> that's an equivalent memory representation to what we're using now. 

 From looking at various other existing custom Fortran bindings that 
return arrays, I tried the following:


PETSC_EXTERN void PETSC_STDCALL petscsfgetgraph_(PetscSF *sf, PetscInt 
*nroots, PetscInt *nleaves, F90Array1d *lptr, F90Array2d *rptr, int 
*ierr PETSC_F90_2PTR_PROTO(lptrd) PETSC_F90_2PTR_PROTO(rptrd))
{
   const PetscInt *ilocal;
   const PetscSFNode *iremote;

   *ierr = PetscSFGetGraph(*sf, nroots, nleaves, &ilocal, &iremote); if 
(*ierr) return;

   *ierr = F90Array1dCreate((void*) ilocal, PETSC_INT, 1, *nleaves, lptr 
PETSC_F90_2PTR_PARAM(lptrd));
   *ierr = F90Array2dCreate((void*) iremote, PETSC_INT, 1, 2, 1, 
*nleaves, rptr PETSC_F90_2PTR_PARAM(rptrd));
}

I put this in a new file zsff90.c, in a new directory 
/vec/is/sf/interface/f90-custom/, together with an appropriate makefile.

However it crashes with a segmentation violation in the call to 
F90Array1dCreate(), when that goes into the Fortran routine 
F90Array1dCreateInt() and tries to assign the pointer.

In my test calling program I declare the arrays for ilocal and iremote 
as PetscInt, pointer :: ilocal(:), iremote(:,:) and pass them in.

Any clues? I have tried various variations on the above but I suspect 
I've either made some basic mistake or I just don't understand how this 
should be done.

- Adrian

On 28/09/17 15:34, Adrian Croucher wrote:
>
> hi
>
> On 28/09/17 04:18, Matthew Knepley wrote:
>>
>> Okay, I think this should be easy to solve.
>>
>> First a little bit about SF. There are two parts to the 
>> specification. You have the communication part, which maps
>> a certain location p on this process to another location q on another 
>> process. This might not change for you. The
>> second part just tells it how big the data array is (numRoots), which 
>> is the thing that the locations in the communication
>> part index into.
>>
>> So my question is, where did you put the numbers for the points you 
>> added? Are they after all points, or only after the old cells?
>> I think you can easily create the new SF using the info from 
>> SFGetGraph().
>
> I've had a closer look at how the SF stuff works (partly by viewing 
> the point SF from the original DM) and I think I understand it now. 
> There were two things I hadn't realised:
>
> 1) It looks like all DM points are always considered potential roots 
> for leaves on another process, which is why it complained with an 
> error message when the number of roots was less than pEnd . I don't 
> think this really makes so much sense in the dual-porosity mesh case 
> I'm working on, because the new points I'm adding are all 'inside' the 
> original cells and have no possible connection with any other points. 
> So they can't be roots for any off-process leaf points. But I guess it 
> won't hurt to tell it that they can (by increasing the number of roots 
> passed to PetscSFSetGraph so it's equal to the new pEnd).
>
> 2) Because I'm doing finite volume I had only thought about ghost 
> cells, but the SF needs to include leaf points in other height strata 
> as well (vertices, edges and faces). My new points in each stratum 
> have been added after the partition ghost points, so the leaf cells 
> won't have changed their point indices. However the leaf points in 
> other strata will have been shifted (because of points added into 
> preceding strata).
>
>
> So I think I will need to use PetscSFSetGraph() after all, so I can 
> increase the number of roots, update the leaf point indices, and also 
> update the remote root index for each leaf (presumably I can use the 
> original SF and PetscSFBcastBegin/ PetscSFBcastEnd to do that).
>
> If you agree, then I will need working Fortran interfaces to the 
> PetscSFGetGraph/ PetscSFSetGraph functions, which are missing at 
> present. Are you able to add those easily?
>
> Thanks,
> Adrian 

-- 
Dr Adrian Croucher
Senior Research Fellow
Department of Engineering Science
University of Auckland, New Zealand
email: a.croucher at auckland.ac.nz
tel: +64 (0)9 923 4611

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20171013/8017437e/attachment-0001.html>


More information about the petsc-dev mailing list