<div dir="ltr">We currently use recursive includes everywhere, so petscdmda.h includes all of petscao.h just so it can declare DMDAGetAO and similar. Of course most users of (and implementation files in) DMDA do not reference AO so they don't need to know about all the AO functions.<div>
<br></div><div style>The normal approach to this is to forward-declare the type, so instead of</div><div style><br></div><div style>#include <petscao.h> /* includes lots of other stuff */</div><div style>PETSC_EXTERN PetscErrorCode DMDAGetAO(DM,AO*);<br>
</div><div style><br></div><div style>one would write</div><div style><br></div><div style>typedef struct _p_AO *AO;</div><div style>PETSC_EXTERN PetscErrorCode DMDAGetAO(DM,AO*);<br></div><div style><br></div><div style>
in which case all three files in PETSc that actually call AO routines would need to include petscao.h. That is arguably a good thing since it makes the actual dependencies more explicit, and is recommended by many (mostly C++) style guidelines.</div>
<div style><br></div><div style>Is this something worth considering? I think stuff like petscvec.h and petscmat.h ends up pretty much always being needed, but petscdm.h is only used by a handful of files in petscksp and above, for example.</div>
<div style><br></div><div style>It might be nice to get rarely-used stuff like petscdraw.h out of petscsys.h.</div></div>