I think originally PetscBag was this small lightweight thing that was not 
"worthy" of being a full fledged object. 

    It will be slightly tricky (or at least nonstandard) to make PetscBag a 
PETSc object because of 

 ierr = PetscMalloc(bagsize+sizeof(struct 
_n_PetscBag)+sizeof(PetscScalar),bag);CHKERRQ(ierr);
  ierr = PetscMemzero(*bag,bagsize+sizeof(struct 
_n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr);
  (*bag)->bagsize        = bagsize+sizeof(struct 
_n_PetscBag)+sizeof(PetscScalar);
  (*bag)->bagcomm        = comm;
  (*bag)->structlocation = (void*)(((char*)(*bag)) + 
sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + 
sizeof(PetscScalar));

while for PETSc objects

PetscErrorCode  PetscObjectCreate(MPI_Comm comm, PetscObject *obj)
{
  GenericObject  o;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  PetscValidPointer(obj,2);
#if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
  ierr = PetscSysInitializePackage(PETSC_NULL);CHKERRQ(ierr);
#endif
  ierr = 
PetscHeaderCreate(o,_p_GenericObject,-1,PETSC_OBJECT_CLASSID,0,"PetscObject",comm,PetscObjectDestroy_GenericObject,0);CHKERRQ(ierr);

#define PetscHeaderCreate(h,tp,pops,cook,t,class_name,com,des,vie)      \
  (PetscNew(struct tp,&(h)) ||                                          \
   PetscNew(PetscOps,&(((PetscObject)(h))->bops)) ||                    \
   PetscNew(pops,&((h)->ops)) ||                                        \
   
PetscHeaderCreate_Private((PetscObject)h,cook,t,class_name,com,(PetscObjectFunction)des,(PetscObjectViewerFunction)vie)
 || \
   PetscLogObjectCreate(h) ||                                           \
   PetscLogObjectMemory(h, sizeof(struct tp) + sizeof(PetscOps) + sizeof(pops)))

The "size" of the malloced space is funky in the PetscBag case so you cannot 
directly do the PetscHeaderCreate() to create the PetscBag.
 
At this time I vote that you add the PetscBagSetOptionsPrefix() directly for 
Bags and do not turn the Bag into a real PetscObject.

   Barry

On Apr 8, 2011, at 12:29 PM, Ethan Coon wrote:

> 
> I'm using a couple of bags in an application, and that application is in
> turn being used in a domain-decomposition algorithm with multiple
> domains (each an instance of the application).  So I'd like to set the
> options prefix of the bag, so that each application instance has its own
> prefix and can be used with the same options "database."  Currently
> PetscBag passes PETSC_NULL for the prefix.
> 
> To fix this, it looks like the best option would be to have a
> PetscBagSetOptionsPrefix() in the same mold as everything else.  I added
> this, and then found out that PetscBag isn't a PetscObject, in the sense
> that it has no header or CLASS_ID (so PetscObjectSetOptionsPrefix()
> doesn't work on a bag).
> 
> Is this the best way forward, to make PetscBag a PetscObject, with
> CLASS_ID, etc?  And if so, is there a good example of this that I should
> follow to do so?
> 
> Thanks,
> 
> Ethan
> 
> 
> 
> 
> -- 
> ------------------------------------
> Ethan Coon
> Post-Doctoral Researcher
> Applied Mathematics - T-5
> Los Alamos National Laboratory
> 505-665-8289
> 
> http://www.ldeo.columbia.edu/~ecoon/
> ------------------------------------
> 


Reply via email to