On Sun, Nov 25, 2012 at 4:42 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
typedef struct _n_KSPDM *KSPDM;<br>
struct _n_KSPDM {<br>
  PetscErrorCode (*computeoperators)(KSP,Mat,Mat,MatStructure*,void*);<br>
  PetscErrorCode (*computerhs)(KSP,Vec,void*);<br>
  PetscErrorCode (*computeinitialguess)(KSP,Vec,void*);<br>
<br>
typedef struct _n_SNESDM *SNESDM;<br>
struct _n_SNESDM {<br>
  PetscErrorCode (*computefunction)(SNES,Vec,Vec,void*);<br>
  PetscErrorCode (*computegs)(SNES,Vec,Vec,void*);<br>
  PetscErrorCode (*computejacobian)(SNES,Vec,Mat*,Mat*,MatStructure*,void*);<br>
<br>
  /* objective */<br>
  PetscErrorCode (*computeobjective)(SNES,Vec,PetscReal*,void*);<br>
<br>
<br>
typedef struct _n_TSDM *TSDM;<br>
struct _n_TSDM {<br>
  TSRHSFunction rhsfunction;<br>
  TSRHSJacobian rhsjacobian;<br>
<br>
  TSIFunction ifunction;<br>
  TSIJacobian ijacobian;<br>
<br>
The PETSc style guide says  to avoid typedef of function pointers unless there is a damn good reason to use them (or it should);</blockquote><div><br></div><div>Can we revisit this choice in the interest of writing one man page that documents the assumptions that one can make about a callback routine? I hate duplicating the same information in TS{Set,Get}IFunction() and DMTS{Set,Get}IFunction(). Also, if a typedef is used everywhere, we can more reliably find all places that depend on it. (using grep or M-x gtags-find-symbol).</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> but why use them for TS but not for SNES or KSP functions?<br></blockquote><div><br></div><div>Because they were already defined for use with TSSetIFunction()/TSGetIFunction().</div>
</div></div>