[petsc-dev] Counting Fortran function pointers

Matthew Knepley knepley at gmail.com
Tue Dec 4 17:12:46 CST 2012


On Tue, Dec 4, 2012 at 3:10 PM, Peter Brune <prbrune at gmail.com> wrote:
> Is it possible that recent changes make this solution easier?  DMKSP/SNES/TS
> is now a PETSc object.  Should we be attaching context-appropriate pointers
> there so that they can be copied along with this context?
>
> There's also the last-ditch approach I took to having a SNESShell properly
> take an implementation-specific fortran pointer, which was to compose it
> with the object (yeah yeah string lookups)
>
> https://bitbucket.org/petsc/petsc-dev/src/d646bb69827f0fe12031068d40b072920e0212b4/src/snes/impls/shell/ftn-custom/zsnesshellf.c?at=default

I think all of these Fortran pointers should be string attached. We do
not need speed here, and it
is consistent, extensible, and no less safe than the crap in there now.

   Matt

> - Peter
>
> On Tue, 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.
>>
>> 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);
>
>



--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which
their experiments lead.
-- Norbert Wiener



More information about the petsc-dev mailing list