[petsc-dev] PetscHMapI passing

Matthew Knepley knepley at gmail.com
Tue Nov 28 16:52:28 CST 2023


On Tue, Nov 28, 2023 at 5:23 PM Brandon Denton <bldenton at buffalo.edu> wrote:

> Good Afternoon,
>
> Ok. I think I've developed a solution that meets everyone's interest.
> Please review the below and let me know if you have any questions or
> comments.
>
> Quick background. The objective of this function is to provide user
> friendly access to geometric data associated with a DMPlex with a geometry
> CAD model attached. This function will replace the originally conceived
> PetscObjectQuery() method.
>

Yes, that is a good start. We might eventually want an object, but this is
great to experiment with. I like it.

  Thanks,

    Matt


> *Proposed Function Signature:*
> DMPlexGetGeomCntrlPntAndWeightData(DM dm, PetscHMapI *cpHashTable,
> PetscInt *cpCoordDataLength, PetscScalar **cpCoordData, PetscInt
> *maxNumEquiv, Mat *cpEquiv, PetscHMapI *wHashTable, PetscInt *wDataLength,
> PetscScalar **wData)
>
> The only input it the DM. All others are outputs.
>
> *Proposed Call*
>   PetscScalar    *cpCoordData, *wData;
>     PetscInt              cpCoordDataLength, wDataLength, maxNumEquiv;
>     PetscHMapI     cpHashTable, wHashTable;
>     Mat                       cpEquiv;
>
> PetscCall(DMPlexGetGeomCntrlPntAndWeightData(dmNozzle, &cpHashTable,
> &cpCoordDataLength, &cpCoordData, &maxNumEquiv, &cpEquiv, &wHashTable,
> &wDataLength, &wData));
>
> *Proposed Function Added to plexegads.c*
> DMPlexGetGeomCntrlPntAndWeightData(DM dm, PetscHMapI *cpHashTable,
> PetscInt *cpCoordDataLength, PetscScalar **cpCoordData, PetscInt
> *maxNumEquiv, Mat *cpEquiv, PetscHMapI *wHashTable, PetscInt *wDataLength,
> PetscScalar **wData)
> {
>   PetscFunctionBeginHot;
> #ifdef PETSC_HAVE_EGADS
>   PetscContainer  modelObj, cpHashTableObj, wHashTableObj, cpCoordDataObj,
> wDataObj, cpCoordDataLengthObj, wDataLengthObj, cpEquivObj, maxNumRelateObj;
>   PetscInt       *cpCoordDataLengthPtr, *wDataLengthPtr, *maxNumEquivPtr;
>   PetscHMapI      cpHashTableTemp, wHashTableTemp;
>   PetscScalar    *cpCoordDataTemp, *wDataTemp;
>   Mat             cpEquivTemp;
>
>   /* Determine which type of EGADS model is attached to the DM */
>   PetscCall(PetscObjectQuery((PetscObject) dm, "EGADS Model", (PetscObject
> *) &modelObj));
>   if (!modelObj) {
>     PetscCall(PetscObjectQuery((PetscObject) dm, "EGADSlite Model",
> (PetscObject *) &modelObj));
>   }
>
>   if (!modelObj) {PetscFunctionReturn(PETSC_SUCCESS);}
>
>   // Look to see if DM has Container for Geometry Control Point Data
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Hash Table",
> (PetscObject *)&cpHashTableObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Coordinates",
> (PetscObject *)&cpCoordDataObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Coordinate
> Data Length", (PetscObject *)&cpCoordDataLengthObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Weights Hash
> Table", (PetscObject *)&wHashTableObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Weight Data",
> (PetscObject *)&wDataObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Weight Data
> Length", (PetscObject *)&wDataLengthObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Control Point Equivalancy
> Matrix", (PetscObject *)&cpEquivObj));
>   PetscCall(PetscObjectQuery((PetscObject)dm, "Maximum Number Control
> Point Equivalency", (PetscObject *)&maxNumRelateObj));
>
>   // Get attached EGADS model Control Point and Weights Hash Tables and
> Data Arrays (pointer)
>   PetscCall(PetscContainerGetPointer(cpHashTableObj, (void
> **)&cpHashTableTemp));
>   PetscCall(PetscContainerGetPointer(cpCoordDataObj, (void
> **)&cpCoordDataTemp));
>   PetscCall(PetscContainerGetPointer(cpCoordDataLengthObj, (void
> **)&cpCoordDataLengthPtr));
>   PetscCall(PetscContainerGetPointer(wHashTableObj, (void
> **)&wHashTableTemp));
>   PetscCall(PetscContainerGetPointer(wDataObj, (void **)&wDataTemp));
>   PetscCall(PetscContainerGetPointer(wDataLengthObj, (void
> **)&wDataLengthPtr));
>   PetscCall(PetscContainerGetPointer(cpEquivObj, (void **)&cpEquivTemp));
>   PetscCall(PetscContainerGetPointer(maxNumRelateObj, (void
> **)&maxNumEquivPtr));
>
>   *cpCoordDataLength = *cpCoordDataLengthPtr;
>   *wDataLength = *wDataLengthPtr;
>   *maxNumEquiv = *maxNumEquivPtr;
>   *cpEquiv = cpEquivTemp;
>   *cpHashTable = cpHashTableTemp;
>   *wHashTable = wHashTableTemp;
>   *cpCoordData = cpCoordDataTemp;
>   *wData = wDataTemp;
>   #endif
>
>   PetscFunctionReturn(PETSC_SUCCESS);
> }
>
> ------------------------------
> *From:* Matthew Knepley <knepley at gmail.com>
> *Sent:* Tuesday, November 28, 2023 1:26 PM
> *To:* Barry Smith <bsmith at petsc.dev>
> *Cc:* Brandon Denton <bldenton at buffalo.edu>; petsc-dev at mcs.anl.gov <
> petsc-dev at mcs.anl.gov>
> *Subject:* Re: [petsc-dev] PetscHMapI passing
>
> On Mon, Nov 27, 2023 at 1:00 PM Barry Smith <bsmith at petsc.dev> wrote:
>
>
>   What errors do you get?
>
> I am trying to develop a function where the user can specify an empty
> PetscHMapI variable and the function will retrieve the information attached
> to the DMPlex. However, when I try something like ...
>
> PETSC_EXTERN PetscErrorCode DMPlexGetGeomInfo(DM dm, PetscHMapI hashTable)
>
>
>   I don't understand the design of specifying and empty one. Why not have
>
> PETSC_EXTERN PetscErrorCode DMPlexGetGeomInfo(DM dm, PetscHMapI
> *hashTable)
>
> and return the one you have inside your container?
>
>
> This sounds like the right design. Does that work?
>
>   Thanks,
>
>     Matt
>
>
> On Nov 27, 2023, at 9:11 AM, Brandon Denton via petsc-dev <
> petsc-dev at mcs.anl.gov> wrote:
>
> Good Morning,
>
> I am trying to develop a function in PETSc that allows for the
> retrieval of a PetscHMapI contained in a PetscContainer attached to a
> DMPlex. The creation of this Hash Table and its attachment to the DMPlex is
> automated as part of the CAD/Discretization integration I've been
> developing. Currently, the only way to get this Hash Table is through the
> PetscObjectQuery() functionality. In an effort to make it easier for users
> to access and use this information, I am trying to develop a function where
> the user can specify an empty PetscHMapI variable and the function will
> retrieve the information attached to the DMPlex. However, when I try
> something like ...
>
> PETSC_EXTERN PetscErrorCode DMPlexGetGeomInfo(DM dm, PetscHMapI hashTable)
>
> I get a ton of compilation errors associated with the PetscHMapI
> designation. Is there a way around this?
>
> Thank you.
> Brandon
>
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/
> <http://www.cse.buffalo.edu/~knepley/>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener

https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20231128/c8085128/attachment-0001.html>


More information about the petsc-dev mailing list