On Dec 5, 2012, at 2:19 AM, Jed Brown <jedbrown at mcs.anl.gov> wrote:

> 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.

   It's crap and centralizes all the fortran interfaces for all the fortran 
objects, totally unnecessary.

   I know you are living for the day when you can implement a "fast" registered 
equivalent to PetscObjectCompose() (like MPI attributes are allegedly fast) but 
I am not going to let you :-(; the compose functionality is suppose to be for 
unexpected non-often events, anything that is in the main code flow is suppose 
to be done some other way.

   Barry



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

Reply via email to