El 11/09/2014, a las 00:32, Barry Smith escribió:

> 
>  Jose,
> 
>   Start by making PetscSplitReduction  an opaque pointer to the actual struct.
> 
>   For example 
> 
> typedef struct _n_PetscSplitReduction *PetscSplitReduction; 
> 
> goes in the public include  include/petscsys.h
> 
> typedef struct {
> -  MPI_Comm    comm;
> -  MPI_Request request;
> -  PetscBool   async;
> -  PetscScalar *lvalues;     /* this are the reduced values before call to 
> MPI_Allreduce() */
> -  PetscScalar *gvalues;     /* values after call to MPI_Allreduce() */
> -  void        **invecs;     /* for debugging only, vector/memory used with 
> each op */
> -  PetscInt    *reducetype;  /* is particular value to be summed or maxed? */
> -  SRState     state;        /* are we calling xxxBegin() or xxxEnd()? */
> -  PetscInt    maxops;       /* total amount of space we have for requests */
> -  PetscInt    numopsbegin;  /* number of requests that have been queued in */
> -  PetscInt    numopsend;    /* number of requests that have been gotten by 
> user */
> -} _n_PetscSplitReduction;
> 
> goes in the private include  include/petsc-private/petscimpl.h
> 
> Then you need to decide how to access the material inside the struct. 
> 
> 1) Do you want all PETSc users to be able to access stuff in the struct and 
> modify it or 
> 
> 2) Do you want a few places in SLEPc to take advantage of the 
> PetscSplitReduction abilities? 
> 
>  I am guessing you want 2) in that case just have your SLEPc code include the 
> petscimpl.h and access the structure directly. This is what we do in, for 
> example VecDotBegin() etc 

Thanks for the explanation.
Yes, I want 2)
If I am going to include petscimpl.h then there is no need to define a public 
opaque pointer, just put the necessary definitions in petscimpl.h, right? There 
will be no public functions after all.

> 
>  If you want 1) then you have a lot of work ahead of you because you need to 
> abstract all the operations you want to do on PetscSplitReduction and provide 
> methods to do those operations and then call those operations from SLEPc. 

I think I would only need the three functions I put in the commit, plus the 
REDUCE_SUM REDUCE_MAX REDUCE_MIN defines. But anyway, it is easier to put them 
in petscimpl.h.

> 
>  Basically your “Jed sin” (which is far worse than a cardinal sin) was 
> putting this private data structure directly in the public interface of 
> PETSc, i.e. in petscsys.h

Next time I will avoid committing a Jed sin by not making a commit myself.

Jose

> 
>  Barry

Reply via email to