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); >
