[petsc-dev] Counting Fortran function pointers

Jed Brown jedbrown at mcs.anl.gov
Wed Dec 5 02:19:28 CST 2012


So the choice is

1. Do the enum, which is a dirty hack, but much less fragile than the
current code. It has a bad dependency and will always be a mild pain in the
ass, but at least code using it shouldn't be buggy.

2. Do registration which is reliable and extensible without any bad
dependencies, but is extra initialization.


On Tue, Dec 4, 2012 at 9:32 PM, Jed Brown <jedbrown at mcs.anl.gov> wrote:

> You understand this just fine. ;-)
>
> The dmdasnes, dmdats, etc depends on DM, not vice-versa. But if you have
> an enum for DM, then DM contains knowledge about users of DM, and you have
> to modify DM when something outside needs it.
>
> Note that this also sucks if we have users implementing DM in their own
> codes.
> On Dec 4, 2012 8:29 PM, "Barry Smith" <bsmith at mcs.anl.gov> wrote:
>
>>
>> On Dec 4, 2012, at 10:22 PM, Jed Brown <jedbrown at mcs.anl.gov> wrote:
>>
>> > That is what I implemented for TS. The problem is false dependency in
>> the sense that the enum includes extra stuff. For example, DM function
>> pointers are needed by dmdasnes.
>>
>>    I don't understand this.
>>
>> > With dynamic keys, we could avoid that spurious dependency.
>>
>>    Not worth the extra initialization code.
>> >
>> > On Dec 4, 2012 8:14 PM, "Barry Smith" <bsmith at mcs.anl.gov> wrote:
>> >
>> > On Dec 4, 2012, at 4:43 PM, Jed Brown <jedbrown at mcs.anl.gov> wrote:
>> >
>> > > As usual, anything that is duplicated and not checked by the compiler
>> is broken.
>> > >
>> > > $ grep PetscObjectAllocateFortranPointers src/**/*.c
>> > > src/dm/impls/da/ftn-custom/zda2f.c:
>>  PetscObjectAllocateFortranPointers(*da,6);
>> > > src/dm/impls/da/ftn-custom/zda2f.c:
>>  PetscObjectAllocateFortranPointers(*da,6);
>> > > src/dm/impls/shell/ftn-custom/zdmshellf.c:
>>  PetscObjectAllocateFortranPointers(*dm,2);
>> > > src/dm/impls/shell/ftn-custom/zdmshellf.c:
>>  PetscObjectAllocateFortranPointers(*dm,2);
>> > >
>> > > Note that changing the type does not reset the function pointers,
>> thus having a DMSHELL, calling DMSetType(dm,DMDA), and then setting a DMDA
>> local function will cause memory corruption.
>> >
>> > > I cannot express how much I hate this system. The full-blown solution
>> is that for each type, we register a (global) token which is the index of
>> that function pointer. That doesn't have any false dependencies, but is
>> more "initialize" code.
>> > >
>> > > An alternative, used in the TS and KSP code below, is to have a
>> common enum that lists all the Fortran functions. It's a false header
>> dependency, but not a binary dependency.
>> > > What should we do? The current state is a disaster.
>> >
>> >
>> >    Each object gets an enum for each fortran implementable method in
>> that object, names of the enums reflect the object and method name. The
>> final enum for each object is the count of the number of the enums and is
>> used in the AllocationFortranPointers.  Yes, some brain numbing work to set
>> up initially but then pretty clean and extensible for the future (since the
>> final enum is the count we don't have to worry about always fixing the
>> count in the AllocateFunctionPointers() each time a new method is added).
>> >
>> >    Barry
>> >
>> > >
>> > > src/ksp/ksp/impls/gmres/fgmres/ftn-custom/zmodpcff.c:
>>  PetscObjectAllocateFortranPointers(*ksp,3);
>> > > src/ksp/ksp/interface/ftn-custom/zitfuncf.c:
>>  PetscObjectAllocateFortranPointers(*ksp,FTN_MAX);
>> > > src/ksp/ksp/interface/ftn-custom/zitfuncf.c:
>>  PetscObjectAllocateFortranPointers(*ksp,FTN_MAX);
>> > > src/ksp/pc/impls/mg/ftn-custom/zmgfuncf.c:
>>  PetscObjectAllocateFortranPointers(*mat,1);
>> > > src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c:
>>  PetscObjectAllocateFortranPointers(*pc,5);
>> > > src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c:
>>  PetscObjectAllocateFortranPointers(*pc,5);
>> > > src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c:
>>  PetscObjectAllocateFortranPointers(*pc,5);
>> > > src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c:
>>  PetscObjectAllocateFortranPointers(*pc,5);
>> > > src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c:
>>  PetscObjectAllocateFortranPointers(*pc,5);
>> > > src/mat/impls/mffd/ftn-custom/zmffdf.c:
>>  PetscObjectAllocateFortranPointers(*mat,2);
>> > > src/mat/impls/shell/ftn-custom/zshellf.c:
>>  PetscObjectAllocateFortranPointers(*mat,11);
>> > > src/mat/interface/ftn-custom/zmatrixf.c:
>>  PetscObjectAllocateFortranPointers(*sp,1);
>> > > src/snes/interface/ftn-custom/zsnesf.c:
>>  PetscObjectAllocateFortranPointers(*snes,14);
>> > > src/snes/interface/ftn-custom/zsnesf.c:
>>  PetscObjectAllocateFortranPointers(*snes,14);
>> > > src/snes/interface/ftn-custom/zsnesf.c:
>>  PetscObjectAllocateFortranPointers(*snes,14);
>> > > src/snes/interface/ftn-custom/zsnesf.c:
>>  PetscObjectAllocateFortranPointers(*snes,14);
>> > > src/snes/interface/ftn-custom/zsnesf.c:
>>  PetscObjectAllocateFortranPointers(*snes,14);
>> > > src/snes/linesearch/impls/shell/ftn-custom/zlinesearchshellf.c:
>>  PetscObjectAllocateFortranPointers(*linesearch,3);
>> > > src/snes/linesearch/interface/ftn-custom/zlinesearchf.c:
>>  PetscObjectAllocateFortranPointers(*linesearch,3);
>> > > src/snes/linesearch/interface/ftn-custom/zlinesearchf.c:
>>  PetscObjectAllocateFortranPointers(*linesearch,3);
>> > > src/sys/draw/utils/ftn-custom/zzoomf.c:
>>  PetscObjectAllocateFortranPointers(*draw,1);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> > > src/ts/interface/ftn-custom/ztsf.c:
>>  PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
>> >
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20121205/501d26fc/attachment.html>


More information about the petsc-dev mailing list