Some callbacks are meant to persist beyond an XSetType() while others must be 
cleared when that is done. See the last line here.

PetscErrorCode PetscObjectChangeTypeName(PetscObject obj, const char 
type_name[])
{
  PetscFunctionBegin;
  PetscValidHeader(obj, 1);
  PetscCall(PetscFree(obj->type_name));
  PetscCall(PetscStrallocpy(type_name, &obj->type_name));
  /* Clear all the old subtype callbacks so they can't accidentally be called 
(shouldn't happen anyway) */
  
PetscCall(PetscArrayzero(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE], 
obj->num_fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE]));
  PetscFunctionReturn(PETSC_SUCCESS);
}


The implementation would be more complicated if they went in the same list 
because you'd have to distinguish class-scope reserved slots from subtype-scope 
free slots.

Barry Smith <[email protected]> writes:

> Jed,
>
>    How come you introduced this construct?
>
> typedef enum {
>   PETSC_FORTRAN_CALLBACK_CLASS,
>   PETSC_FORTRAN_CALLBACK_SUBTYPE,
>   PETSC_FORTRAN_CALLBACK_MAXTYPE
> } PetscFortranCallbackType;
>
> That is why are there two types of callbacks, they seem to be managed the 
> same way but go into two different lists in the object. I don't see why there 
> cannot just be one list they all go in?
>
> Thanks
>
>    Barry

Reply via email to