Brandon Denton <blden...@buffalo.edu> writes: > Good Morning, > > For the past few years, I have been working to integrate CAD into PETSc. > Over this time, I've worked with Dr. Knepley to enable PETSc to open and > utilize STEP, IGES, EGADS and EGADSlite files. We've also worked to expose > the geometry's parameters (Control Points, Weights) as well as their > gradients for direct manipulation through PETSc allowing numerical > optimization of the geometry underpinning the domain's discretization > (mesh). > > I'm currently trying to make this functionality usable through PETSc only > functions (wrapper functions) so users don't have to learn the underlying > CAD library. To achieve this, I need to do the following things in PETSc. > > 1. Create a new PETSc object which is typedef of the underlying > library's object. Where/what file should I include this typedef? > - I currently defined it in the petscsystypes.h with the following > code. > > #if defined(PETSC_HAVE_EGADS) > > #include <egads.h> > > #include <egads_lite.h> > > typedef ego PetscGeom; > > #endif
I think there should be a new header petscgeom.h or petscdmgeom.h for these features, and corresponding include/petsc/private/dmgeomimpl.h. There should be a struct containing the handle in the private header and only a "pointer to incomplete type" typedef (as with all the PETSc objects) in the public header. > - This appears to work but I know it is not a final solution because on > updating PETSc I get warnings saying that a few defined variables are being > redefined by other header files. How do I properly incorporate this into > PETSc as part of an optional capability? > > 2. Create wrapper functions where I need to return information back to the > main code? I currently have defined the wrapper function signatures in > plexdmplex.h as: > > > - PETSC_EXTERN PetscErrorCode DMPlexGetGeomModelBodies(DM, PetscGeom *, > PetscInt); // EGADS > > In my main code, I use the following. After completion, I would > like DMPlexGetGeomModelBodies() to return the PetscGeom object which is > usually an array of 'ego' objects and the number of objects in the array of > the 'ego' objects. > > PetscGeom *newBodies = NULL; > > PetscInt numBodies = 0; > > PetscCall(DMPlexGetGeomModelBodies(dmNozzle, &newBodies, numBodies)); > > PetscCall(PetscPrintf(PETSC_COMM_SELF, " Nb = %d || numBodies = %d > \n", Nb, numBodies)); > > > I'm fairly certain I'm getting tripped up on how to properly pass these > objects between my main code and the new PETSc functions I'm trying to > develop. Any assistance/direction/insights you could provide is greatly > appreciated. I'd suggest making a draft merge request so you can ask questions in the context of the code. From the code snippet, you're missing stars on the output args (they need to accept a pointer to the thing, not the output thing itself).